From 2e4e60234028743404a302893fb1aa9f8d6a95e7 Mon Sep 17 00:00:00 2001 From: Li Xi Date: Mon, 12 Jun 2017 15:32:29 +0800 Subject: [PATCH] LU-9654 mdt: fix problem of RAoLU HSM policy 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. Signed-off-by: Li Xi Change-Id: I9ba561cadcc40baf5e28172cfda699cdecce7ea8 Reviewed-on: https://review.whamcloud.com/27564 Tested-by: Jenkins Tested-by: Maloo Reviewed-by: Faccini Bruno Reviewed-by: Wang Shilong Reviewed-by: Oleg Drokin --- lustre/mdt/mdt_lib.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/lustre/mdt/mdt_lib.c b/lustre/mdt/mdt_lib.c index bdad584..07f3671 100644 --- a/lustre/mdt/mdt_lib.c +++ b/lustre/mdt/mdt_lib.c @@ -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 -- 1.8.3.1