📄 mdc_request.c
字号:
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 + -