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

📄 handler.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 5 页
字号:
        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 + -