📄 handler.c
字号:
switch (lustre_msg_get_opc(msg)) { case MDS_CONNECT: case MDS_DISCONNECT: case OBD_PING: rc = lustre_msg_check_version(msg, LUSTRE_OBD_VERSION); if (rc) CERROR("bad opc %u version %08x, expecting %08x\n", lustre_msg_get_opc(msg), lustre_msg_get_version(msg), LUSTRE_OBD_VERSION); break; case MDS_GETSTATUS: case MDS_GETATTR: case MDS_GETATTR_NAME: case MDS_STATFS: case MDS_READPAGE: case MDS_REINT: case MDS_CLOSE: case MDS_DONE_WRITING: case MDS_PIN: case MDS_SYNC: case MDS_GETXATTR: case MDS_SETXATTR: case MDS_SET_INFO: case MDS_QUOTACHECK: case MDS_QUOTACTL: case QUOTA_DQACQ: case QUOTA_DQREL: rc = lustre_msg_check_version(msg, LUSTRE_MDS_VERSION); if (rc) CERROR("bad opc %u version %08x, expecting %08x\n", lustre_msg_get_opc(msg), lustre_msg_get_version(msg), LUSTRE_MDS_VERSION); break; case LDLM_ENQUEUE: case LDLM_CONVERT: case LDLM_BL_CALLBACK: case LDLM_CP_CALLBACK: rc = lustre_msg_check_version(msg, LUSTRE_DLM_VERSION); if (rc) CERROR("bad opc %u version %08x, expecting %08x\n", lustre_msg_get_opc(msg), lustre_msg_get_version(msg), LUSTRE_DLM_VERSION); break; case OBD_LOG_CANCEL: case LLOG_ORIGIN_HANDLE_CREATE: case LLOG_ORIGIN_HANDLE_NEXT_BLOCK: case LLOG_ORIGIN_HANDLE_READ_HEADER: case LLOG_ORIGIN_HANDLE_CLOSE: case LLOG_ORIGIN_HANDLE_DESTROY: case LLOG_ORIGIN_HANDLE_PREV_BLOCK: case LLOG_CATINFO: rc = lustre_msg_check_version(msg, LUSTRE_LOG_VERSION); if (rc) CERROR("bad opc %u version %08x, expecting %08x\n", lustre_msg_get_opc(msg), lustre_msg_get_version(msg), LUSTRE_LOG_VERSION); break; default: CERROR("MDS unknown opcode %d\n", lustre_msg_get_opc(msg)); rc = -ENOTSUPP; } return rc;}int mds_handle(struct ptlrpc_request *req){ int should_process, fail = OBD_FAIL_MDS_ALL_REPLY_NET; int rc = 0; struct mds_obd *mds = NULL; /* quell gcc overwarning */ struct obd_device *obd = NULL; ENTRY; OBD_FAIL_RETURN(OBD_FAIL_MDS_ALL_REQUEST_NET | OBD_FAIL_ONCE, 0); LASSERT(current->journal_info == NULL); rc = mds_msg_check_version(req->rq_reqmsg); if (rc) { CERROR("MDS drop mal-formed request\n"); RETURN(rc); } /* XXX identical to OST */ if (lustre_msg_get_opc(req->rq_reqmsg) != MDS_CONNECT) { struct mds_export_data *med; int recovering, abort_recovery; if (req->rq_export == NULL) { CERROR("operation %d on unconnected MDS from %s\n", lustre_msg_get_opc(req->rq_reqmsg), libcfs_id2str(req->rq_peer)); req->rq_status = -ENOTCONN; GOTO(out, rc = -ENOTCONN); } med = &req->rq_export->exp_mds_data; obd = req->rq_export->exp_obd; mds = &obd->u.mds; /* sanity check: if the xid matches, the request must * be marked as a resent or replayed */ if (req->rq_xid == le64_to_cpu(med->med_mcd->mcd_last_xid) || req->rq_xid == le64_to_cpu(med->med_mcd->mcd_last_close_xid)) if (!(lustre_msg_get_flags(req->rq_reqmsg) & (MSG_RESENT | MSG_REPLAY))) { CERROR("rq_xid "LPU64" matches last_xid, " "expected RESENT flag\n", req->rq_xid); req->rq_status = -ENOTCONN; GOTO(out, rc = -EFAULT); } /* else: note the opposite is not always true; a * RESENT req after a failover will usually not match * the last_xid, since it was likely never * committed. A REPLAYed request will almost never * match the last xid, however it could for a * committed, but still retained, open. */ /* Check for aborted recovery. */ spin_lock_bh(&obd->obd_processing_task_lock); abort_recovery = obd->obd_abort_recovery; recovering = obd->obd_recovering; spin_unlock_bh(&obd->obd_processing_task_lock); if (abort_recovery) { target_abort_recovery(obd); } else if (recovering) { rc = mds_filter_recovery_request(req, obd, &should_process); if (rc || !should_process) RETURN(rc); } } switch (lustre_msg_get_opc(req->rq_reqmsg)) { case MDS_CONNECT: DEBUG_REQ(D_INODE, req, "connect"); OBD_FAIL_RETURN(OBD_FAIL_MDS_CONNECT_NET, 0); rc = target_handle_connect(req, mds_handle); if (!rc) { /* Now that we have an export, set mds. */ obd = req->rq_export->exp_obd; mds = mds_req2mds(req); } break; case MDS_DISCONNECT: DEBUG_REQ(D_INODE, req, "disconnect"); OBD_FAIL_RETURN(OBD_FAIL_MDS_DISCONNECT_NET, 0); rc = target_handle_disconnect(req); req->rq_status = rc; /* superfluous? */ break; case MDS_GETSTATUS: DEBUG_REQ(D_INODE, req, "getstatus"); OBD_FAIL_RETURN(OBD_FAIL_MDS_GETSTATUS_NET, 0); rc = mds_getstatus(req); break; case MDS_GETATTR: DEBUG_REQ(D_INODE, req, "getattr"); OBD_FAIL_RETURN(OBD_FAIL_MDS_GETATTR_NET, 0); rc = mds_getattr(req, REQ_REC_OFF); break; case MDS_SETXATTR: DEBUG_REQ(D_INODE, req, "setxattr"); OBD_FAIL_RETURN(OBD_FAIL_MDS_SETXATTR_NET, 0); rc = mds_setxattr(req); break; case MDS_GETXATTR: DEBUG_REQ(D_INODE, req, "getxattr"); OBD_FAIL_RETURN(OBD_FAIL_MDS_GETXATTR_NET, 0); rc = mds_getxattr(req); break; case MDS_GETATTR_NAME: { struct lustre_handle lockh = { 0 }; DEBUG_REQ(D_INODE, req, "getattr_name"); OBD_FAIL_RETURN(OBD_FAIL_MDS_GETATTR_NAME_NET, 0); /* If this request gets a reconstructed reply, we won't be * acquiring any new locks in mds_getattr_lock, so we don't * want to cancel. */ rc = mds_getattr_lock(req, REQ_REC_OFF, MDS_INODELOCK_UPDATE, &lockh); /* this non-intent call (from an ioctl) is special */ req->rq_status = rc; if (rc == 0 && lustre_handle_is_used(&lockh)) ldlm_lock_decref(&lockh, LCK_CR); break; } case MDS_STATFS: DEBUG_REQ(D_INODE, req, "statfs"); OBD_FAIL_RETURN(OBD_FAIL_MDS_STATFS_NET, 0); rc = mds_statfs(req); break; case MDS_READPAGE: DEBUG_REQ(D_INODE, req, "readpage"); OBD_FAIL_RETURN(OBD_FAIL_MDS_READPAGE_NET, 0); rc = mds_readpage(req, REQ_REC_OFF); if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_MDS_SENDPAGE)) { RETURN(0); } break; case MDS_REINT: { __u32 *opcp = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*opcp)); __u32 opc; int op = 0; int size[4] = { sizeof(struct ptlrpc_body), sizeof(struct mds_body), mds->mds_max_mdsize, mds->mds_max_cookiesize }; int bufcount; /* NB only peek inside req now; mds_reint() will swab it */ if (opcp == NULL) { CERROR ("Can't inspect opcode\n"); rc = -EINVAL; break; } opc = *opcp; if (lustre_msg_swabbed(req->rq_reqmsg)) __swab32s(&opc); DEBUG_REQ(D_INODE, req, "reint %d (%s)", opc, (opc < sizeof(reint_names) / sizeof(reint_names[0]) || reint_names[opc] == NULL) ? reint_names[opc] : "unknown opcode"); switch (opc) { case REINT_CREATE: op = PTLRPC_LAST_CNTR + MDS_REINT_CREATE; break; case REINT_LINK: op = PTLRPC_LAST_CNTR + MDS_REINT_LINK; break; case REINT_OPEN: op = PTLRPC_LAST_CNTR + MDS_REINT_OPEN; break; case REINT_SETATTR: op = PTLRPC_LAST_CNTR + MDS_REINT_SETATTR; break; case REINT_RENAME: op = PTLRPC_LAST_CNTR + MDS_REINT_RENAME; break; case REINT_UNLINK: op = PTLRPC_LAST_CNTR + MDS_REINT_UNLINK; break; default: op = 0; break; } if (op && req->rq_rqbd->rqbd_service->srv_stats) lprocfs_counter_incr( req->rq_rqbd->rqbd_service->srv_stats, op); OBD_FAIL_RETURN(OBD_FAIL_MDS_REINT_NET, 0); if (opc == REINT_UNLINK || opc == REINT_RENAME) bufcount = 4; else if (opc == REINT_OPEN) bufcount = 3; else bufcount = 2; rc = lustre_pack_reply(req, bufcount, size, NULL); if (rc) break; rc = mds_reint(req, REQ_REC_OFF, NULL); fail = OBD_FAIL_MDS_REINT_NET_REP; break; } case MDS_CLOSE: DEBUG_REQ(D_INODE, req, "close"); OBD_FAIL_RETURN(OBD_FAIL_MDS_CLOSE_NET, 0); rc = mds_close(req, REQ_REC_OFF); fail = OBD_FAIL_MDS_CLOSE_NET_REP; break; case MDS_DONE_WRITING: DEBUG_REQ(D_INODE, req, "done_writing"); OBD_FAIL_RETURN(OBD_FAIL_MDS_DONE_WRITING_NET, 0); rc = mds_done_writing(req, REQ_REC_OFF); break; case MDS_PIN: DEBUG_REQ(D_INODE, req, "pin"); OBD_FAIL_RETURN(OBD_FAIL_MDS_PIN_NET, 0); rc = mds_pin(req, REQ_REC_OFF); break; case MDS_SYNC: DEBUG_REQ(D_INODE, req, "sync"); OBD_FAIL_RETURN(OBD_FAIL_MDS_SYNC_NET, 0); rc = mds_sync(req, REQ_REC_OFF); break; case MDS_SET_INFO: DEBUG_REQ(D_INODE, req, "set_info"); rc = mds_set_info_rpc(req->rq_export, req); break; case MDS_QUOTACHECK: DEBUG_REQ(D_INODE, req, "quotacheck"); OBD_FAIL_RETURN(OBD_FAIL_MDS_QUOTACHECK_NET, 0); rc = mds_handle_quotacheck(req); break; case MDS_QUOTACTL: DEBUG_REQ(D_INODE, req, "quotactl"); OBD_FAIL_RETURN(OBD_FAIL_MDS_QUOTACTL_NET, 0); rc = mds_handle_quotactl(req); break; case OBD_PING: DEBUG_REQ(D_INODE, req, "ping"); rc = target_handle_ping(req); break; case OBD_LOG_CANCEL: CDEBUG(D_INODE, "log cancel\n"); OBD_FAIL_RETURN(OBD_FAIL_OBD_LOG_CANCEL_NET, 0); rc = -ENOTSUPP; /* la la la */ break; case LDLM_ENQUEUE: DEBUG_REQ(D_INODE, req, "enqueue"); OBD_FAIL_RETURN(OBD_FAIL_LDLM_ENQUEUE, 0); rc = ldlm_handle_enqueue(req, ldlm_server_completion_ast, ldlm_server_blocking_ast, NULL); fail = OBD_FAIL_LDLM_REPLY; break; case LDLM_CONVERT: DEBUG_REQ(D_INODE, req, "convert"); OBD_FAIL_RETURN(OBD_FAIL_LDLM_CONVERT, 0); rc = ldlm_handle_convert(req); break; case LDLM_BL_CALLBACK: case LDLM_CP_CALLBACK: DEBUG_REQ(D_I
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -