Whamcloud - gitweb
LU-8066 mdc: move mdc-specific procfs files to sysfs
[fs/lustre-release.git] / lustre / mdc / mdc_request.c
index 070286b..daf1e21 100644 (file)
@@ -23,7 +23,7 @@
  * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2016, Intel Corporation.
+ * Copyright (c) 2011, 2017, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -192,20 +192,34 @@ static int mdc_getattr_common(struct obd_export *exp,
         RETURN(0);
 }
 
+static void mdc_reset_acl_req(struct ptlrpc_request *req)
+{
+       spin_lock(&req->rq_early_free_lock);
+       sptlrpc_cli_free_repbuf(req);
+       req->rq_repbuf = NULL;
+       req->rq_repbuf_len = 0;
+       req->rq_repdata = NULL;
+       req->rq_reqdata_len = 0;
+       spin_unlock(&req->rq_early_free_lock);
+}
+
 static int mdc_getattr(struct obd_export *exp, struct md_op_data *op_data,
                       struct ptlrpc_request **request)
 {
-        struct ptlrpc_request *req;
-        int                    rc;
-        ENTRY;
+       struct ptlrpc_request *req;
+       struct obd_import *imp = class_exp2cliimp(exp);
+       __u32 acl_bufsize = LUSTRE_POSIX_ACL_MAX_SIZE_OLD;
+       int rc;
+       ENTRY;
 
        /* Single MDS without an LMV case */
        if (op_data->op_flags & MF_GET_MDT_IDX) {
                op_data->op_mds = 0;
                RETURN(0);
        }
-        *request = NULL;
-        req = ptlrpc_request_alloc(class_exp2cliimp(exp), &RQF_MDS_GETATTR);
+
+       *request = NULL;
+       req = ptlrpc_request_alloc(imp, &RQF_MDS_GETATTR);
         if (req == NULL)
                 RETURN(-ENOMEM);
 
@@ -215,33 +229,42 @@ static int mdc_getattr(struct obd_export *exp, struct md_op_data *op_data,
                 RETURN(rc);
         }
 
+again:
        mdc_pack_body(req, &op_data->op_fid1, op_data->op_valid,
                      op_data->op_mode, -1, 0);
+       req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER, acl_bufsize);
+       req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER,
+                            op_data->op_mode);
+       ptlrpc_request_set_replen(req);
 
-       req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
-                            req->rq_import->imp_connect_data.ocd_max_easize);
-        req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER,
-                             op_data->op_mode);
-        ptlrpc_request_set_replen(req);
+       rc = mdc_getattr_common(exp, req);
+       if (rc) {
+               if (rc == -ERANGE &&
+                   acl_bufsize != imp->imp_connect_data.ocd_max_easize) {
+                       acl_bufsize = imp->imp_connect_data.ocd_max_easize;
+                       mdc_reset_acl_req(req);
+                       goto again;
+               }
 
-        rc = mdc_getattr_common(exp, req);
-        if (rc)
-                ptlrpc_req_finished(req);
-        else
-                *request = req;
-        RETURN(rc);
+               ptlrpc_req_finished(req);
+       } else {
+               *request = req;
+       }
+
+       RETURN(rc);
 }
 
 static int mdc_getattr_name(struct obd_export *exp, struct md_op_data *op_data,
                            struct ptlrpc_request **request)
 {
-        struct ptlrpc_request *req;
-        int                    rc;
-        ENTRY;
+       struct ptlrpc_request *req;
+       struct obd_import *imp = class_exp2cliimp(exp);
+       __u32 acl_bufsize = LUSTRE_POSIX_ACL_MAX_SIZE_OLD;
+       int rc;
+       ENTRY;
 
-        *request = NULL;
-        req = ptlrpc_request_alloc(class_exp2cliimp(exp),
-                                   &RQF_MDS_GETATTR_NAME);
+       *request = NULL;
+       req = ptlrpc_request_alloc(imp, &RQF_MDS_GETATTR_NAME);
         if (req == NULL)
                 RETURN(-ENOMEM);
 
@@ -254,9 +277,6 @@ static int mdc_getattr_name(struct obd_export *exp, struct md_op_data *op_data,
                 RETURN(rc);
         }
 
-       mdc_pack_body(req, &op_data->op_fid1, op_data->op_valid,
-                     op_data->op_mode, op_data->op_suppgids[0], 0);
-
         if (op_data->op_name) {
                 char *name = req_capsule_client_get(&req->rq_pill, &RMF_NAME);
                 LASSERT(strnlen(op_data->op_name, op_data->op_namelen) ==
@@ -264,18 +284,29 @@ static int mdc_getattr_name(struct obd_export *exp, struct md_op_data *op_data,
                 memcpy(name, op_data->op_name, op_data->op_namelen);
         }
 
-        req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER,
-                             op_data->op_mode);
-       req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
-                            req->rq_import->imp_connect_data.ocd_max_easize);
-        ptlrpc_request_set_replen(req);
+again:
+       mdc_pack_body(req, &op_data->op_fid1, op_data->op_valid,
+                     op_data->op_mode, op_data->op_suppgids[0], 0);
+       req_capsule_set_size(&req->rq_pill, &RMF_MDT_MD, RCL_SERVER,
+                            op_data->op_mode);
+       req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER, acl_bufsize);
+       ptlrpc_request_set_replen(req);
 
-        rc = mdc_getattr_common(exp, req);
-        if (rc)
-                ptlrpc_req_finished(req);
-        else
-                *request = req;
-        RETURN(rc);
+       rc = mdc_getattr_common(exp, req);
+       if (rc) {
+               if (rc == -ERANGE &&
+                   acl_bufsize != imp->imp_connect_data.ocd_max_easize) {
+                       acl_bufsize = imp->imp_connect_data.ocd_max_easize;
+                       mdc_reset_acl_req(req);
+                       goto again;
+               }
+
+               ptlrpc_req_finished(req);
+       } else {
+               *request = req;
+       }
+
+       RETURN(rc);
 }
 
 static int mdc_xattr_common(struct obd_export *exp,const struct req_format *fmt,
@@ -386,26 +417,30 @@ static int mdc_xattr_common(struct obd_export *exp,const struct req_format *fmt,
 }
 
 static int mdc_setxattr(struct obd_export *exp, const struct lu_fid *fid,
-                       u64 valid, const char *xattr_name,
-                       const char *input, int input_size, int output_size,
-                       int flags, __u32 suppgid,
-                       struct ptlrpc_request **request)
+                       u64 obd_md_valid, const char *name,
+                       const void *value, size_t value_size,
+                       unsigned int xattr_flags, u32 suppgid,
+                       struct ptlrpc_request **req)
 {
+       LASSERT(obd_md_valid == OBD_MD_FLXATTR ||
+               obd_md_valid == OBD_MD_FLXATTRRM);
+
        return mdc_xattr_common(exp, &RQF_MDS_REINT_SETXATTR,
-                               fid, MDS_REINT, valid, xattr_name,
-                               input, input_size, output_size, flags,
-                               suppgid, request);
+                               fid, MDS_REINT, obd_md_valid, name,
+                               value, value_size, 0, xattr_flags, suppgid,
+                               req);
 }
 
 static int mdc_getxattr(struct obd_export *exp, const struct lu_fid *fid,
-                       u64 valid, const char *xattr_name,
-                       const char *input, int input_size, int output_size,
-                       int flags, struct ptlrpc_request **request)
+                       u64 obd_md_valid, const char *name, size_t buf_size,
+                       struct ptlrpc_request **req)
 {
-       return mdc_xattr_common(exp, &RQF_MDS_GETXATTR,
-                               fid, MDS_GETXATTR, valid, xattr_name,
-                               input, input_size, output_size, flags,
-                               -1, request);
+       LASSERT(obd_md_valid == OBD_MD_FLXATTR ||
+               obd_md_valid == OBD_MD_FLXATTRLS);
+
+       return mdc_xattr_common(exp, &RQF_MDS_GETXATTR, fid, MDS_GETXATTR,
+                               obd_md_valid, name, NULL, 0, buf_size, 0, -1,
+                               req);
 }
 
 #ifdef CONFIG_FS_POSIX_ACL
@@ -689,7 +724,6 @@ int mdc_set_open_replay_data(struct obd_export *exp,
         }
 
        rec->cr_fid2 = body->mbo_fid1;
-       rec->cr_ioepoch = body->mbo_ioepoch;
        rec->cr_old_handle.cookie = body->mbo_handle.cookie;
        open_req->rq_replay_cb = mdc_replay_open;
        if (!fid_is_sane(&body->mbo_fid1)) {
@@ -1232,7 +1266,8 @@ static int mdc_read_page_remote(void *data, struct page *page0)
        }
 
        for (npages = 1; npages < max_pages; npages++) {
-               page = page_cache_alloc_cold(inode->i_mapping);
+               page = __page_cache_alloc(mapping_gfp_mask(inode->i_mapping)
+                                         | __GFP_COLD);
                if (page == NULL)
                        break;
                page_pool[npages] = page;
@@ -1445,10 +1480,9 @@ fail:
        goto out_unlock;
 }
 
