⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdc_request.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 4 页
字号:
                        if (rc > 0)                                rc = -rc;                } else if (mod == NULL) {                        CERROR("Unexpected: can't find mdc_open_data, but the "                               "close succeeded.  Please tell CFS.\n");                }                if (!lustre_swab_repbuf(req, REPLY_REC_OFF,                                        sizeof(struct mds_body),                                        lustre_swab_mds_body)) {                        CERROR("Error unpacking mds_body\n");                        rc = -EPROTO;                }        }        EXIT;        *request = req; out:        if (rc != 0 && req && req->rq_commit_cb)                req->rq_commit_cb(req);        return rc;}int mdc_done_writing(struct obd_export *exp, struct obdo *obdo){        struct ptlrpc_request *req;        struct mds_body *body;        int rc, size[2] = { sizeof(struct ptlrpc_body), sizeof(*body) };        ENTRY;        req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_MDS_VERSION,                              MDS_DONE_WRITING, 2, size, NULL);        if (req == NULL)                RETURN(-ENOMEM);        body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));        mdc_pack_fid(&body->fid1, obdo->o_id, 0, obdo->o_mode);        body->size = obdo->o_size;        body->blocks = obdo->o_blocks;        body->flags = obdo->o_flags;        body->valid = obdo->o_valid;//        memcpy(&body->handle, &och->och_fh, sizeof(body->handle));        ptlrpc_req_set_repsize(req, 2, size);        rc = ptlrpc_queue_wait(req);        ptlrpc_req_finished(req);        RETURN(rc);}int mdc_readpage(struct obd_export *exp, struct ll_fid *fid, __u64 offset,                 struct page *page, struct ptlrpc_request **request){        struct obd_import *imp = class_exp2cliimp(exp);        struct ptlrpc_request *req = NULL;        struct ptlrpc_bulk_desc *desc = NULL;        struct mds_body *body;        int rc, size[2] = { sizeof(struct ptlrpc_body), sizeof(*body) };        ENTRY;        CDEBUG(D_INODE, "inode: "LPU64"\n", fid->id);        req = ptlrpc_prep_req(imp, LUSTRE_MDS_VERSION, MDS_READPAGE, 2, size,                              NULL);        if (req == NULL)                GOTO(out, rc = -ENOMEM);        req->rq_request_portal = MDS_READPAGE_PORTAL;        ptlrpc_at_set_req_timeout(req);        desc = ptlrpc_prep_bulk_imp(req, 1, BULK_PUT_SINK, MDS_BULK_PORTAL);        if (desc == NULL)                GOTO(out, rc = -ENOMEM);        /* NB req now owns desc and will free it when it gets freed */        ptlrpc_prep_bulk_page(desc, page, 0, CFS_PAGE_SIZE);        mdc_readdir_pack(req, REQ_REC_OFF, offset, CFS_PAGE_SIZE, fid);        ptlrpc_req_set_repsize(req, 2, size);        rc = ptlrpc_queue_wait(req);        if (rc == 0) {                body = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(*body),                                          lustre_swab_mds_body);                if (body == NULL) {                        CERROR("Can't unpack mds_body\n");                        GOTO(out, rc = -EPROTO);                }                if (req->rq_bulk->bd_nob_transferred != CFS_PAGE_SIZE) {                        CERROR ("Unexpected # bytes transferred: %d"                                " (%lu expected)\n",                                req->rq_bulk->bd_nob_transferred,                                CFS_PAGE_SIZE);                        GOTO (out, rc = -EPROTO);                }        }        EXIT; out:        *request = req;        return rc;}static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,                         void *karg, void *uarg){        struct obd_device *obd = exp->exp_obd;        struct obd_ioctl_data *data = karg;        struct obd_import *imp = obd->u.cli.cl_import;        struct llog_ctxt *ctxt;        int rc;        ENTRY;#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))        MOD_INC_USE_COUNT;#else        if (!try_module_get(THIS_MODULE)) {                CERROR("Can't get module. Is it alive?");                return -EINVAL;        }#endif        switch (cmd) {        case OBD_IOC_CLIENT_RECOVER:                rc = ptlrpc_recover_import(imp, data->ioc_inlbuf1);                if (rc < 0)                        GOTO(out, rc);                GOTO(out, rc = 0);        case IOC_OSC_SET_ACTIVE:                rc = ptlrpc_set_import_active(imp, data->ioc_offset);                GOTO(out, rc);        case OBD_IOC_PARSE: {                ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT);                rc = class_config_parse_llog(ctxt, data->ioc_inlbuf1, NULL);                llog_ctxt_put(ctxt);                GOTO(out, rc);        }#ifdef __KERNEL__        case OBD_IOC_LLOG_INFO:        case OBD_IOC_LLOG_PRINT: {                ctxt = llog_get_context(obd, LLOG_CONFIG_REPL_CTXT);                rc = llog_ioctl(ctxt, cmd, data);                llog_ctxt_put(ctxt);                GOTO(out, rc);        }#endif        case OBD_IOC_POLL_QUOTACHECK:                rc = lquota_poll_check(quota_interface, exp,                                       (struct if_quotacheck *)karg);                GOTO(out, rc);        default:                CERROR("mdc_ioctl(): unrecognised ioctl %#x\n", cmd);                GOTO(out, rc = -ENOTTY);        }out:#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))        MOD_DEC_USE_COUNT;#else        module_put(THIS_MODULE);#endif        return rc;}int mdc_set_info_async(struct obd_export *exp, obd_count keylen,                       void *key, obd_count vallen, void *val,                       struct ptlrpc_request_set *set){        struct obd_import *imp = class_exp2cliimp(exp);        int rc = -EINVAL;        if (KEY_IS(KEY_INIT_RECOV)) {                if (vallen != sizeof(int))                        RETURN(-EINVAL);                spin_lock(&imp->imp_lock);                imp->imp_initial_recov = *(int *)val;                spin_unlock(&imp->imp_lock);                CDEBUG(D_HA, "%s: set imp_initial_recov = %d\n",                       exp->exp_obd->obd_name, imp->imp_initial_recov);                RETURN(0);        }        /* Turn off initial_recov after we try all backup servers once */        if (KEY_IS(KEY_INIT_RECOV_BACKUP)) {                if (vallen != sizeof(int))                        RETURN(-EINVAL);                spin_lock(&imp->imp_lock);                imp->imp_initial_recov_bk = *(int *)val;                if (imp->imp_initial_recov_bk)                        imp->imp_initial_recov = 1;                spin_unlock(&imp->imp_lock);                CDEBUG(D_HA, "%s: set imp_initial_recov_bk = %d\n",                       exp->exp_obd->obd_name, imp->imp_initial_recov_bk);                RETURN(0);        }        if (KEY_IS("read-only")) {                struct ptlrpc_request *req;                int size[3] = { sizeof(struct ptlrpc_body), keylen, vallen };                char *bufs[3] = { NULL, key, val };                if (vallen != sizeof(int))                        RETURN(-EINVAL);                if (*((int *)val)) {                        imp->imp_connect_flags_orig |= OBD_CONNECT_RDONLY;                        imp->imp_connect_data.ocd_connect_flags |=                                OBD_CONNECT_RDONLY;                } else {                        imp->imp_connect_flags_orig &= ~OBD_CONNECT_RDONLY;                        imp->imp_connect_data.ocd_connect_flags &=                                ~OBD_CONNECT_RDONLY;                }                req = ptlrpc_prep_req(imp, LUSTRE_MDS_VERSION, MDS_SET_INFO,                                      3, size, bufs);                if (req == NULL)                        RETURN(-ENOMEM);                ptlrpc_req_set_repsize(req, 1, NULL);                if (set) {                        rc = 0;                        ptlrpc_set_add_req(set, req);                        ptlrpc_check_set(set);                } else {                        rc = ptlrpc_queue_wait(req);                        ptlrpc_req_finished(req);                }                RETURN(rc);        }        RETURN(rc);}int mdc_get_info(struct obd_export *exp, __u32 keylen, void *key,                 __u32 *vallen, void *val){        int rc = -EINVAL;        if (keylen == strlen("max_easize") &&            memcmp(key, "max_easize", strlen("max_easize")) == 0) {                int mdsize, *max_easize;                if (*vallen != sizeof(int))                        RETURN(-EINVAL);                mdsize = *(int*)val;                if (mdsize > exp->exp_obd->u.cli.cl_max_mds_easize)                        exp->exp_obd->u.cli.cl_max_mds_easize = mdsize;                max_easize = val;                *max_easize = exp->exp_obd->u.cli.cl_max_mds_easize;                RETURN(0);        }        RETURN(rc);}static int mdc_statfs(struct obd_device *obd, struct obd_statfs *osfs,                      __u64 max_age, __u32 flags){        struct ptlrpc_request *req;        struct obd_statfs *msfs;        int rc, size[2] = { sizeof(struct ptlrpc_body), sizeof(*msfs) };        ENTRY;        /* We could possibly pass max_age in the request (as an absolute         * timestamp or a "seconds.usec ago") so the target can avoid doing         * extra calls into the filesystem if that isn't necessary (e.g.         * during mount that would help a bit).  Having relative timestamps         * is not so great if request processing is slow, while absolute         * timestamps are not ideal because they need time synchronization. */        req = ptlrpc_prep_req(obd->u.cli.cl_import, LUSTRE_MDS_VERSION,                              MDS_STATFS, 1, NULL, NULL);        if (!req)                RETURN(-ENOMEM);        ptlrpc_req_set_repsize(req, 2, size);        if (flags & OBD_STATFS_NODELAY) {                /* procfs requests not want stay in wait for avoid deadlock */                req->rq_no_resend = 1;                req->rq_no_delay = 1;        }        rc = ptlrpc_queue_wait(req);        if (rc)                GOTO(out, rc);        msfs = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(*msfs),                                  lustre_swab_obd_statfs);        if (msfs == NULL) {                CERROR("Can't unpack obd_statfs\n");                GOTO(out, rc = -EPROTO);        }        memcpy(osfs, msfs, sizeof(*msfs));        EXIT;out:        ptlrpc_req_finished(req);        return rc;}static int mdc_pin(struct obd_export *exp, obd_id ino, __u32 gen, int type,                   struct obd_client_handle *handle, int flag){        struct ptlrpc_request *req;        struct mds_body *body;        int rc, size[2] = { sizeof(struct ptlrpc_body), sizeof(*body) };        ENTRY;        req = ptlrpc_prep_req(class_exp2cliimp(exp), LUSTRE_MDS_VERSION,                              MDS_PIN, 2, size, NULL);        if (req == NULL)                RETURN(-ENOMEM);        body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));        mdc_pack_fid(&body->fid1, ino, gen, type);        body->flags = flag;        ptlrpc_req_set_repsize(req, 2, size);        mdc_get_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);        rc = ptlrpc_queue_wait(req);        mdc_put_rpc_lock(exp->exp_obd->u.cli.cl_rpc_lock, NULL);        if (rc) {                CERROR("pin failed: %d\n", rc);                ptlrpc_req_finished(req);                RETURN(rc);        }        body = lustre_swab_repbuf(req, REPLY_REC_OFF, sizeof(*body),                                  lustre_swab_mds_body);        if (body == NULL) {                ptlrpc_req_finished(req);                RETURN(rc);        }        memcpy(&handle->och_fh, &body->handle, sizeof(body->handle));        handle->och_magic = OBD_CLIENT_HANDLE_MAGIC;        OBD_ALLOC(handle->och_mod, sizeof(*handle->och_mod));        if (handle->och_mod == NULL) {                DEBUG_REQ(D_ERROR, req, "can't allocate mdc_open_data");                RETURN(-ENOMEM);        }        handle->och_mod->mod_open_req = req; /* will be dropped by unpin */        RETURN(rc);}static int mdc_unpin(struct obd_export *exp,                     struct obd_client_handle *handle, int flag){        struct ptlrpc_request *req;        struct mds_body *body;        int rc, size[2] = { sizeof(struct ptlrpc_body), sizeof(*body) };

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -