X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Futils%2Flfs_project.c;h=f16d825a4f2bbd63ea297220309b0c7436e2aa6f;hb=ffef6e3271ad1136d3ab1c2ee229b4690a6722a0;hp=03de7d54a09f030af73782cca78ff2658ee86aa4;hpb=e022922fb4a2429d0c2488a13ad8127c068aa2b8;p=fs%2Flustre-release.git diff --git a/lustre/utils/lfs_project.c b/lustre/utils/lfs_project.c index 03de7d5..f16d825 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", @@ -90,6 +122,7 @@ static int project_get_xattr(const char *pathname, struct fsxattr *fsx) if (ret) { fprintf(stderr, "%s: failed to get xattr for '%s': %s\n", progname, pathname, strerror(errno)); + close(fd); return -errno; } return fd; @@ -99,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; @@ -119,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; @@ -145,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; @@ -163,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; @@ -191,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;