-
 static int mdc_statfs(const struct lu_env *env,
                       struct obd_export *exp, struct obd_statfs *osfs,
-                      __u64 max_age, __u32 flags)
+                     time64_t max_age, __u32 flags)
 {
         struct obd_device     *obd = class_exp2obd(exp);
         struct ptlrpc_request *req;
@@ -1834,38 +1868,37 @@ static int mdc_ioc_hsm_ct_start(struct obd_export *exp,
 static int mdc_quotactl(struct obd_device *unused, struct obd_export *exp,
                         struct obd_quotactl *oqctl)
 {
-        struct ptlrpc_request   *req;
-        struct obd_quotactl     *oqc;
-        int                      rc;
-        ENTRY;
+       struct ptlrpc_request   *req;
+       struct obd_quotactl     *oqc;
+       int                      rc;
+       ENTRY;
 
-        req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp),
-                                        &RQF_MDS_QUOTACTL, LUSTRE_MDS_VERSION,
-                                        MDS_QUOTACTL);
-        if (req == NULL)
-                RETURN(-ENOMEM);
+       req = ptlrpc_request_alloc_pack(class_exp2cliimp(exp),
+                                       &RQF_MDS_QUOTACTL, LUSTRE_MDS_VERSION,
+                                       MDS_QUOTACTL);
+       if (req == NULL)
+               RETURN(-ENOMEM);
 
-        oqc = req_capsule_client_get(&req->rq_pill, &RMF_OBD_QUOTACTL);
-        *oqc = *oqctl;
+       oqc = req_capsule_client_get(&req->rq_pill, &RMF_OBD_QUOTACTL);
+       *oqc = *oqctl;
 
-        ptlrpc_request_set_replen(req);
-        ptlrpc_at_set_req_timeout(req);
-        req->rq_no_resend = 1;
+       ptlrpc_request_set_replen(req);
+       ptlrpc_at_set_req_timeout(req);
 
-        rc = ptlrpc_queue_wait(req);
-        if (rc)
-                CERROR("ptlrpc_queue_wait failed, rc: %d\n", rc);
-
-        if (req->rq_repmsg &&
-            (oqc = req_capsule_server_get(&req->rq_pill, &RMF_OBD_QUOTACTL))) {
-                *oqctl = *oqc;
-        } else if (!rc) {
-                CERROR ("Can't unpack obd_quotactl\n");
-                rc = -EPROTO;
-        }
-        ptlrpc_req_finished(req);
+       rc = ptlrpc_queue_wait(req);
+       if (rc)
+               CERROR("ptlrpc_queue_wait failed, rc: %d\n", rc);
+
+       if (req->rq_repmsg &&
+           (oqc = req_capsule_server_get(&req->rq_pill, &RMF_OBD_QUOTACTL))) {
+               *oqctl = *oqc;
+       } else if (!rc) {
+               CERROR ("Can't unpack obd_quotactl\n");
+               rc = -EPROTO;
+       }
+       ptlrpc_req_finished(req);
 
-        RETURN(rc);
+       RETURN(rc);
 }
 
 static int mdc_ioc_swap_layouts(struct obd_export *exp,
@@ -1994,7 +2027,7 @@ static int mdc_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                        GOTO(out, rc = -EFAULT);
 
                rc = mdc_statfs(NULL, obd->obd_self_export, &stat_buf,
-                               cfs_time_shift_64(-OBD_STATFS_CACHE_SECONDS),
+                               ktime_get_seconds() - OBD_STATFS_CACHE_SECONDS,
                                0);
                if (rc != 0)
                        GOTO(out, rc);
@@ -2158,7 +2191,8 @@ static int mdc_ioc_hsm_ct_start(struct obd_export *exp,
  * @param val KUC message (kuc_hdr + hsm_action_list)
  * @param len total length of message
  */
-static int mdc_hsm_copytool_send(size_t len, void *val)
+static int mdc_hsm_copytool_send(const struct obd_uuid *uuid,
+                                size_t len, void *val)
 {
        struct kuc_hdr          *lh = (struct kuc_hdr *)val;
        struct hsm_action_list  *hal = (struct hsm_action_list *)(lh + 1);
@@ -2184,7 +2218,7 @@ static int mdc_hsm_copytool_send(size_t len, void *val)
               lh->kuc_msglen, hal->hal_count, hal->hal_fsname);
 
        /* Broadcast to HSM listeners */
-       rc = libcfs_kkuc_group_put(KUC_GRP_HSM, lh);
+       rc = libcfs_kkuc_group_put(uuid, KUC_GRP_HSM, lh);
 
        RETURN(rc);
 }
@@ -2204,9 +2238,6 @@ static int mdc_hsm_ct_reregister(void *data, void *cb_arg)
        if (kcd == NULL || kcd->kcd_magic != KKUC_CT_DATA_MAGIC)
                return -EPROTO;
 
-       if (!obd_uuid_equals(&kcd->kcd_uuid, &imp->imp_obd->obd_uuid))
-               return 0;
-
        CDEBUG(D_HA, "%s: recover copytool registration to MDT (archive=%#x)\n",
               imp->imp_obd->obd_name, kcd->kcd_archive);
        rc = mdc_ioc_hsm_ct_register(imp, kcd->kcd_archive);
@@ -2222,8 +2253,8 @@ static int mdc_hsm_ct_reregister(void *data, void *cb_arg)
 static int mdc_kuc_reregister(struct obd_import *imp)
 {
        /* re-register HSM agents */
-       return libcfs_kkuc_group_foreach(KUC_GRP_HSM, mdc_hsm_ct_reregister,
-                                        (void *)imp);
+       return libcfs_kkuc_group_foreach(&imp->imp_obd->obd_uuid, KUC_GRP_HSM,
+                                        mdc_hsm_ct_reregister, imp);
 }
 
 static int mdc_set_info_async(const struct lu_env *env,
@@ -2262,7 +2293,8 @@ static int mdc_set_info_async(const struct lu_env *env,
                 RETURN(rc);
         }
         if (KEY_IS(KEY_HSM_COPYTOOL_SEND)) {
-                rc = mdc_hsm_copytool_send(vallen, val);
+               rc = mdc_hsm_copytool_send(&imp->imp_obd->obd_uuid, vallen,
+                                          val);
                 RETURN(rc);
         }
 
@@ -2522,14 +2554,9 @@ int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
        if (rc < 0)
                RETURN(rc);
 
-#ifdef CONFIG_PROC_FS
-       obd->obd_vars = lprocfs_mdc_obd_vars;
-       lprocfs_obd_setup(obd, false);
-       lprocfs_alloc_md_stats(obd, 0);
-#endif
-
-       sptlrpc_lprocfs_cliobd_attach(obd);
-       ptlrpc_lprocfs_register_obd(obd);
+       rc = mdc_tunables_init(obd);
+       if (rc)
+               GOTO(err_osc_cleanup, rc);
 
        ns_register_cancel(obd->obd_namespace, mdc_cancel_weight);
 
@@ -2554,9 +2581,9 @@ int mdc_setup(struct obd_device *obd, struct lustre_cfg *cfg)
 err_changelog_cleanup:
        mdc_llog_finish(obd);
 err_llog_cleanup:
-       ptlrpc_lprocfs_unregister_obd(obd);
        lprocfs_free_md_stats(obd);
-
+       ptlrpc_lprocfs_unregister_obd(obd);
+err_osc_cleanup:
        osc_cleanup_common(obd);
        return rc;
 }
@@ -2590,11 +2617,6 @@ static int mdc_precleanup(struct obd_device *obd)
        ENTRY;
 
        osc_precleanup_common(obd);
-
-       /* Failsafe, ok if racy */
-       if (obd->obd_type->typ_refcnt <= 1)
-               libcfs_kkuc_group_rem(0, KUC_GRP_HSM);
-
        mdc_changelog_cdev_finish(obd);
 
        obd_cleanup_client_import(obd);
@@ -2612,10 +2634,10 @@ static int mdc_cleanup(struct obd_device *obd)
 int mdc_process_config(struct obd_device *obd, size_t len, void *buf)
 {
        struct lustre_cfg *lcfg = buf;
-       int rc;
+       size_t count  = class_modify_config(lcfg, PARAM_MDC,
+                                           &obd->obd_kset.kobj);
 
-       rc = class_process_proc_param(PARAM_MDC, obd->obd_vars, lcfg, obd);
-       return (rc > 0 ? 0: rc);
+       return count > 0 ? 0 : count;
 }
 
 static struct obd_ops mdc_obd_ops = {