Whamcloud - gitweb
LU-220 open: try open_by_fid for the known object
authorFan Yong <yong.fan@whamcloud.com>
Wed, 25 Jul 2012 05:20:06 +0000 (13:20 +0800)
committerOleg Drokin <green@whamcloud.com>
Fri, 27 Jul 2012 05:16:40 +0000 (01:16 -0400)
If the current path for thread1 on client1 is renamed by thread2
on client2, then when thread1 tries to open its current path, it
should use the fid, but not the name. Otherwise, the open on MDS
will hit unexpected "-ENOENT".

Signed-off-by: Fan Yong <yong.fan@whamcloud.com>
Change-Id: I905113167ebd6fe5f0185007d0e9c77083342680
Reviewed-on: http://review.whamcloud.com/2493
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/include/lustre/lustre_idl.h
lustre/llite/file.c
lustre/mdc/mdc_lib.c
lustre/mdt/mdt_open.c
lustre/ptlrpc/wiretest.c
lustre/utils/wirecheck.c
lustre/utils/wiretest.c

index 4c854cf..e2e29d9 100644 (file)
@@ -1926,6 +1926,7 @@ extern void lustre_swab_mdt_rec_setattr (struct mdt_rec_setattr *sa);
 #define MDS_OPEN_SYNC            00010000
 #define MDS_OPEN_DIRECTORY       00200000
 
+#define MDS_OPEN_BY_FID        040000000 /* open_by_fid for known object */
 #define MDS_OPEN_DELAY_CREATE  0100000000 /* delay initial object create */
 #define MDS_OPEN_OWNEROVERRIDE 0200000000 /* NFSD rw-reopen ro file for owner */
 #define MDS_OPEN_JOIN_FILE     0400000000 /* open for join file.
index fa1a76a..4afdd0f 100644 (file)
@@ -372,6 +372,7 @@ static int ll_intent_file_open(struct file *file, void *lmm,
         if (IS_ERR(op_data))
                 RETURN(PTR_ERR(op_data));
 
+       itp->it_flags |= MDS_OPEN_BY_FID;
         rc = md_intent_lock(sbi->ll_md_exp, op_data, lmm, lmmsize, itp,
                             0 /*unused */, &req, ll_md_blocking_ast, 0);
         ll_finish_md_op_data(op_data);
index da55316..9e9b829 100644 (file)
@@ -166,9 +166,10 @@ void mdc_create_pack(struct ptlrpc_request *req, struct md_op_data *op_data,
 
 static __u64 mds_pack_open_flags(__u32 flags, __u32 mode)
 {
-        __u64 cr_flags = (flags & (FMODE_READ | FMODE_WRITE |
-                                   MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS | 
-                                   MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK));
+       __u64 cr_flags = (flags & (FMODE_READ | FMODE_WRITE |
+                                  MDS_OPEN_HAS_EA | MDS_OPEN_HAS_OBJS |
+                                  MDS_OPEN_OWNEROVERRIDE | MDS_OPEN_LOCK |
+                                  MDS_OPEN_BY_FID));
         if (flags & O_CREAT)
                 cr_flags |= MDS_OPEN_CREAT;
         if (flags & O_EXCL)
index 613a681..7f90392 100644 (file)
@@ -1273,33 +1273,30 @@ int mdt_reint_open(struct mdt_thread_info *info, struct mdt_lock_handle *lhc)
                PFID(rr->rr_fid2), create_flags,
                ma->ma_attr.la_mode, msg_flags);
 
-        if (req_is_replay(req) ||
-            (req->rq_export->exp_libclient && create_flags&MDS_OPEN_HAS_EA)) {
-                /* This is a replay request or from liblustre with ea. */
-                result = mdt_open_by_fid(info, ldlm_rep);
-
-                if (result != -ENOENT) {
-                        if (req->rq_export->exp_libclient &&
-                            create_flags & MDS_OPEN_HAS_EA)
-                                GOTO(out, result = 0);
-                        GOTO(out, result);
-                }
-                /*
-                 * We didn't find the correct object, so we need to re-create it
-                 * via a regular replay.
-                 */
-                if (!(create_flags & MDS_OPEN_CREAT)) {
-                        DEBUG_REQ(D_ERROR, req,
-                                  "OPEN & CREAT not in open replay.");
-                        GOTO(out, result = -EFAULT);
-                }
-                CDEBUG(D_INFO, "Open replay did find object, continue as "
-                       "regular open\n");
-        } else if (rr->rr_namelen == 0 && !info->mti_cross_ref &&
-                   create_flags & MDS_OPEN_LOCK) {
-                result = mdt_open_anon_by_fid(info, ldlm_rep, lhc);
-                GOTO(out, result);
-        }
+       if ((create_flags & MDS_OPEN_BY_FID) || req_is_replay(req) ||
+           (req->rq_export->exp_libclient && create_flags & MDS_OPEN_HAS_EA)) {
+               /* This is a replay request or from liblustre with ea. */
+               result = mdt_open_by_fid(info, ldlm_rep);
+
+               if (result != -ENOENT) {
+                       if (req->rq_export->exp_libclient &&
+                           create_flags & MDS_OPEN_HAS_EA)
+                               GOTO(out, result = 0);
+                       GOTO(out, result);
+               }
+               /* We didn't find the correct object, so we need to re-create it
+                * via a regular replay. */
+               if (!(create_flags & (MDS_OPEN_CREAT | MDS_OPEN_BY_FID))) {
+                       DEBUG_REQ(D_ERROR, req,
+                                 "OPEN & CREAT not in open replay/by_fid.");
+                       GOTO(out, result = -EFAULT);
+               }
+               CDEBUG(D_INFO, "No object, continue as regular open.\n");
+       } else if (rr->rr_namelen == 0 && !info->mti_cross_ref &&
+                  create_flags & MDS_OPEN_LOCK) {
+               result = mdt_open_anon_by_fid(info, ldlm_rep, lhc);
+               GOTO(out, result);
+       }
 
         if (OBD_FAIL_CHECK(OBD_FAIL_MDS_OPEN_PACK))
                 GOTO(out, result = err_serious(-ENOMEM));
index 29ca1f4..2364570 100644 (file)
@@ -1847,6 +1847,8 @@ void lustre_assert_wire_constants(void)
                  MDS_OPEN_SYNC);
         LASSERTF(MDS_OPEN_DIRECTORY == 000000200000UL, "found 0%.11oUL\n",
                  MDS_OPEN_DIRECTORY);
+       LASSERTF(MDS_OPEN_BY_FID == 000040000000UL, "found 0%.11oUL\n",
+                MDS_OPEN_BY_FID);
         LASSERTF(MDS_OPEN_DELAY_CREATE == 000100000000UL, "found 0%.11oUL\n",
                  MDS_OPEN_DELAY_CREATE);
         LASSERTF(MDS_OPEN_OWNEROVERRIDE == 000200000000UL, "found 0%.11oUL\n",
index feb424a..2c4b4fc 100644 (file)
@@ -822,6 +822,7 @@ check_mdt_body(void)
         CHECK_VALUE_O(MDS_OPEN_APPEND);
         CHECK_VALUE_O(MDS_OPEN_SYNC);
         CHECK_VALUE_O(MDS_OPEN_DIRECTORY);
+        CHECK_VALUE_O(MDS_OPEN_BY_FID);
         CHECK_VALUE_O(MDS_OPEN_DELAY_CREATE);
         CHECK_VALUE_O(MDS_OPEN_OWNEROVERRIDE);
         CHECK_VALUE_O(MDS_OPEN_JOIN_FILE);
index fdea140..b6d5d93 100644 (file)
@@ -1855,6 +1855,8 @@ void lustre_assert_wire_constants(void)
                  MDS_OPEN_SYNC);
         LASSERTF(MDS_OPEN_DIRECTORY == 000000200000UL, "found 0%.11oUL\n",
                  MDS_OPEN_DIRECTORY);
+       LASSERTF(MDS_OPEN_BY_FID == 000040000000UL, "found 0%.11oUL\n",
+                MDS_OPEN_BY_FID);
         LASSERTF(MDS_OPEN_DELAY_CREATE == 000100000000UL, "found 0%.11oUL\n",
                  MDS_OPEN_DELAY_CREATE);
         LASSERTF(MDS_OPEN_OWNEROVERRIDE == 000200000000UL, "found 0%.11oUL\n",