Whamcloud - gitweb
LU-9654 mdt: fix problem of RAoLU HSM policy 20/28220/2
authorLi Xi <lixi@ddn.com>
Mon, 12 Jun 2017 07:32:29 +0000 (15:32 +0800)
committerJohn L. Hammond <john.hammond@intel.com>
Thu, 14 Sep 2017 20:05:53 +0000 (20:05 +0000)
mdt_attr_get_complex() clears all known attributes even they are
already valid. So in mdt_handle_last_unlink(), the valid attributes
of HSM or nlink should be checked before calling that function.

Lustre-change: https://review.whamcloud.com/27564
Lustre-commit: 2e4e60234028743404a302893fb1aa9f8d6a95e7

Signed-off-by: Li Xi <lixi@ddn.com>
Change-Id: I9ba561cadcc40baf5e28172cfda699cdecce7ea8
Reviewed-by: Faccini Bruno <bruno.faccini@intel.com>
Reviewed-by: Wang Shilong <wshilong@ddn.com>
Signed-off-by: Minh Diep <minh.diep@intel.com>
Reviewed-on: https://review.whamcloud.com/28220
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
lustre/mdt/mdt_lib.c

index bdad584..07f3671 100644 (file)
@@ -823,6 +823,13 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
            atomic_read(&mo->mot_open_count) != 0)
                RETURN(0);
 
+       /* mdt_attr_get_complex will clear ma_valid, so check here first */
+       if ((ma->ma_valid & MA_INODE) && (ma->ma_attr.la_nlink != 0))
+               RETURN(0);
+
+       if ((ma->ma_valid & MA_HSM) && (!(ma->ma_hsm.mh_flags & HS_EXISTS)))
+               RETURN(0);
+
        need |= (MA_INODE | MA_HSM) & ~ma->ma_valid;
        if (need != 0) {
                /* ma->ma_valid is missing either MA_INODE, MA_HSM, or both,
@@ -835,14 +842,25 @@ int mdt_handle_last_unlink(struct mdt_thread_info *info, struct mdt_object *mo,
                               PFID(mdt_object_fid(mo)), rc);
                        RETURN(0);
                }
-       }
-       /* Assume ma->ma_valid & MA_INODE is true, cf. mdt_attr_get_complex() */
-       if (ma->ma_attr.la_nlink != 0)
-               RETURN(0);
 
-       /* ma->ma_valid & MA_HSM may still be false */
-       if (!(ma->ma_valid & MA_HSM && ma->ma_hsm.mh_flags & HS_EXISTS))
-               RETURN(0);
+               if (need & MA_INODE) {
+                       if (ma->ma_valid & MA_INODE) {
+                               if (ma->ma_attr.la_nlink != 0)
+                                       RETURN(0);
+                       } else {
+                               RETURN(0);
+                       }
+               }
+
+               if (need & MA_HSM) {
+                       if (ma->ma_valid & MA_HSM) {
+                               if (!(ma->ma_hsm.mh_flags & HS_EXISTS))
+                                       RETURN(0);
+                       } else {
+                               RETURN(0);
+                       }
+               }
+       }
 
        /* RAoLU policy is active, last close on file has occured,
         * file is unlinked, file is archived, so create remove request