From 1299c5d5f92a7086b48b721d35bfce9ded177b94 Mon Sep 17 00:00:00 2001 From: Wang Shilong Date: Thu, 6 Jun 2019 10:36:39 +0800 Subject: [PATCH] LU-12383 utils: only check project inherit bit for dir Currently, ZFS won't set inherit bit on regular files, but ext4 always set it, it doesn't make sense for regular files have this bit, but own it won't do any harm as well. To make test happy and give a consistent view on users, let's fix project check only complain erros for Direcotry. Lustre-change: https://review.whamcloud.com/35076 Lustre-commit: e4ad5c17c99e7ede5deabffe0bacdd851240eb86 Test-Parameters: trivial testlist=sanity-quota Change-Id: I194f3ed9d6ded69313a683995295ab8c07b4fb3a Signed-off-by: Wang Shilong Reviewed-by: Nathaniel Clark Reviewed-by: Andreas Dilger Reviewed-by: Oleg Drokin Reviewed-on: https://review.whamcloud.com/35393 Tested-by: jenkins Tested-by: Maloo --- lustre/tests/sanity-quota.sh | 4 ++-- lustre/utils/lfs_project.c | 25 +++++++++++++++---------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/lustre/tests/sanity-quota.sh b/lustre/tests/sanity-quota.sh index eac8da2..0e7820d 100755 --- a/lustre/tests/sanity-quota.sh +++ b/lustre/tests/sanity-quota.sh @@ -2986,8 +2986,8 @@ test_54() { #clear project but with kept projid change_project -rCk $DIR/$tdir proj_count1=$(lfs project -rcp $TSTPRJID $DIR/$tdir | wc -l) - [ $proj_count1 -eq $proj_count ] || - error "c3: expected $proj_count got $proj_count1" + [ $proj_count1 -eq 1 ] || + error "c3: expected 1 got $proj_count1" #verify projid untouched. proj_count1=$(lfs project -r $DIR/$tdir | grep -c $TSTPRJID) diff --git a/lustre/utils/lfs_project.c b/lustre/utils/lfs_project.c index 7b694ba..7b3b342 100644 --- a/lustre/utils/lfs_project.c +++ b/lustre/utils/lfs_project.c @@ -90,12 +90,12 @@ static const char *mode_to_type(mode_t mode) return "unknown"; } -static int project_get_xattr(const char *pathname, struct fsxattr *fsx) +static int project_get_xattr(const char *pathname, struct fsxattr *fsx, + struct stat *st) { int ret, fd; - struct stat st; - ret = lstat(pathname, &st); + ret = lstat(pathname, st); if (ret) { fprintf(stderr, "%s: failed to stat '%s': %s\n", progname, pathname, strerror(errno)); @@ -103,10 +103,10 @@ static int project_get_xattr(const char *pathname, struct fsxattr *fsx) } /* currently, only file and dir supported */ - if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode)) { + if (!S_ISREG(st->st_mode) && !S_ISDIR(st->st_mode)) { errno = ENOTSUP; fprintf(stderr, "%s: unable to get xattr for %s '%s': %s\n", - progname, mode_to_type(st.st_mode), pathname, + progname, mode_to_type(st->st_mode), pathname, strerror(errno)); return -errno; } @@ -132,8 +132,9 @@ project_check_one(const char *pathname, struct project_handle_control *phc) { struct fsxattr fsx; int ret; + struct stat st; - ret = project_get_xattr(pathname, &fsx); + ret = project_get_xattr(pathname, &fsx, &st); if (ret < 0) return ret; @@ -143,7 +144,8 @@ project_check_one(const char *pathname, struct project_handle_control *phc) phc->projid = fsx.fsx_projid; } - if (!(fsx.fsx_xflags & FS_XFLAG_PROJINHERIT)) { + if (!(fsx.fsx_xflags & FS_XFLAG_PROJINHERIT) && + S_ISDIR(st.st_mode)) { if (!phc->newline) { printf("%s%c", pathname, '\0'); goto out; @@ -169,9 +171,10 @@ static int project_list_one(const char *pathname, struct project_handle_control *phc) { struct fsxattr fsx; + struct stat st; int ret; - ret = project_get_xattr(pathname, &fsx); + ret = project_get_xattr(pathname, &fsx, &st); if (ret < 0) return ret; @@ -187,9 +190,10 @@ static int project_set_one(const char *pathname, struct project_handle_control *phc) { struct fsxattr fsx; + struct stat st; int fd, ret = 0; - fd = project_get_xattr(pathname, &fsx); + fd = project_get_xattr(pathname, &fsx, &st); if (fd < 0) return fd; @@ -215,9 +219,10 @@ static int project_clear_one(const char *pathname, struct project_handle_control *phc) { struct fsxattr fsx; + struct stat st; int ret = 0, fd; - fd = project_get_xattr(pathname, &fsx); + fd = project_get_xattr(pathname, &fsx, &st); if (fd < 0) return fd; -- 1.8.3.1