diff options
-rw-r--r-- | source3/modules/gpfs.c | 16 | ||||
-rw-r--r-- | source3/modules/vfs_gpfs.c | 24 |
2 files changed, 35 insertions, 5 deletions
diff --git a/source3/modules/gpfs.c b/source3/modules/gpfs.c index db6025642b..9730d3af61 100644 --- a/source3/modules/gpfs.c +++ b/source3/modules/gpfs.c @@ -253,8 +253,11 @@ int get_gpfs_fset_id(const char *pathname, int *fset_id) arg.fsn.structType = GPFS_FCNTL_GET_FILESETNAME; fd = open(pathname, O_RDONLY); - if (fd == -1) + if (fd == -1) { + DEBUG(1, ("Could not open %s: %s\n", + pathname, strerror(errno))); return fd; + } err = gpfs_fcntl_fn(fd, &arg); errno_fcntl = errno; @@ -262,11 +265,18 @@ int get_gpfs_fset_id(const char *pathname, int *fset_id) if (err) { errno = errno_fcntl; + DEBUG(1, ("GPFS_FCNTL_GET_FILESETNAME for %s failed: %s\n", + pathname, strerror(errno))); return err; } - return gpfs_getfilesetid_fn(discard_const_p(char, pathname), - arg.fsn.buffer, fset_id); + err = gpfs_getfilesetid_fn(discard_const_p(char, pathname), + arg.fsn.buffer, fset_id); + if (err) { + DEBUG(1, ("gpfs_getfilesetid for %s failed: %s\n", + pathname, strerror(errno))); + } + return err; } void smbd_gpfs_lib_init() diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c index 7a012573f0..a39187e487 100644 --- a/source3/modules/vfs_gpfs.c +++ b/source3/modules/vfs_gpfs.c @@ -1541,10 +1541,30 @@ static int vfs_gpfs_get_quotas(const char *path, uid_t uid, gid_t gid, struct gpfs_quotaInfo *qi_fset) { int err; + char *dir_path; + bool b; - err = get_gpfs_fset_id(path, fset_id); + /* + * We want to always use the directory to get the fileset id, + * because files might have a share mode. We also do not want + * to get the parent directory when there is already a + * directory to avoid stepping in a different fileset. The + * path passed here is currently either "." or a filename, so + * this is ok. The proper solution would be having a way to + * query the fileset id without opening the file. + */ + b = parent_dirname(talloc_tos(), path, &dir_path, NULL); + if (!b) { + errno = ENOMEM; + return -1; + } + + DEBUG(10, ("path %s, directory %s\n", path, dir_path)); + + err = get_gpfs_fset_id(dir_path, fset_id); if (err) { - DEBUG(0, ("Get fset id failed, errno %d.\n", errno)); + DEBUG(0, ("Get fset id failed path %s, dir %s, errno %d.\n", + path, dir_path, errno)); return err; } |