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