summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/modules/gpfs.c16
-rw-r--r--source3/modules/vfs_gpfs.c24
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;
}