Whamcloud - gitweb
LU-15268 mdt: reveal the real intent close error code
authorBobi Jam <bobijam@whamcloud.com>
Thu, 13 Jan 2022 09:08:47 +0000 (17:08 +0800)
committerJohn L. Hammond <jhammond@whamcloud.com>
Fri, 21 Jan 2022 22:12:49 +0000 (22:12 +0000)
mdt_mfd_close() clobbers the intent close error so that user space
tool only knows that the close intent hasn't finished and reports
-EBUSY instead of the real error code.

Lustre-change: https://review.whamcloud.com/45636
Lustre-commit: TBD (from dc6dee1f5683ac91d637533b4c220617f62e60d2)

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I72f474a73e8b73cdc35ca38eaaec5af182f63ca7
Reviewed-on: https://review.whamcloud.com/46092
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: John L. Hammond <jhammond@whamcloud.com>
lustre/mdt/mdt_open.c
lustre/tests/sanity-flr.sh

index 731b665..d7d47fd 100644 (file)
@@ -2362,7 +2362,13 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
        struct md_object *next = mdt_object_child(o);
        struct md_attr *ma = &info->mti_attr;
        struct lu_fid *ofid = &info->mti_tmp_fid1;
+       /* major intent error code, need to return if possible */
        int rc = 0;
+       /* minor error code, status updating error */
+       int rc2 = 0;
+       /* close error code */
+       int rc3 = 0;
+       int rc_tmp;
        u64 open_flags;
        u64 intent;
 
@@ -2394,8 +2400,11 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
                rc = mdt_close_handle_layouts(info, o, ma);
                if (rc < 0) {
                        CDEBUG(D_INODE,
-                              "%s: cannot swap layout of "DFID": rc = %d\n",
+                              "%s: cannot %s layout of "DFID": rc = %d\n",
                               mdt_obd_name(info->mti_mdt),
+                              intent == MDS_CLOSE_LAYOUT_MERGE ? "merge" :
+                              intent == MDS_CLOSE_LAYOUT_SPLIT ? "split" :
+                              "swap",
                               PFID(ofid), rc);
                        /* continue to close even if error occurred. */
                }
@@ -2403,6 +2412,12 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
        }
        case MDS_CLOSE_RESYNC_DONE:
                rc = mdt_close_resync_done(info, o, ma);
+               if (rc < 0) {
+                       CDEBUG(D_INODE,
+                              "%s: cannot resync layout of "DFID": rc = %d\n",
+                              mdt_obd_name(info->mti_mdt),
+                              PFID(ofid), rc);
+               }
                break;
        default:
                /* nothing */
@@ -2411,15 +2426,12 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
 
        if (S_ISREG(lu_object_attr(&o->mot_obj)) &&
            ma->ma_attr.la_valid & (LA_LSIZE | LA_LBLOCKS)) {
-               int rc2;
-
                rc2 = mdt_lsom_update(info, o, false);
                if (rc2 < 0)
                        CDEBUG(D_INODE,
                               "%s: File " DFID " LSOM failed: rc = %d\n",
                               mdt_obd_name(info->mti_mdt),
                               PFID(ofid), rc2);
-                       /* continue to close even if error occured. */
        }
 
        if (open_flags & MDS_FMODE_WRITE)
@@ -2438,27 +2450,47 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
                ma->ma_attr.la_valid &= (LA_ATIME | LA_MTIME | LA_CTIME);
 
                if (ma->ma_attr.la_valid & LA_MTIME) {
-                       rc = mdt_attr_get_pfid(info, o, &ma->ma_pfid);
-                       if (!rc)
+                       rc_tmp = mdt_attr_get_pfid(info, o, &ma->ma_pfid);
+                       if (rc_tmp == 0)
                                ma->ma_valid |= MA_PFID;
                }
 
-               rc = mo_attr_set(info->mti_env, next, ma);
+               rc_tmp = mo_attr_set(info->mti_env, next, ma);
+               if (rc_tmp != 0) {
+                       CDEBUG(D_INODE,
+                          "%s: File "DFID" set attr (%#llx) failed: rc = %d\n",
+                              mdt_obd_name(info->mti_mdt), PFID(ofid),
+                              ma->ma_attr.la_valid, rc_tmp);
+                       if (rc2 == 0)
+                               rc2 = rc_tmp;
+               }
        }
 
        /* If file data is modified, add the dirty flag. */
-       if (ma->ma_attr_flags & MDS_DATA_MODIFIED)
-               rc = mdt_add_dirty_flag(info, o, ma);
+       if (ma->ma_attr_flags & MDS_DATA_MODIFIED) {
+               rc_tmp = mdt_add_dirty_flag(info, o, ma);
+               if (rc_tmp != 0) {
+                       CDEBUG(D_INODE,
+                            "%s: File "DFID" add dirty flag failed: rc = %d\n",
+                              mdt_obd_name(info->mti_mdt), PFID(ofid), rc_tmp);
+                       if (rc2 == 0)
+                               rc2 = rc_tmp;
+               }
+       }
 
-        ma->ma_need |= MA_INODE;
-        ma->ma_valid &= ~MA_INODE;
+       ma->ma_need |= MA_INODE;
+       ma->ma_valid &= ~MA_INODE;
 
        LASSERT(atomic_read(&o->mot_open_count) > 0);
        atomic_dec(&o->mot_open_count);
        mdt_handle_last_unlink(info, o, ma);
 
        if (!MFD_CLOSED(open_flags)) {
-               rc = mo_close(info->mti_env, next, ma, open_flags);
+               rc3 = mo_close(info->mti_env, next, ma, open_flags);
+               if (rc3 != 0)
+                       CDEBUG(D_INODE,
+                              "%s: File "DFID" close failed: rc = %d\n",
+                              mdt_obd_name(info->mti_mdt), PFID(ofid), rc2);
                if (mdt_dom_check_for_discard(info, o))
                        mdt_dom_discard_data(info, o);
        }
@@ -2472,7 +2504,7 @@ int mdt_mfd_close(struct mdt_thread_info *info, struct mdt_file_data *mfd)
        mdt_mfd_free(mfd);
        mdt_object_put(info->mti_env, o);
 
-       RETURN(rc);
+       RETURN(rc ?: rc2 ?: rc3);
 }
 
 int mdt_close_internal(struct mdt_thread_info *info, struct ptlrpc_request *req,
@@ -2509,11 +2541,12 @@ int mdt_close(struct tgt_session_info *tsi)
 {
        struct mdt_thread_info  *info = tsi2mdt_info(tsi);
        struct ptlrpc_request   *req = tgt_ses_req(tsi);
-        struct md_attr         *ma = &info->mti_attr;
-        struct mdt_body        *repbody = NULL;
+       struct md_attr         *ma = &info->mti_attr;
+       struct mdt_body        *repbody = NULL;
        ktime_t                 kstart = ktime_get();
-        int rc, ret = 0;
-        ENTRY;
+       int rc, rc_close = 0;
+
+       ENTRY;
 
        /* Close may come with the Size-on-MDS update. Unpack it. */
        rc = mdt_close_unpack(info);
@@ -2551,14 +2584,14 @@ int mdt_close(struct tgt_session_info *tsi)
                rc = err_serious(rc);
        }
 
-       rc = mdt_close_internal(info, req, repbody);
-       if (rc != -ESTALE)
-               mdt_empty_transno(info, rc);
+       rc_close = mdt_close_internal(info, req, repbody);
+       if (rc_close != -ESTALE)
+               mdt_empty_transno(info, rc_close);
 
-        if (repbody != NULL) {
-                mdt_client_compatibility(info);
-                rc = mdt_fix_reply(info);
-        }
+       if (repbody != NULL) {
+               mdt_client_compatibility(info);
+               mdt_fix_reply(info);
+       }
 
        mdt_exit_ucred(info);
        if (OBD_FAIL_CHECK(OBD_FAIL_MDS_CLOSE_PACK))
@@ -2572,5 +2605,5 @@ out:
        if (rc == 0)
                mdt_counter_incr(req, LPROC_MDT_CLOSE,
                                 ktime_us_delta(ktime_get(), kstart));
-       RETURN(rc ? rc : ret);
+       RETURN(rc_close ?: rc);
 }
index a46aaee..02fe6e3 100644 (file)
@@ -459,8 +459,10 @@ test_0d() {
                verify_comp_extent $tf-1 ${ids[$i]} 0 EOF
        done
 
-       $mirror_cmd -N $tf-1 &> /dev/null &&
-               error "exceeded maximum mirror count $mirror_count" || true
+       $mirror_cmd -N $tf-1 &> /dev/null
+       rc=$?
+       [[ $rc == 34 ]] ||
+               error "exceeded maximum mirror count returns $rc not ERANGE(34)"
 }
 run_test 0d "lfs mirror extend with -N option"