X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Futils%2Flfs_project.c;h=9f82b74c35b4839ca250352fd0686afd8e25bd51;hb=15d44e787e17ff57fc1fb5a6c9ae568cdaab6e34;hp=d61b0382454f86a66f1d85cda3eef11de6efbe84;hpb=d8f962242020ad781c272120125fb44ac6c37951;p=fs%2Flustre-release.git diff --git a/lustre/utils/lfs_project.c b/lustre/utils/lfs_project.c index d61b038..9f82b74 100644 --- a/lustre/utils/lfs_project.c +++ b/lustre/utils/lfs_project.c @@ -69,16 +69,48 @@ lfs_project_item_alloc(struct list_head *head, const char *pathname) return -ENOMEM; } - strncpy(lpi->lpi_pathname, pathname, sizeof(lpi->lpi_pathname)); + strncpy(lpi->lpi_pathname, pathname, sizeof(lpi->lpi_pathname) - 1); list_add_tail(&lpi->lpi_list, head); return 0; } -static int project_get_xattr(const char *pathname, struct fsxattr *fsx) +static const char *mode_to_type(mode_t mode) +{ + switch (mode & S_IFMT) { + case S_IFDIR: return "dir"; + case S_IFREG: return "regular"; + case S_IFLNK: return "symlink"; + case S_IFCHR: return "char device"; + case S_IFBLK: return "block device"; + case S_IFIFO: return "fifo"; + case S_IFSOCK: return "sock"; + } + + return "unknown"; +} + +static int project_get_xattr(const char *pathname, struct fsxattr *fsx, + struct stat *st) { int ret, fd; + ret = lstat(pathname, st); + if (ret) { + fprintf(stderr, "%s: failed to stat '%s': %s\n", + progname, pathname, strerror(errno)); + return -errno; + } + + /* currently, only file and dir supported */ + 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, + strerror(errno)); + return -errno; + } + fd = open(pathname, O_RDONLY | O_NOCTTY | O_NDELAY); if (fd < 0) { fprintf(stderr, "%s: failed to open '%s': %s\n", @@ -86,7 +118,7 @@ static int project_get_xattr(const char *pathname, struct fsxattr *fsx) return -errno; } - ret = ioctl(fd, LL_IOC_FSGETXATTR, fsx); + ret = ioctl(fd, FS_IOC_FSGETXATTR, fsx); if (ret) { fprintf(stderr, "%s: failed to get xattr for '%s': %s\n", progname, pathname, strerror(errno)); @@ -100,17 +132,10 @@ static int project_check_one(const char *pathname, struct project_handle_control *phc) { struct fsxattr fsx; - struct stat st; int ret; + struct stat st; - ret = stat(pathname, &st); - if (ret) { - fprintf(stderr, "%s: failed to stat '%s': %s\n", - progname, pathname, strerror(errno)); - return -errno; - } - - ret = project_get_xattr(pathname, &fsx); + ret = project_get_xattr(pathname, &fsx, &st); if (ret < 0) return ret; @@ -120,7 +145,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; @@ -146,9 +172,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; @@ -164,9 +191,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; @@ -179,7 +207,7 @@ project_set_one(const char *pathname, struct project_handle_control *phc) if (phc->set_projid) fsx.fsx_projid = phc->projid; - ret = ioctl(fd, LL_IOC_FSSETXATTR, &fsx); + ret = ioctl(fd, FS_IOC_FSSETXATTR, &fsx); if (ret) fprintf(stderr, "%s: failed to set xattr for '%s': %s\n", progname, pathname, strerror(errno)); @@ -192,9 +220,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; @@ -206,7 +235,7 @@ project_clear_one(const char *pathname, struct project_handle_control *phc) if (!phc->keep_projid) fsx.fsx_projid = 0; - ret = ioctl(fd, LL_IOC_FSSETXATTR, &fsx); + ret = ioctl(fd, FS_IOC_FSSETXATTR, &fsx); if (ret) fprintf(stderr, "%s: failed to set xattr for '%s': %s\n", progname, pathname, strerror(errno));