Whamcloud - gitweb
LU-12616 obclass: fix MDS start/stop race
[fs/lustre-release.git] / lustre / mdc / mdc_reint.c
index 03e6aac..07c3e05 100644 (file)
@@ -60,15 +60,16 @@ static int mdc_reint(struct ptlrpc_request *request, int level)
 /* Find and cancel locally locks matched by inode @bits & @mode in the resource
  * found by @fid. Found locks are added into @cancel list. Returns the amount of
  * locks added to @cancels list. */
-int mdc_resource_get_unused(struct obd_export *exp, const struct lu_fid *fid,
-                           struct list_head *cancels, enum ldlm_mode mode,
-                           __u64 bits)
+int mdc_resource_get_unused_res(struct obd_export *exp,
+                               struct ldlm_res_id *res_id,
+                               struct list_head *cancels,
+                               enum ldlm_mode mode, __u64 bits)
 {
        struct ldlm_namespace *ns = exp->exp_obd->obd_namespace;
-       union ldlm_policy_data policy = { {0} };
-       struct ldlm_res_id res_id;
+       union ldlm_policy_data policy = { { 0 } };
        struct ldlm_resource *res;
        int count;
+
        ENTRY;
 
        /* Return, i.e. cancel nothing, only if ELC is supported (flag in
@@ -80,21 +81,29 @@ int mdc_resource_get_unused(struct obd_export *exp, const struct lu_fid *fid,
        if (exp_connect_cancelset(exp) && !ns_connect_cancelset(ns))
                RETURN(0);
 
-       fid_build_reg_res_name(fid, &res_id);
-       res = ldlm_resource_get(exp->exp_obd->obd_namespace,
-                               NULL, &res_id, 0, 0);
+       res = ldlm_resource_get(ns, NULL, res_id, 0, 0);
        if (IS_ERR(res))
                RETURN(0);
        LDLM_RESOURCE_ADDREF(res);
        /* Initialize ibits lock policy. */
        policy.l_inodebits.bits = bits;
-       count = ldlm_cancel_resource_local(res, cancels, &policy,
-                                          mode, 0, 0, NULL);
+       count = ldlm_cancel_resource_local(res, cancels, &policy, mode, 0, 0,
+                                          NULL);
        LDLM_RESOURCE_DELREF(res);
        ldlm_resource_putref(res);
        RETURN(count);
 }
 
+int mdc_resource_get_unused(struct obd_export *exp, const struct lu_fid *fid,
+                           struct list_head *cancels, enum ldlm_mode mode,
+                           __u64 bits)
+{
+       struct ldlm_res_id res_id;
+
+       fid_build_reg_res_name(fid, &res_id);
+       return mdc_resource_get_unused_res(exp, &res_id, cancels, mode, bits);
+}
+
 int mdc_setattr(struct obd_export *exp, struct md_op_data *op_data,
                void *ea, size_t ealen, struct ptlrpc_request **request)
 {
@@ -136,9 +145,8 @@ int mdc_setattr(struct obd_export *exp, struct md_op_data *op_data,
                       (s64)op_data->op_attr.ia_ctime.tv_sec);
        mdc_setattr_pack(req, op_data, ea, ealen);
 
-       req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER,
-                            MIN(req->rq_import->imp_connect_data.ocd_max_easize,
-                                XATTR_SIZE_MAX));
+       req_capsule_set_size(&req->rq_pill, &RMF_ACL, RCL_SERVER, 0);
+
         ptlrpc_request_set_replen(req);
 
        rc = mdc_reint(req, LUSTRE_IMP_FULL);
@@ -202,6 +210,16 @@ rebuild:
        req_capsule_set_size(&req->rq_pill, &RMF_FILE_SECCTX, RCL_CLIENT,
                             op_data->op_file_secctx_size);
 
+       /* get SELinux policy info if any */
+       rc = sptlrpc_get_sepol(req);
+       if (rc < 0) {
+               ptlrpc_request_free(req);
+               RETURN(rc);
+       }
+       req_capsule_set_size(&req->rq_pill, &RMF_SELINUX_POL, RCL_CLIENT,
+                            strlen(req->rq_sepol) ?
+                            strlen(req->rq_sepol) + 1 : 0);
+
        rc = mdc_prep_elc_req(exp, req, MDS_REINT, &cancels, count);
        if (rc) {
                ptlrpc_request_free(req);
@@ -290,6 +308,16 @@ int mdc_unlink(struct obd_export *exp, struct md_op_data *op_data,
         req_capsule_set_size(&req->rq_pill, &RMF_NAME, RCL_CLIENT,
                              op_data->op_namelen + 1);
 
+       /* get SELinux policy info if any */
+       rc = sptlrpc_get_sepol(req);
+       if (rc < 0) {
+               ptlrpc_request_free(req);
+               RETURN(rc);
+       }
+       req_capsule_set_size(&req->rq_pill, &RMF_SELINUX_POL, RCL_CLIENT,
+                            strlen(req->rq_sepol) ?
+                            strlen(req->rq_sepol) + 1 : 0);
+
        rc = mdc_prep_elc_req(exp, req, MDS_REINT, &cancels, count);
        if (rc) {
                ptlrpc_request_free(req);
@@ -338,6 +366,16 @@ int mdc_link(struct obd_export *exp, struct md_op_data *op_data,
         req_capsule_set_size(&req->rq_pill, &RMF_NAME, RCL_CLIENT,
                              op_data->op_namelen + 1);
 
+       /* get SELinux policy info if any */
+       rc = sptlrpc_get_sepol(req);
+       if (rc < 0) {
+               ptlrpc_request_free(req);
+               RETURN(rc);
+       }
+       req_capsule_set_size(&req->rq_pill, &RMF_SELINUX_POL, RCL_CLIENT,
+                            strlen(req->rq_sepol) ?
+                            strlen(req->rq_sepol) + 1 : 0);
+
        rc = mdc_prep_elc_req(exp, req, MDS_REINT, &cancels, count);
        if (rc) {
                ptlrpc_request_free(req);
@@ -401,6 +439,16 @@ int mdc_rename(struct obd_export *exp, struct md_op_data *op_data,
                req_capsule_set_size(&req->rq_pill, &RMF_EADATA, RCL_CLIENT,
                                     op_data->op_data_size);
 
+       /* get SELinux policy info if any */
+       rc = sptlrpc_get_sepol(req);
+       if (rc < 0) {
+               ptlrpc_request_free(req);
+               RETURN(rc);
+       }
+       req_capsule_set_size(&req->rq_pill, &RMF_SELINUX_POL, RCL_CLIENT,
+                            strlen(req->rq_sepol) ?
+                            strlen(req->rq_sepol) + 1 : 0);
+
        rc = mdc_prep_elc_req(exp, req, MDS_REINT, &cancels, count);
        if (rc) {
                ptlrpc_request_free(req);