Whamcloud - gitweb
LU-13456 ldlm: fix reprocessing of locks with more bits
[fs/lustre-release.git] / lustre / mdt / mdt_open.c
index d1392e5..bc5ad6a 100644 (file)
@@ -867,8 +867,8 @@ static int mdt_object_open_lock(struct mdt_thread_info *info,
                        GOTO(out, rc = -EPROTO);
                }
 
-               /* XXX: only exclusive open is supported. */
-               lm = LCK_EX;
+               /* should conflict with new opens for write/execute */
+               lm = LCK_PW;
                *ibits = MDS_INODELOCK_OPEN;
 
                /* never grant LCK_EX layout lock to client */
@@ -986,8 +986,11 @@ static int mdt_object_open_lock(struct mdt_thread_info *info,
                        PFID(mdt_object_fid(obj)),
                        atomic_read(&obj->mot_open_count), open_count);
 
-               if (atomic_read(&obj->mot_open_count) > open_count)
-                       GOTO(out, rc = -EBUSY);
+               if (atomic_read(&obj->mot_open_count) > open_count) {
+                       /* fail if anyone *else* has opened file for write */
+                       if (mdt_write_read(obj) > 1)
+                               GOTO(out, rc = -EBUSY);
+               }
        }
        GOTO(out, rc);
 
@@ -1668,7 +1671,7 @@ static struct mdt_object *mdt_orphan_open(struct mdt_thread_info *info,
                .ln_namelen = sizeof("i_am_nobody") - 1,
        };
        struct lu_ucred *uc;
-       cfs_cap_t uc_cap_save;
+       kernel_cap_t uc_cap_save;
        int rc;
        ENTRY;
 
@@ -1697,7 +1700,7 @@ static struct mdt_object *mdt_orphan_open(struct mdt_thread_info *info,
 
        uc = lu_ucred(env);
        uc_cap_save = uc->uc_cap;
-       uc->uc_cap |= BIT(CAP_DAC_OVERRIDE);
+       cap_raise(uc->uc_cap, CAP_DAC_OVERRIDE);
        rc = mdo_create(env, mdt_object_child(local_root), &lname,
                        mdt_object_child(obj), spec, attr);
        uc->uc_cap = uc_cap_save;
@@ -1776,7 +1779,7 @@ static int mdt_hsm_release(struct mdt_thread_info *info, struct mdt_object *o,
        struct mdt_object      *orphan;
        struct md_attr         *orp_ma;
        struct lu_buf          *buf;
-       cfs_cap_t               cap;
+       kernel_cap_t cap;
        bool                    lease_broken;
        int                     rc;
        int                     rc2;
@@ -1969,7 +1972,7 @@ static int mdt_hsm_release(struct mdt_thread_info *info, struct mdt_object *o,
        /* The orphan has root ownership so we need to raise
         * CAP_FOWNER to set the HSM attributes. */
        cap = uc->uc_cap;
-       uc->uc_cap |= MD_CAP_TO_MASK(CAP_FOWNER);
+       cap_raise(uc->uc_cap, CAP_FOWNER);
        rc = mo_xattr_set(info->mti_env, mdt_object_child(orphan), buf,
                          XATTR_NAME_HSM, 0);
        uc->uc_cap = cap;
@@ -2022,7 +2025,8 @@ out_unlock:
        }
 
 out_reprocess:
-       ldlm_reprocess_all(lease->l_resource, lease);
+       ldlm_reprocess_all(lease->l_resource,
+                          lease->l_policy_data.l_inodebits.bits);
        LDLM_LOCK_PUT(lease);
 
        ma->ma_valid = 0;
@@ -2232,7 +2236,8 @@ out_obj:
                /* the 2nd object has been used, and not swapped */
                mdt_object_put(info->mti_env, o2);
 
-       ldlm_reprocess_all(lease->l_resource, lease);
+       ldlm_reprocess_all(lease->l_resource,
+                          lease->l_policy_data.l_inodebits.bits);
 
 out_lease:
        LDLM_LOCK_PUT(lease);
@@ -2269,7 +2274,7 @@ static int mdt_close_resync_done(struct mdt_thread_info *info,
        if (data == NULL)
                RETURN(-EPROTO);
 
-       if (ptlrpc_req_need_swab(mdt_info_req(info)))
+       if (req_capsule_req_need_swab(info->mti_pill))
                lustre_swab_close_data_resync_done(&data->cd_resync);
 
        if (!fid_is_zero(&data->cd_fid))
@@ -2353,7 +2358,8 @@ out_unlock:
                OBD_FREE_PTR_ARRAY(resync_ids, resync_count);
 
 out_reprocess:
-       ldlm_reprocess_all(lease->l_resource, lease);
+       ldlm_reprocess_all(lease->l_resource,
+                          lease->l_policy_data.l_inodebits.bits);
        LDLM_LOCK_PUT(lease);
 
        ma->ma_valid = 0;