summaryrefslogtreecommitdiff
path: root/source3/modules/vfs_gpfs.c
diff options
context:
space:
mode:
authorChristof Schmitt <christof.schmitt@us.ibm.com>2012-08-16 12:47:52 -0700
committerChristian Ambach <ambi@samba.org>2012-08-29 18:58:33 +0200
commit6678907fae43e0d25b578b4e649a2fbd9c5e9d71 (patch)
tree6e0bad3d06ea60c0c6c51e409124184988122711 /source3/modules/vfs_gpfs.c
parentf31d0d0e30af6577de483ec4e811b9422b8ef39a (diff)
downloadsamba-6678907fae43e0d25b578b4e649a2fbd9c5e9d71.tar.gz
samba-6678907fae43e0d25b578b4e649a2fbd9c5e9d71.tar.bz2
samba-6678907fae43e0d25b578b4e649a2fbd9c5e9d71.zip
s3:vfs_gpfs: Use directory not file to get fileset id
The query of the fileset quota needs to determine the file set id first. With the currently available interface, this requires opening the file to get a file descriptor. For files, this open can fail when a share mode is set. Workaround this by querying the fileset id on the directory instead. The proper solution would be getting an interface for getting the fileset id that does not require opening the file. Autobuild-User(master): Christian Ambach <ambi@samba.org> Autobuild-Date(master): Wed Aug 29 18:58:34 CEST 2012 on sn-devel-104
Diffstat (limited to 'source3/modules/vfs_gpfs.c')
-rw-r--r--source3/modules/vfs_gpfs.c24
1 files changed, 22 insertions, 2 deletions
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;
}