X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdt%2Fmdt_mds.c;h=4e06880809c91432906f8d5957c1a8777ae94c94;hb=1b2547843817b4b7adbeb87ea9b070d9cac35c90;hp=0a15bd3b36182021b932eedf5d4d1d586dc8f869;hpb=40137f1d07295ee4a0bb75d2ae553c42e66295f4;p=fs%2Flustre-release.git diff --git a/lustre/mdt/mdt_mds.c b/lustre/mdt/mdt_mds.c index 0a15bd3..4e06880 100644 --- a/lustre/mdt/mdt_mds.c +++ b/lustre/mdt/mdt_mds.c @@ -23,7 +23,7 @@ * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2012 Intel Corporation + * Copyright (c) 2013, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -51,9 +51,7 @@ #include #include #include "mdt_internal.h" -#ifdef HAVE_QUOTA_SUPPORT -# include -#endif +#include #include #include #include @@ -63,6 +61,7 @@ struct mds_device { struct md_device mds_md_dev; struct ptlrpc_service *mds_regular_service; struct ptlrpc_service *mds_readpage_service; + struct ptlrpc_service *mds_out_service; struct ptlrpc_service *mds_setattr_service; struct ptlrpc_service *mds_mdsc_service; struct ptlrpc_service *mds_mdss_service; @@ -142,17 +141,18 @@ DEF_MDT_HDL_VAR(0, MDS_SYNC, mdt_sync), DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_IS_SUBDIR, mdt_is_subdir), DEF_MDT_HDL(0, MDS_QUOTACHECK, mdt_quotacheck), DEF_MDT_HDL(0, MDS_QUOTACTL, mdt_quotactl), -DEF_MDT_HDL(0 | HABEO_REFERO, MDS_HSM_PROGRESS, mdt_hsm_progress), -DEF_MDT_HDL(0 | HABEO_REFERO, MDS_HSM_CT_REGISTER, +DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_PROGRESS, mdt_hsm_progress), +DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_CT_REGISTER, mdt_hsm_ct_register), -DEF_MDT_HDL(0 | HABEO_REFERO, MDS_HSM_CT_UNREGISTER, +DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_CT_UNREGISTER, mdt_hsm_ct_unregister), DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_STATE_GET, mdt_hsm_state_get), DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_STATE_SET, mdt_hsm_state_set), DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_ACTION, mdt_hsm_action), -DEF_MDT_HDL(0 | HABEO_REFERO, MDS_HSM_REQUEST, mdt_hsm_request), +DEF_MDT_HDL(HABEO_CORPUS| HABEO_REFERO, MDS_HSM_REQUEST, mdt_hsm_request), +DEF_MDT_HDL(HABEO_CORPUS|HABEO_REFERO, MDS_SWAP_LAYOUTS, mdt_swap_layouts) }; #define DEF_OBD_HDL(flags, name, fn) \ @@ -308,6 +308,46 @@ struct mdt_opc_slice mdt_fld_handlers[] = { } }; +/* Request with a format known in advance */ +#define DEF_UPDATE_HDL(flags, name, fn) \ + DEFINE_RPC_HANDLER(UPDATE_OBJ, flags, name, fn, &RQF_ ## name) + +#define target_handler mdt_handler +static struct target_handler out_ops[] = { + DEF_UPDATE_HDL(MUTABOR, UPDATE_OBJ, out_handle), +}; + +static struct mdt_opc_slice update_handlers[] = { + { + .mos_opc_start = MDS_GETATTR, + .mos_opc_end = MDS_LAST_OPC, + .mos_hs = mdt_mds_ops + }, + { + .mos_opc_start = OBD_PING, + .mos_opc_end = OBD_LAST_OPC, + .mos_hs = mdt_obd_ops + }, + { + .mos_opc_start = LDLM_ENQUEUE, + .mos_opc_end = LDLM_LAST_OPC, + .mos_hs = mdt_dlm_ops + }, + { + .mos_opc_start = SEC_CTX_INIT, + .mos_opc_end = SEC_LAST_OPC, + .mos_hs = mdt_sec_ctx_ops + }, + { + .mos_opc_start = UPDATE_OBJ, + .mos_opc_end = UPDATE_LAST_OPC, + .mos_hs = out_ops + }, + { + .mos_hs = NULL + } +}; + static int mds_regular_handle(struct ptlrpc_request *req) { return mdt_handle_common(req, mdt_regular_handlers); @@ -323,6 +363,11 @@ static int mds_mdsc_handle(struct ptlrpc_request *req) return mdt_handle_common(req, mdt_seq_handlers); } +static int mdt_out_handle(struct ptlrpc_request *req) +{ + return mdt_handle_common(req, update_handlers); +} + static int mds_mdss_handle(struct ptlrpc_request *req) { return mdt_handle_common(req, mdt_seq_handlers); @@ -345,6 +390,10 @@ static void mds_stop_ptlrpc_service(struct mds_device *m) ptlrpc_unregister_service(m->mds_readpage_service); m->mds_readpage_service = NULL; } + if (m->mds_out_service != NULL) { + ptlrpc_unregister_service(m->mds_out_service); + m->mds_out_service = NULL; + } if (m->mds_setattr_service != NULL) { ptlrpc_unregister_service(m->mds_setattr_service); m->mds_setattr_service = NULL; @@ -380,9 +429,9 @@ static int mds_start_ptlrpc_service(struct mds_device *m) .psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR, .psc_buf = { .bc_nbufs = MDS_NBUFS, - .bc_buf_size = MDS_BUFSIZE, - .bc_req_max_size = MDS_MAXREQSIZE, - .bc_rep_max_size = MDS_MAXREPSIZE, + .bc_buf_size = MDS_REG_BUFSIZE, + .bc_req_max_size = MDS_REG_MAXREQSIZE, + .bc_rep_max_size = MDS_REG_MAXREPSIZE, .bc_req_portal = MDS_REQUEST_PORTAL, .bc_rep_portal = MDC_REPLY_PORTAL, }, @@ -476,7 +525,7 @@ static int mds_start_ptlrpc_service(struct mds_device *m) .bc_nbufs = MDS_NBUFS, .bc_buf_size = MDS_BUFSIZE, .bc_req_max_size = MDS_MAXREQSIZE, - .bc_rep_max_size = MDS_MAXREPSIZE, + .bc_rep_max_size = MDS_LOV_MAXREPSIZE, .bc_req_portal = MDS_SETATTR_PORTAL, .bc_rep_portal = MDC_REPLY_PORTAL, }, @@ -508,6 +557,49 @@ static int mds_start_ptlrpc_service(struct mds_device *m) GOTO(err_mds_svc, rc); } + /* Object update service */ + conf = (typeof(conf)) { + .psc_name = LUSTRE_MDT_NAME "_out", + .psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR, + .psc_buf = { + .bc_nbufs = MDS_NBUFS, + .bc_buf_size = MDS_OUT_BUFSIZE, + .bc_req_max_size = MDS_OUT_MAXREQSIZE, + .bc_rep_max_size = MDS_OUT_MAXREPSIZE, + .bc_req_portal = MDS_MDS_PORTAL, + .bc_rep_portal = MDC_REPLY_PORTAL, + }, + /* + * We'd like to have a mechanism to set this on a per-device + * basis, but alas... + */ + .psc_thr = { + .tc_thr_name = LUSTRE_MDT_NAME "_out", + .tc_thr_factor = MDS_THR_FACTOR, + .tc_nthrs_init = MDS_NTHRS_INIT, + .tc_nthrs_base = MDS_NTHRS_BASE, + .tc_nthrs_max = MDS_NTHRS_MAX, + .tc_nthrs_user = mds_num_threads, + .tc_cpu_affinity = 1, + .tc_ctx_tags = LCT_MD_THREAD, + }, + .psc_cpt = { + .cc_pattern = mds_num_cpts, + }, + .psc_ops = { + .so_req_handler = mdt_out_handle, + .so_req_printer = target_print_req, + .so_hpreq_handler = NULL, + }, + }; + m->mds_out_service = ptlrpc_register_service(&conf, procfs_entry); + if (IS_ERR(m->mds_out_service)) { + rc = PTR_ERR(m->mds_out_service); + CERROR("failed to start out service: %d\n", rc); + m->mds_out_service = NULL; + GOTO(err_mds_svc, rc); + } + /* * sequence controller service configuration */ @@ -517,7 +609,7 @@ static int mds_start_ptlrpc_service(struct mds_device *m) .psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR, .psc_buf = { .bc_nbufs = MDS_NBUFS, - .bc_buf_size = MDS_BUFSIZE, + .bc_buf_size = SEQ_BUFSIZE, .bc_req_max_size = SEQ_MAXREQSIZE, .bc_rep_max_size = SEQ_MAXREPSIZE, .bc_req_portal = SEQ_CONTROLLER_PORTAL, @@ -553,7 +645,7 @@ static int mds_start_ptlrpc_service(struct mds_device *m) .psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR, .psc_buf = { .bc_nbufs = MDS_NBUFS, - .bc_buf_size = MDS_BUFSIZE, + .bc_buf_size = SEQ_BUFSIZE, .bc_req_max_size = SEQ_MAXREQSIZE, .bc_rep_max_size = SEQ_MAXREPSIZE, .bc_req_portal = SEQ_METADATA_PORTAL, @@ -587,7 +679,7 @@ static int mds_start_ptlrpc_service(struct mds_device *m) .psc_watchdog_factor = MDT_SERVICE_WATCHDOG_FACTOR, .psc_buf = { .bc_nbufs = MDS_NBUFS, - .bc_buf_size = MDS_BUFSIZE, + .bc_buf_size = FLD_BUFSIZE, .bc_req_max_size = FLD_MAXREQSIZE, .bc_rep_max_size = FLD_MAXREPSIZE, .bc_req_portal = FLD_REQUEST_PORTAL,