Whamcloud - gitweb
LU-3181 mdt: mdt_cross_open should allow open by FID on MDT1
[fs/lustre-release.git] / lustre / mdt / mdt_open.c
index 6a2d5ea..62e2aa2 100644 (file)
@@ -1246,29 +1246,30 @@ static int mdt_object_open_lock(struct mdt_thread_info *info,
                /* normal open holds read mode of open sem */
                down_read(&obj->mot_open_sem);
 
-               if (open_flags & FMODE_WRITE)
-                       lm = LCK_CW;
-               else if (open_flags & MDS_FMODE_EXEC)
-                       lm = LCK_PR;
-               else
-                       lm = LCK_CR;
-
                if (open_flags & MDS_OPEN_LOCK) {
+                       if (open_flags & FMODE_WRITE)
+                               lm = LCK_CW;
+                       else if (open_flags & MDS_FMODE_EXEC)
+                               lm = LCK_PR;
+                       else
+                               lm = LCK_CR;
+
                        *ibits = MDS_INODELOCK_LOOKUP | MDS_INODELOCK_OPEN;
-               } else if (open_flags & (FMODE_WRITE | MDS_FMODE_EXEC) ||
-                          atomic_read(&obj->mot_lease_count) > 0) {
-                       /* We need to flush conflicting locks or revoke a lease.
-                        * In either case there is no need to acquire a layout
-                        * lock since it won't be returned to the client. */
-                       try_layout = false;
+               } else if (atomic_read(&obj->mot_lease_count) > 0) {
+                       if (open_flags & FMODE_WRITE)
+                               lm = LCK_CW;
+                       else
+                               lm = LCK_CR;
+
+                       /* revoke lease */
                        *ibits = MDS_INODELOCK_OPEN;
+                       try_layout = false;
+
                        lhc = &info->mti_lh[MDT_LH_LOCAL];
                }
-
-               CDEBUG(D_INODE, "normal open FID = "DFID", open_count = %d, "
-                      "lm = %d\n",
-                      PFID(mdt_object_fid(obj)),
-                      atomic_read(&obj->mot_open_count), lm);
+               CDEBUG(D_INODE, "normal open:"DFID" lease count: %d, lm: %d\n",
+                       PFID(mdt_object_fid(obj)),
+                       atomic_read(&obj->mot_open_count), lm);
        }
 
        mdt_lock_reg_init(lhc, lm);
@@ -1460,9 +1461,9 @@ int mdt_open_by_fid_lock(struct mdt_thread_info *info, struct ldlm_reply *rep,
                         ma->ma_need |= MA_PFID;
         }
 
-        o = mdt_object_find(env, mdt, rr->rr_fid2);
-        if (IS_ERR(o))
-                RETURN(rc = PTR_ERR(o));
+       o = mdt_object_find(env, mdt, rr->rr_fid2);
+       if (IS_ERR(o))
+               GOTO(out_parent_put, rc = PTR_ERR(o));
 
        if (mdt_object_remote(o)) {
                CDEBUG(D_INFO, "%s: "DFID" is on remote MDT.\n",
@@ -1525,6 +1526,7 @@ out_unlock:
        mdt_object_open_unlock(info, o, lhc, ibits, rc);
 out:
        mdt_object_put(env, o);
+out_parent_put:
        if (parent != NULL)
                mdt_object_put(env, parent);
        return rc;
@@ -1568,13 +1570,6 @@ static int mdt_cross_open(struct mdt_thread_info *info,
                        if (rc != 0)
                                GOTO(out, rc);
 
-                       /* Do not create lov object if the fid is opened
-                        * under OBF */
-                       if (S_ISREG(ma->ma_attr.la_mode) &&
-                           !(ma->ma_valid & MA_LOV) && (flags & FMODE_WRITE) &&
-                           fid_is_obf(parent_fid))
-                               GOTO(out, rc = -EPERM);
-
                        rc = mdt_finish_open(info, NULL, o, flags, 0, rep);
                } else {
                        /*
@@ -1665,23 +1660,16 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc)
                        GOTO(out, result = -EFAULT);
                }
                CDEBUG(D_INFO, "No object(1), continue as regular open.\n");
-       } else if ((!lu_name_is_valid(&rr->rr_name) &&
-                   (create_flags & MDS_OPEN_LOCK)) ||
-                  (create_flags & MDS_OPEN_BY_FID)) {
+       } else if (create_flags & (MDS_OPEN_BY_FID | MDS_OPEN_LOCK)) {
+               /*
+                * MDS_OPEN_LOCK is checked for backward compatibility with 2.1
+                * client.
+                */
                result = mdt_open_by_fid_lock(info, ldlm_rep, lhc);
-               /* If result is 0 then open by FID has found the file
-                * and there is nothing left for us to do here.  More
-                * generally if it is anything other than -ENOENT or
-                * -EREMOTE then we return that now.  If -ENOENT and
-                * MDS_OPEN_CREAT is set then we must create the file
-                * below.  If -EREMOTE then we need to return a LOOKUP
-                * lock to the client, which we do below.  Hence this
-                * odd looking condition.  See LU-2523. */
-               if (!(result == -ENOENT && (create_flags & MDS_OPEN_CREAT)) &&
-                   result != -EREMOTE)
-                       GOTO(out, result);
-
-               CDEBUG(D_INFO, "No object(2), continue as regular open.\n");
+               if (result < 0)
+                       CDEBUG(D_INFO, "no object for "DFID": %d\n",
+                              PFID(rr->rr_fid2), result);
+               GOTO(out, result);
        }
 
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK))