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

📄 ost_handler.c

📁 lustre 1.6.5 source code
💻 C
📖 第 1 页 / 共 5 页
字号:
                GOTO(out, rc);        repoqc = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(*repoqc));        req->rq_status = obd_quotactl(req->rq_export, oqctl);        *repoqc = *oqctl;out:        RETURN(rc);}static int ost_handle_quotacheck(struct ptlrpc_request *req){        struct obd_quotactl *oqctl;        int rc;        ENTRY;        oqctl = lustre_swab_reqbuf(req, REQ_REC_OFF, sizeof(*oqctl),                                   lustre_swab_obd_quotactl);        if (oqctl == NULL)                 RETURN(-EPROTO);        rc = lustre_pack_reply(req, 1, NULL, NULL);        if (rc)                RETURN(rc);        req->rq_status = obd_quotacheck(req->rq_export, oqctl);        RETURN(0);}static int ost_handle_quota_adjust_qunit(struct ptlrpc_request *req){        struct quota_adjust_qunit *oqaq, *repoqa;        int size[2] = { sizeof(struct ptlrpc_body), sizeof(*repoqa) };        int rc;        ENTRY;        oqaq = lustre_swab_reqbuf(req, REQ_REC_OFF, sizeof(*oqaq),                                  lustre_swab_quota_adjust_qunit);        if (oqaq == NULL)                GOTO(out, rc = -EPROTO);        rc = lustre_pack_reply(req, 2, size, NULL);        if (rc)                GOTO(out, rc);        repoqa = lustre_msg_buf(req->rq_repmsg, REPLY_REC_OFF, sizeof(*repoqa));        req->rq_status = obd_quota_adjust_qunit(req->rq_export, oqaq);        *repoqa = *oqaq; out:        RETURN(rc);}static int ost_filter_recovery_request(struct ptlrpc_request *req,                                       struct obd_device *obd, int *process){        switch (lustre_msg_get_opc(req->rq_reqmsg)) {        case OST_CONNECT: /* This will never get here, but for completeness. */        case OST_DISCONNECT:               *process = 1;               RETURN(0);        case OBD_PING:        case OST_CREATE:        case OST_DESTROY:        case OST_PUNCH:        case OST_SETATTR:        case OST_SYNC:        case OST_WRITE:        case OBD_LOG_CANCEL:        case LDLM_ENQUEUE:                *process = target_queue_recovery_request(req, obd);                RETURN(0);        default:                DEBUG_REQ(D_ERROR, req, "not permitted during recovery");                *process = 0;                /* XXX what should we set rq_status to here? */                req->rq_status = -EAGAIN;                RETURN(ptlrpc_error(req));        }}int ost_msg_check_version(struct lustre_msg *msg){        int rc;        switch(lustre_msg_get_opc(msg)) {        case OST_CONNECT:        case OST_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 OST_CREATE:        case OST_DESTROY:        case OST_GETATTR:        case OST_SETATTR:        case OST_WRITE:        case OST_READ:        case OST_PUNCH:        case OST_STATFS:        case OST_SYNC:        case OST_SET_INFO:        case OST_GET_INFO:        case OST_QUOTACHECK:        case OST_QUOTACTL:        case OST_QUOTA_ADJUST_QUNIT:                rc = lustre_msg_check_version(msg, LUSTRE_OST_VERSION);                if (rc)                        CERROR("bad opc %u version %08x, expecting %08x\n",                               lustre_msg_get_opc(msg),                               lustre_msg_get_version(msg),                               LUSTRE_OST_VERSION);                break;        case LDLM_ENQUEUE:        case LDLM_CONVERT:        case LDLM_CANCEL:        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 LLOG_ORIGIN_CONNECT:        case OBD_LOG_CANCEL:                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("Unexpected opcode %d\n", lustre_msg_get_opc(msg));                rc = -ENOTSUPP;        }        return rc;}static int ost_handle(struct ptlrpc_request *req){        struct obd_trans_info trans_info = { 0, };        struct obd_trans_info *oti = &trans_info;        int should_process, fail = OBD_FAIL_OST_ALL_REPLY_NET, rc = 0;        struct obd_device *obd = NULL;        ENTRY;        LASSERT(current->journal_info == NULL);        /* XXX identical to MDS */        if (lustre_msg_get_opc(req->rq_reqmsg) != OST_CONNECT) {                int abort_recovery, recovering;                if (req->rq_export == NULL) {                        CDEBUG(D_HA,"operation %d on unconnected OST from %s\n",                               lustre_msg_get_opc(req->rq_reqmsg),                               libcfs_id2str(req->rq_peer));                        req->rq_status = -ENOTCONN;                        GOTO(out, rc = -ENOTCONN);                }                obd = req->rq_export->exp_obd;                /* 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 = ost_filter_recovery_request(req, obd,                                                         &should_process);                        if (rc || !should_process)                                RETURN(rc);                }        }        oti_init(oti, req);        rc = ost_msg_check_version(req->rq_reqmsg);        if (rc)                RETURN(rc);        rc = ost_msg_check_version(req->rq_reqmsg);        if (rc)                RETURN(rc);        switch (lustre_msg_get_opc(req->rq_reqmsg)) {        case OST_CONNECT: {                CDEBUG(D_INODE, "connect\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_CONNECT_NET, 0);                rc = target_handle_connect(req, ost_handle);                OBD_FAIL_RETURN(OBD_FAIL_OST_CONNECT_NET2, 0);                if (!rc)                        obd = req->rq_export->exp_obd;                break;        }        case OST_DISCONNECT:                CDEBUG(D_INODE, "disconnect\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_DISCONNECT_NET, 0);                rc = target_handle_disconnect(req);                break;        case OST_CREATE:                CDEBUG(D_INODE, "create\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_CREATE_NET, 0);                OBD_FAIL_TIMEOUT_MS(OBD_FAIL_OST_PAUSE_CREATE, obd_fail_val);                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_ENOSPC))                        GOTO(out, rc = -ENOSPC);                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))                        GOTO(out, rc = -EROFS);                rc = ost_create(req->rq_export, req, oti);                break;        case OST_DESTROY:                CDEBUG(D_INODE, "destroy\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_DESTROY_NET, 0);                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))                        GOTO(out, rc = -EROFS);                rc = ost_destroy(req->rq_export, req, oti);                break;        case OST_GETATTR:                CDEBUG(D_INODE, "getattr\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_GETATTR_NET, 0);                rc = ost_getattr(req->rq_export, req);                break;        case OST_SETATTR:                CDEBUG(D_INODE, "setattr\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_SETATTR_NET, 0);                rc = ost_setattr(req->rq_export, req, oti);                break;        case OST_WRITE:                CDEBUG(D_INODE, "write\n");                /* req->rq_request_portal would be nice, if it was set */                if (req->rq_rqbd->rqbd_service->srv_req_portal !=OST_IO_PORTAL){                        CERROR("%s: deny write request from %s to portal %u\n",                               req->rq_export->exp_obd->obd_name,                               obd_export_nid2str(req->rq_export),                               req->rq_rqbd->rqbd_service->srv_req_portal);                        GOTO(out, rc = -EPROTO);                }                OBD_FAIL_RETURN(OBD_FAIL_OST_BRW_NET, 0);                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_ENOSPC))                        GOTO(out, rc = -ENOSPC);                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))                        GOTO(out, rc = -EROFS);                rc = ost_brw_write(req, oti);                LASSERT(current->journal_info == NULL);                /* ost_brw_write sends its own replies */                RETURN(rc);        case OST_READ:                CDEBUG(D_INODE, "read\n");                /* req->rq_request_portal would be nice, if it was set */                if (req->rq_rqbd->rqbd_service->srv_req_portal !=OST_IO_PORTAL){                        CERROR("%s: deny read request from %s to portal %u\n",                               req->rq_export->exp_obd->obd_name,                               obd_export_nid2str(req->rq_export),                               req->rq_rqbd->rqbd_service->srv_req_portal);                        GOTO(out, rc = -EPROTO);                }                OBD_FAIL_RETURN(OBD_FAIL_OST_BRW_NET, 0);                rc = ost_brw_read(req, oti);                LASSERT(current->journal_info == NULL);                /* ost_brw_read sends its own replies */                RETURN(rc);        case OST_PUNCH:                CDEBUG(D_INODE, "punch\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_PUNCH_NET, 0);                if (OBD_FAIL_CHECK_ONCE(OBD_FAIL_OST_EROFS))                        GOTO(out, rc = -EROFS);                rc = ost_punch(req->rq_export, req, oti);                break;        case OST_STATFS:                CDEBUG(D_INODE, "statfs\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_STATFS_NET, 0);                rc = ost_statfs(req);                break;        case OST_SYNC:                CDEBUG(D_INODE, "sync\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_SYNC_NET, 0);                rc = ost_sync(req->rq_export, req);                break;        case OST_SET_INFO:                DEBUG_REQ(D_INODE, req, "set_info");                rc = ost_set_info(req->rq_export, req);                break;        case OST_GET_INFO:                DEBUG_REQ(D_INODE, req, "get_info");                rc = ost_get_info(req->rq_export, req);                break;        case OST_QUOTACHECK:                CDEBUG(D_INODE, "quotacheck\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_QUOTACHECK_NET, 0);                rc = ost_handle_quotacheck(req);                break;        case OST_QUOTACTL:                CDEBUG(D_INODE, "quotactl\n");                OBD_FAIL_RETURN(OBD_FAIL_OST_QUOTACTL_NET, 0);                rc = ost_handle_quotactl(req);                break;        case OST_QUOTA_ADJUST_QUNIT:                CDEBUG(D_INODE, "quota_adjust_qunit\n");                rc = ost_handle_quota_adjust_qunit(req);                break;        case OBD_PING:                DEBUG_REQ(D_INODE, req, "ping");                rc = target_handle_ping(req);                break;        /* FIXME - just reply status */        case LLOG_ORIGIN_CONNECT:                DEBUG_REQ(D_INODE, req, "log connect");                rc = llog_handle_connect(req);                req->rq_status = rc;                rc = lustre_pack_reply(req, 1, NULL, NULL);                if (rc)                        RETURN(rc);                RETURN(ptlrpc_reply(req));        case OBD_LOG_CANCEL:                CDEBUG(D_INODE, "log cancel\n");                OBD_FAIL_RETURN(OBD_FAIL_OBD_LOG_CANCEL_NET, 0);                rc = llog_origin_handle_cancel(req);                req->rq_status = rc;                rc = lustre_pack_reply(req, 1, NULL, NULL);                if (rc)                        RETURN(rc);                RETURN(ptlrpc_reply(req));        case LDLM_ENQUEUE:                CDEBUG(D_INODE, "enqueue\n");                OBD_FAIL_RETURN(OBD_FAIL_LDLM_ENQUEUE, 0);                rc = ldlm_handle_enqueue(req, ldlm_server_completion_ast,                                         ldlm_server_blocking_ast,         

⌨️ 快捷键说明

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