summaryrefslogtreecommitdiffstats
path: root/source3/modules/vfs_gpfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'source3/modules/vfs_gpfs.c')
-rw-r--r--source3/modules/vfs_gpfs.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/source3/modules/vfs_gpfs.c b/source3/modules/vfs_gpfs.c
index fe506cfd2d..d796170136 100644
--- a/source3/modules/vfs_gpfs.c
+++ b/source3/modules/vfs_gpfs.c
@@ -2005,6 +2005,50 @@ static int vfs_gpfs_connect(struct vfs_handle_struct *handle,
return 0;
}
+static int get_gpfs_fset_id(const char *pathname, int *fset_id)
+{
+ int err, fd, errno_fcntl;
+
+ struct {
+ gpfsFcntlHeader_t hdr;
+ gpfsGetFilesetName_t fsn;
+ } arg;
+
+ arg.hdr.totalLength = sizeof(arg);
+ arg.hdr.fcntlVersion = GPFS_FCNTL_CURRENT_VERSION;
+ arg.hdr.fcntlReserved = 0;
+ arg.fsn.structLen = sizeof(arg.fsn);
+ arg.fsn.structType = GPFS_FCNTL_GET_FILESETNAME;
+
+ fd = open(pathname, O_RDONLY);
+ if (fd == -1) {
+ DEBUG(1, ("Could not open %s: %s\n",
+ pathname, strerror(errno)));
+ return fd;
+ }
+
+ err = gpfswrap_fcntl(fd, &arg);
+ errno_fcntl = errno;
+ close(fd);
+
+ if (err) {
+ errno = errno_fcntl;
+ if (errno != ENOSYS) {
+ DEBUG(1, ("GPFS_FCNTL_GET_FILESETNAME for %s failed: "
+ "%s\n", pathname, strerror(errno)));
+ }
+ return err;
+ }
+
+ err = gpfswrap_getfilesetid(discard_const_p(char, pathname),
+ arg.fsn.buffer, fset_id);
+ if (err && errno != ENOSYS) {
+ DEBUG(1, ("gpfs_getfilesetid for %s failed: %s\n",
+ pathname, strerror(errno)));
+ }
+ return err;
+}
+
static int get_gpfs_quota(const char *pathname, int type, int id,
struct gpfs_quotaInfo *qi)
{