linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: David Howells <dhowells@redhat.com>
To: viro@parcelfarce.linux.theplanet.co.uk,
	Linus Torvalds <torvalds@osdl.org>,
	Trond Myklebust <trond.myklebust@fys.uio.no>
Cc: linux-fsdevel@vger.kernel.org
Subject: [PATCH] permit fs->get_sb() to return alternative root
Date: Tue, 18 May 2004 15:14:49 +0100	[thread overview]
Message-ID: <6086.1084889689@redhat.com> (raw)


Hi Al, Linux,

Here's a patch to add an extra argument to the get_sb() method of struct
file_system_type that allows a filesystem to suggest an alternative dentry to
be attached to the vfsmount structure. If no such suggestion is made,
sb->s_root is selected as usual.

The reason I want this is so that the NFS fs can be improved such that two
mounts made from the same server will be able to use the same superblock, the
same inodes and the same dentries (as I've been discussing with Trond), this
eliminating aliasing at the client end.

This deals with the case of doing, for instance:

	mount file:/export/home0/dhowells /home/dhowells
	mount file:/export/home0/dwmw2 /home/dwmw2

And then finding you've got files hard-linked across the two.

In effect, you get a sort of bind mount.

It also means that local on-disc caching becomes feasible with cachefs.

David


diff -uNr linux-2.6.6/include/linux/fs.h linux-2.6.6-getsb/include/linux/fs.h
--- linux-2.6.6/include/linux/fs.h	2004-05-11 11:28:57.000000000 +0100
+++ linux-2.6.6-getsb/include/linux/fs.h	2004-05-18 11:35:07.000000000 +0100
@@ -1086,7 +1086,7 @@
 	const char *name;
 	int fs_flags;
 	struct super_block *(*get_sb) (struct file_system_type *, int,
-				       const char *, void *);
+				       const char *, void *, struct dentry **);
 	void (*kill_sb) (struct super_block *);
 	struct module *owner;
 	struct file_system_type * next;
diff -uNr linux-2.6.6/fs/super.c linux-2.6.6-getsb/fs/super.c
--- linux-2.6.6/fs/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/super.c	2004-05-18 13:55:58.000000000 +0100
@@ -738,6 +738,7 @@
 	struct file_system_type *type = get_fs_type(fstype);
 	struct super_block *sb = ERR_PTR(-ENOMEM);
 	struct vfsmount *mnt;
+	struct dentry *root;
 	int error;
 	char *secdata = NULL;
 
@@ -762,15 +763,18 @@
 		}
 	}
 
-	sb = type->get_sb(type, flags, name, data);
+	root = NULL;
+	sb = type->get_sb(type, flags, name, data, &root);
 	if (IS_ERR(sb))
 		goto out_free_secdata;
+	if (!root)
+		root = sb->s_root;
  	error = security_sb_kern_mount(sb, secdata);
  	if (error)
  		goto out_sb;
 	mnt->mnt_sb = sb;
-	mnt->mnt_root = dget(sb->s_root);
-	mnt->mnt_mountpoint = sb->s_root;
+	mnt->mnt_root = dget(root);
+	mnt->mnt_mountpoint = mnt->mnt_root;
 	mnt->mnt_parent = mnt;
 	up_write(&sb->s_umount);
 	put_filesystem(type);
diff -uNr linux-2.6.6/arch/ia64/kernel/perfmon.c linux-2.6.6-getsb/arch/ia64/kernel/perfmon.c
--- linux-2.6.6/arch/ia64/kernel/perfmon.c	2004-05-11 11:28:36.000000000 +0100
+++ linux-2.6.6-getsb/arch/ia64/kernel/perfmon.c	2004-05-18 13:35:17.000000000 +0100
@@ -592,7 +592,8 @@
 
 
 static struct super_block *
-pfmfs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data)
+pfmfs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data,
+	     struct dentry **_root)
 {
 	return get_sb_pseudo(fs_type, "pfm:", NULL, PFMFS_MAGIC);
 }
diff -uNr linux-2.6.6/arch/ia64/sn/io/hwgfs/ramfs.c linux-2.6.6-getsb/arch/ia64/sn/io/hwgfs/ramfs.c
--- linux-2.6.6/arch/ia64/sn/io/hwgfs/ramfs.c	2004-05-11 11:28:14.000000000 +0100
+++ linux-2.6.6-getsb/arch/ia64/sn/io/hwgfs/ramfs.c	2004-05-18 13:35:35.000000000 +0100
@@ -165,7 +165,7 @@
 }
 
 static struct super_block *hwgfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, hwgfs_fill_super);
 }
diff -uNr linux-2.6.6/drivers/isdn/capi/capifs.c linux-2.6.6-getsb/drivers/isdn/capi/capifs.c
--- linux-2.6.6/drivers/isdn/capi/capifs.c	2004-05-11 11:26:21.000000000 +0100
+++ linux-2.6.6-getsb/drivers/isdn/capi/capifs.c	2004-05-18 13:37:35.000000000 +0100
@@ -118,7 +118,7 @@
 }
 
 static struct super_block *capifs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, capifs_fill_super);
 }
diff -uNr linux-2.6.6/drivers/misc/ibmasm/ibmasmfs.c linux-2.6.6-getsb/drivers/misc/ibmasm/ibmasmfs.c
--- linux-2.6.6/drivers/misc/ibmasm/ibmasmfs.c	2004-05-11 11:26:31.000000000 +0100
+++ linux-2.6.6-getsb/drivers/misc/ibmasm/ibmasmfs.c	2004-05-18 13:38:51.000000000 +0100
@@ -103,7 +103,8 @@
 
 
 static struct super_block *ibmasmfs_get_super(struct file_system_type *fst,
-			int flags, const char *name, void *data)
+			int flags, const char *name, void *data,
+			struct dentry **_root)
 {
 	return get_sb_single(fst, flags, data, ibmasmfs_fill_super);
 }
diff -uNr linux-2.6.6/drivers/oprofile/oprofilefs.c linux-2.6.6-getsb/drivers/oprofile/oprofilefs.c
--- linux-2.6.6/drivers/oprofile/oprofilefs.c	2004-05-11 11:26:28.000000000 +0100
+++ linux-2.6.6-getsb/drivers/oprofile/oprofilefs.c	2004-05-18 13:38:25.000000000 +0100
@@ -300,7 +300,7 @@
 
 
 static struct super_block *oprofilefs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, oprofilefs_fill_super);
 }
diff -uNr linux-2.6.6/drivers/usb/core/inode.c linux-2.6.6-getsb/drivers/usb/core/inode.c
--- linux-2.6.6/drivers/usb/core/inode.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/drivers/usb/core/inode.c	2004-05-18 13:37:48.000000000 +0100
@@ -497,7 +497,7 @@
 static struct file_system_type usbdevice_fs_type;
 
 static struct super_block *usb_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, usbfs_fill_super);
 }
diff -uNr linux-2.6.6/drivers/usb/gadget/inode.c linux-2.6.6-getsb/drivers/usb/gadget/inode.c
--- linux-2.6.6/drivers/usb/gadget/inode.c	2004-05-11 11:26:25.000000000 +0100
+++ linux-2.6.6-getsb/drivers/usb/gadget/inode.c	2004-05-18 13:38:08.000000000 +0100
@@ -1842,7 +1842,7 @@
 /* "mount -t gadgetfs path /dev/gadget" ends up here */
 static struct super_block *
 gadgetfs_get_sb (struct file_system_type *t, int flags,
-		const char *path, void *opts)
+		const char *path, void *opts, struct dentry **_root)
 {
 	return get_sb_single (t, flags, opts, gadgetfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/adfs/super.c linux-2.6.6-getsb/fs/adfs/super.c
--- linux-2.6.6/fs/adfs/super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/adfs/super.c	2004-05-18 13:17:45.000000000 +0100
@@ -470,7 +470,7 @@
 }
 
 static struct super_block *adfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, adfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/affs/super.c linux-2.6.6-getsb/fs/affs/super.c
--- linux-2.6.6/fs/affs/super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/affs/super.c	2004-05-18 13:20:59.000000000 +0100
@@ -546,7 +546,7 @@
 }
 
 static struct super_block *affs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, affs_fill_super);
 }
diff -uNr linux-2.6.6/fs/afs/super.c linux-2.6.6-getsb/fs/afs/super.c
--- linux-2.6.6/fs/afs/super.c	2004-05-11 11:28:30.000000000 +0100
+++ linux-2.6.6-getsb/fs/afs/super.c	2004-05-18 13:14:07.000000000 +0100
@@ -40,7 +40,7 @@
 
 static struct super_block *afs_get_sb(struct file_system_type *fs_type,
 				      int flags, const char *dev_name,
-				      void *data);
+				      void *data, struct dentry **_root);
 
 static struct inode *afs_alloc_inode(struct super_block *sb);
 
@@ -299,7 +299,8 @@
 static struct super_block *afs_get_sb(struct file_system_type *fs_type,
 				      int flags,
 				      const char *dev_name,
-				      void *options)
+				      void *options,
+				      struct dentry **_root)
 {
 	struct afs_mount_params params;
 	struct super_block *sb;
diff -uNr linux-2.6.6/fs/autofs/init.c linux-2.6.6-getsb/fs/autofs/init.c
--- linux-2.6.6/fs/autofs/init.c	2004-05-11 11:26:07.000000000 +0100
+++ linux-2.6.6-getsb/fs/autofs/init.c	2004-05-18 13:20:44.000000000 +0100
@@ -15,7 +15,7 @@
 #include "autofs_i.h"
 
 static struct super_block *autofs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, autofs_fill_super);
 }
diff -uNr linux-2.6.6/fs/autofs4/init.c linux-2.6.6-getsb/fs/autofs4/init.c
--- linux-2.6.6/fs/autofs4/init.c	2004-05-11 11:26:06.000000000 +0100
+++ linux-2.6.6-getsb/fs/autofs4/init.c	2004-05-18 13:19:25.000000000 +0100
@@ -15,7 +15,7 @@
 #include "autofs_i.h"
 
 static struct super_block *autofs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, autofs4_fill_super);
 }
diff -uNr linux-2.6.6/fs/befs/linuxvfs.c linux-2.6.6-getsb/fs/befs/linuxvfs.c
--- linux-2.6.6/fs/befs/linuxvfs.c	2004-05-11 11:26:06.000000000 +0100
+++ linux-2.6.6-getsb/fs/befs/linuxvfs.c	2004-05-18 13:19:00.000000000 +0100
@@ -928,7 +928,7 @@
 
 static struct super_block *
 befs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name,
-	    void *data)
+	    void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, befs_fill_super);
 }
diff -uNr linux-2.6.6/fs/bfs/inode.c linux-2.6.6-getsb/fs/bfs/inode.c
--- linux-2.6.6/fs/bfs/inode.c	2004-05-11 11:26:06.000000000 +0100
+++ linux-2.6.6-getsb/fs/bfs/inode.c	2004-05-18 13:18:05.000000000 +0100
@@ -381,7 +381,7 @@
 }
 
 static struct super_block *bfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, bfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/binfmt_misc.c linux-2.6.6-getsb/fs/binfmt_misc.c
--- linux-2.6.6/fs/binfmt_misc.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/binfmt_misc.c	2004-05-18 13:21:41.000000000 +0100
@@ -622,7 +622,7 @@
 }
 
 static struct super_block *bm_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, bm_fill_super);
 }
diff -uNr linux-2.6.6/fs/cifs/cifsfs.c linux-2.6.6-getsb/fs/cifs/cifsfs.c
--- linux-2.6.6/fs/cifs/cifsfs.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/cifs/cifsfs.c	2004-05-18 13:16:00.000000000 +0100
@@ -398,7 +398,7 @@
 
 static struct super_block *
 cifs_get_sb(struct file_system_type *fs_type,
-	    int flags, const char *dev_name, void *data)
+	    int flags, const char *dev_name, void *data, , struct dentry **_root)
 {
 	int rc;
 	struct super_block *sb = sget(fs_type, NULL, set_anon_super, NULL);
diff -uNr linux-2.6.6/fs/coda/inode.c linux-2.6.6-getsb/fs/coda/inode.c
--- linux-2.6.6/fs/coda/inode.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/coda/inode.c	2004-05-18 13:16:59.000000000 +0100
@@ -306,7 +306,7 @@
 /* init_coda: used by filesystems.c to register coda */
 
 static struct super_block *coda_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, coda_fill_super);
 }
diff -uNr linux-2.6.6/fs/cramfs/inode.c linux-2.6.6-getsb/fs/cramfs/inode.c
--- linux-2.6.6/fs/cramfs/inode.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/cramfs/inode.c	2004-05-18 13:19:48.000000000 +0100
@@ -494,7 +494,7 @@
 };
 
 static struct super_block *cramfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, cramfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/devfs/base.c linux-2.6.6-getsb/fs/devfs/base.c
--- linux-2.6.6/fs/devfs/base.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/devfs/base.c	2004-05-18 13:20:27.000000000 +0100
@@ -2566,7 +2566,7 @@
 
 static struct super_block *devfs_get_sb(struct file_system_type *fs_type,
 					int flags, const char *dev_name,
-					void *data)
+					void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, devfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/devpts/inode.c linux-2.6.6-getsb/fs/devpts/inode.c
--- linux-2.6.6/fs/devpts/inode.c	2004-05-11 11:26:07.000000000 +0100
+++ linux-2.6.6-getsb/fs/devpts/inode.c	2004-05-18 13:21:07.000000000 +0100
@@ -109,7 +109,7 @@
 }
 
 static struct super_block *devpts_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, devpts_fill_super);
 }
diff -uNr linux-2.6.6/fs/efs/super.c linux-2.6.6-getsb/fs/efs/super.c
--- linux-2.6.6/fs/efs/super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/efs/super.c	2004-05-18 13:21:14.000000000 +0100
@@ -16,7 +16,7 @@
 #include <linux/vfs.h>
 
 static struct super_block *efs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, efs_fill_super);
 }
diff -uNr linux-2.6.6/fs/eventpoll.c linux-2.6.6-getsb/fs/eventpoll.c
--- linux-2.6.6/fs/eventpoll.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/eventpoll.c	2004-05-18 13:21:51.000000000 +0100
@@ -326,7 +326,7 @@
 static struct inode *ep_eventpoll_inode(void);
 static struct super_block *eventpollfs_get_sb(struct file_system_type *fs_type,
 					      int flags, const char *dev_name,
-					      void *data);
+					      void *data, struct dentry **_root);
 
 /*
  * This semaphore is used to serialize ep_free() and eventpoll_release_file().
@@ -1679,7 +1679,7 @@
 
 static struct super_block *
 eventpollfs_get_sb(struct file_system_type *fs_type, int flags,
-		   const char *dev_name, void *data)
+		   const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_pseudo(fs_type, "eventpoll:", NULL, EVENTPOLLFS_MAGIC);
 }
diff -uNr linux-2.6.6/fs/ext2/super.c linux-2.6.6-getsb/fs/ext2/super.c
--- linux-2.6.6/fs/ext2/super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/ext2/super.c	2004-05-18 13:20:40.000000000 +0100
@@ -1008,7 +1008,7 @@
 }
 
 static struct super_block *ext2_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, ext2_fill_super);
 }
diff -uNr linux-2.6.6/fs/ext3/super.c linux-2.6.6-getsb/fs/ext3/super.c
--- linux-2.6.6/fs/ext3/super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/ext3/super.c	2004-05-18 13:20:08.000000000 +0100
@@ -2280,7 +2280,7 @@
 #endif
 
 static struct super_block *ext3_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, ext3_fill_super);
 }
diff -uNr linux-2.6.6/fs/freevxfs/vxfs_super.c linux-2.6.6-getsb/fs/freevxfs/vxfs_super.c
--- linux-2.6.6/fs/freevxfs/vxfs_super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/freevxfs/vxfs_super.c	2004-05-18 13:19:52.000000000 +0100
@@ -243,7 +243,7 @@
  * The usual module blurb.
  */
 static struct super_block *vxfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, vxfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/hfs/super.c linux-2.6.6-getsb/fs/hfs/super.c
--- linux-2.6.6/fs/hfs/super.c	2004-05-11 11:28:55.000000000 +0100
+++ linux-2.6.6-getsb/fs/hfs/super.c	2004-05-18 13:21:20.000000000 +0100
@@ -316,7 +316,8 @@
 }
 
 static struct super_block *hfs_get_sb(struct file_system_type *fs_type,
-				      int flags, const char *dev_name, void *data)
+				      int flags, const char *dev_name, void *data,
+				      struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, hfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/hfsplus/super.c linux-2.6.6-getsb/fs/hfsplus/super.c
--- linux-2.6.6/fs/hfsplus/super.c	2004-05-11 11:26:06.000000000 +0100
+++ linux-2.6.6-getsb/fs/hfsplus/super.c	2004-05-18 13:18:00.000000000 +0100
@@ -441,7 +441,8 @@
 #define HFSPLUS_INODE_SIZE	sizeof(struct hfsplus_inode_info)
 
 static struct super_block *hfsplus_get_sb(struct file_system_type *fs_type,
-					  int flags, const char *dev_name, void *data)
+					  int flags, const char *dev_name, void *data,
+					  struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, hfsplus_fill_super);
 }
diff -uNr linux-2.6.6/fs/hpfs/super.c linux-2.6.6-getsb/fs/hpfs/super.c
--- linux-2.6.6/fs/hpfs/super.c	2004-05-11 11:28:31.000000000 +0100
+++ linux-2.6.6-getsb/fs/hpfs/super.c	2004-05-18 13:19:36.000000000 +0100
@@ -661,7 +661,7 @@
 }
 
 static struct super_block *hpfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, hpfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/hugetlbfs/inode.c linux-2.6.6-getsb/fs/hugetlbfs/inode.c
--- linux-2.6.6/fs/hugetlbfs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/hugetlbfs/inode.c	2004-05-18 13:21:25.000000000 +0100
@@ -670,7 +670,7 @@
 }
 
 static struct super_block *hugetlbfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, hugetlbfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/intermezzo/super.c linux-2.6.6-getsb/fs/intermezzo/super.c
--- linux-2.6.6/fs/intermezzo/super.c	2004-05-11 11:26:06.000000000 +0100
+++ linux-2.6.6-getsb/fs/intermezzo/super.c	2004-05-18 13:17:06.000000000 +0100
@@ -188,7 +188,7 @@
    mount options to cache FS */
 struct super_block *
 presto_get_sb(struct file_system_type *izo_type, int flags,
-	      const char *devname, void *data)
+	      const char *devname, void *data, struct dentry **_root)
 {
         struct file_system_type *fstype;
         struct presto_cache *cache = NULL;
diff -uNr linux-2.6.6/fs/isofs/inode.c linux-2.6.6-getsb/fs/isofs/inode.c
--- linux-2.6.6/fs/isofs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/isofs/inode.c	2004-05-18 13:20:49.000000000 +0100
@@ -1419,7 +1419,7 @@
 #endif
 
 static struct super_block *isofs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, isofs_fill_super);
 }
diff -uNr linux-2.6.6/fs/jffs/inode-v23.c linux-2.6.6-getsb/fs/jffs/inode-v23.c
--- linux-2.6.6/fs/jffs/inode-v23.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/jffs/inode-v23.c	2004-05-18 13:22:10.000000000 +0100
@@ -1788,7 +1788,7 @@
 };
 
 static struct super_block *jffs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, jffs_fill_super);
 }
diff -uNr linux-2.6.6/fs/jffs2/super.c linux-2.6.6-getsb/fs/jffs2/super.c
--- linux-2.6.6/fs/jffs2/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/jffs2/super.c	2004-05-18 13:16:54.000000000 +0100
@@ -167,7 +167,7 @@
 
 static struct super_block *jffs2_get_sb(struct file_system_type *fs_type,
 					int flags, const char *dev_name,
-					void *data)
+					void *data, struct dentry **_root)
 {
 	int err;
 	struct nameidata nd;
diff -uNr linux-2.6.6/fs/jfs/super.c linux-2.6.6-getsb/fs/jfs/super.c
--- linux-2.6.6/fs/jfs/super.c	2004-05-11 11:28:31.000000000 +0100
+++ linux-2.6.6-getsb/fs/jfs/super.c	2004-05-18 13:15:46.000000000 +0100
@@ -494,7 +494,7 @@
 }
 
 static struct super_block *jfs_get_sb(struct file_system_type *fs_type, 
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, jfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/minix/inode.c linux-2.6.6-getsb/fs/minix/inode.c
--- linux-2.6.6/fs/minix/inode.c	2004-05-11 11:26:07.000000000 +0100
+++ linux-2.6.6-getsb/fs/minix/inode.c	2004-05-18 13:21:10.000000000 +0100
@@ -556,7 +556,7 @@
 }
 
 static struct super_block *minix_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, minix_fill_super);
 }
diff -uNr linux-2.6.6/fs/msdos/namei.c linux-2.6.6-getsb/fs/msdos/namei.c
--- linux-2.6.6/fs/msdos/namei.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/msdos/namei.c	2004-05-18 13:22:30.000000000 +0100
@@ -596,7 +596,7 @@
 }
 
 static struct super_block *msdos_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, msdos_fill_super);
 }
diff -uNr linux-2.6.6/fs/ncpfs/inode.c linux-2.6.6-getsb/fs/ncpfs/inode.c
--- linux-2.6.6/fs/ncpfs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/ncpfs/inode.c	2004-05-18 13:19:57.000000000 +0100
@@ -963,7 +963,7 @@
 #endif
 
 static struct super_block *ncp_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, ncp_fill_super);
 }
diff -uNr linux-2.6.6/fs/nfs/inode.c linux-2.6.6-getsb/fs/nfs/inode.c
--- linux-2.6.6/fs/nfs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/nfs/inode.c	2004-05-18 13:14:47.000000000 +0100
@@ -1305,7 +1305,7 @@
 }
 
 static struct super_block *nfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *raw_data)
+	int flags, const char *dev_name, void *raw_data, struct dentry **_root)
 {
 	int error;
 	struct nfs_server *server;
@@ -1623,7 +1623,7 @@
 }
 
 static struct super_block *nfs4_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *raw_data)
+	int flags, const char *dev_name, void *raw_data, struct dentry **_root)
 {
 	int error;
 	struct nfs_server *server;
diff -uNr linux-2.6.6/fs/nfsd/nfsctl.c linux-2.6.6-getsb/fs/nfsd/nfsctl.c
--- linux-2.6.6/fs/nfsd/nfsctl.c	2004-05-11 11:26:05.000000000 +0100
+++ linux-2.6.6-getsb/fs/nfsd/nfsctl.c	2004-05-18 13:22:50.000000000 +0100
@@ -417,7 +417,7 @@
 }
 
 static struct super_block *nfsd_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, nfsd_fill_super);
 }
diff -uNr linux-2.6.6/fs/ntfs/super.c linux-2.6.6-getsb/fs/ntfs/super.c
--- linux-2.6.6/fs/ntfs/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/ntfs/super.c	2004-05-18 13:19:44.000000000 +0100
@@ -1999,7 +1999,7 @@
 DECLARE_MUTEX(ntfs_lock);
 
 static struct super_block *ntfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, ntfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/openpromfs/inode.c linux-2.6.6-getsb/fs/openpromfs/inode.c
--- linux-2.6.6/fs/openpromfs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/openpromfs/inode.c	2004-05-18 13:22:05.000000000 +0100
@@ -1054,7 +1054,7 @@
 }
 
 static struct super_block *openprom_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, openprom_fill_super);
 }
diff -uNr linux-2.6.6/fs/pipe.c linux-2.6.6-getsb/fs/pipe.c
--- linux-2.6.6/fs/pipe.c	2004-05-11 11:28:31.000000000 +0100
+++ linux-2.6.6-getsb/fs/pipe.c	2004-05-18 13:22:19.000000000 +0100
@@ -696,7 +696,7 @@
  */
 
 static struct super_block *pipefs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_pseudo(fs_type, "pipe:", NULL, PIPEFS_MAGIC);
 }
diff -uNr linux-2.6.6/fs/proc/root.c linux-2.6.6-getsb/fs/proc/root.c
--- linux-2.6.6/fs/proc/root.c	2004-05-11 11:28:31.000000000 +0100
+++ linux-2.6.6-getsb/fs/proc/root.c	2004-05-18 13:20:31.000000000 +0100
@@ -25,7 +25,7 @@
 #endif
 
 static struct super_block *proc_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, proc_fill_super);
 }
diff -uNr linux-2.6.6/fs/qnx4/inode.c linux-2.6.6-getsb/fs/qnx4/inode.c
--- linux-2.6.6/fs/qnx4/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/qnx4/inode.c	2004-05-18 13:21:56.000000000 +0100
@@ -559,7 +559,7 @@
 }
 
 static struct super_block *qnx4_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, qnx4_fill_super);
 }
diff -uNr linux-2.6.6/fs/ramfs/inode.c linux-2.6.6-getsb/fs/ramfs/inode.c
--- linux-2.6.6/fs/ramfs/inode.c	2004-05-11 11:26:07.000000000 +0100
+++ linux-2.6.6-getsb/fs/ramfs/inode.c	2004-05-18 13:21:33.000000000 +0100
@@ -199,13 +199,13 @@
 }
 
 static struct super_block *ramfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, ramfs_fill_super);
 }
 
 static struct super_block *rootfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags|MS_NOUSER, data, ramfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/reiserfs/super.c linux-2.6.6-getsb/fs/reiserfs/super.c
--- linux-2.6.6/fs/reiserfs/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/reiserfs/super.c	2004-05-18 13:18:52.000000000 +0100
@@ -1509,7 +1509,7 @@
 
 static struct super_block*
 get_super_block (struct file_system_type *fs_type, int flags,
-		 const char *dev_name, void *data)
+		 const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, reiserfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/romfs/inode.c linux-2.6.6-getsb/fs/romfs/inode.c
--- linux-2.6.6/fs/romfs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/romfs/inode.c	2004-05-18 13:21:03.000000000 +0100
@@ -607,7 +607,7 @@
 };
 
 static struct super_block *romfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, romfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/smbfs/inode.c linux-2.6.6-getsb/fs/smbfs/inode.c
--- linux-2.6.6/fs/smbfs/inode.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/smbfs/inode.c	2004-05-18 13:20:21.000000000 +0100
@@ -776,7 +776,7 @@
 #endif
 
 static struct super_block *smb_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, smb_fill_super);
 }
diff -uNr linux-2.6.6/fs/sysfs/mount.c linux-2.6.6-getsb/fs/sysfs/mount.c
--- linux-2.6.6/fs/sysfs/mount.c	2004-05-11 11:26:06.000000000 +0100
+++ linux-2.6.6-getsb/fs/sysfs/mount.c	2004-05-18 13:18:10.000000000 +0100
@@ -55,7 +55,7 @@
 }
 
 static struct super_block *sysfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, sysfs_fill_super);
 }
diff -uNr linux-2.6.6/fs/sysv/super.c linux-2.6.6-getsb/fs/sysv/super.c
--- linux-2.6.6/fs/sysv/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/sysv/super.c	2004-05-18 13:19:16.000000000 +0100
@@ -499,13 +499,13 @@
 /* Every kernel module contains stuff like this. */
 
 static struct super_block *sysv_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, sysv_fill_super);
 }
 
 static struct super_block *v7_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, v7_fill_super);
 }
diff -uNr linux-2.6.6/fs/udf/super.c linux-2.6.6-getsb/fs/udf/super.c
--- linux-2.6.6/fs/udf/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/udf/super.c	2004-05-18 13:17:49.000000000 +0100
@@ -100,7 +100,7 @@
 
 /* UDF filesystem type */
 static struct super_block *udf_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, udf_fill_super);
 }
diff -uNr linux-2.6.6/fs/ufs/super.c linux-2.6.6-getsb/fs/ufs/super.c
--- linux-2.6.6/fs/ufs/super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/ufs/super.c	2004-05-18 13:14:57.000000000 +0100
@@ -1209,7 +1209,7 @@
 };
 
 static struct super_block *ufs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, ufs_fill_super);
 }
diff -uNr linux-2.6.6/fs/vfat/namei.c linux-2.6.6-getsb/fs/vfat/namei.c
--- linux-2.6.6/fs/vfat/namei.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/vfat/namei.c	2004-05-18 13:22:25.000000000 +0100
@@ -1121,7 +1121,7 @@
 }
 
 static struct super_block *vfat_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, vfat_fill_super);
 }
diff -uNr linux-2.6.6/fs/xfs/linux/xfs_super.c linux-2.6.6-getsb/fs/xfs/linux/xfs_super.c
--- linux-2.6.6/fs/xfs/linux/xfs_super.c	2004-05-11 11:28:56.000000000 +0100
+++ linux-2.6.6-getsb/fs/xfs/linux/xfs_super.c	2004-05-18 13:22:42.000000000 +0100
@@ -745,7 +745,8 @@
 	struct file_system_type	*fs_type,
 	int			flags,
 	const char		*dev_name,
-	void			*data)
+	void			*data,
+	struct dentry		**_root)
 {
 	return get_sb_bdev(fs_type, flags, dev_name, data, linvfs_fill_super);
 }
diff -uNr linux-2.6.6/ipc/mqueue.c linux-2.6.6-getsb/ipc/mqueue.c
--- linux-2.6.6/ipc/mqueue.c	2004-05-11 11:28:57.000000000 +0100
+++ linux-2.6.6-getsb/ipc/mqueue.c	2004-05-18 13:35:59.000000000 +0100
@@ -168,7 +168,7 @@
 
 static struct super_block *mqueue_get_sb(struct file_system_type *fs_type,
 					 int flags, const char *dev_name,
-					 void *data)
+					 void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, mqueue_fill_super);
 }
diff -uNr linux-2.6.6/kernel/futex.c linux-2.6.6-getsb/kernel/futex.c
--- linux-2.6.6/kernel/futex.c	2004-05-11 11:27:00.000000000 +0100
+++ linux-2.6.6-getsb/kernel/futex.c	2004-05-18 13:34:41.000000000 +0100
@@ -674,7 +674,7 @@
 
 static struct super_block *
 futexfs_get_sb(struct file_system_type *fs_type,
-	       int flags, const char *dev_name, void *data)
+	       int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_pseudo(fs_type, "futex", NULL, 0xBAD1DEA);
 }
diff -uNr linux-2.6.6/mm/shmem.c linux-2.6.6-getsb/mm/shmem.c
--- linux-2.6.6/mm/shmem.c	2004-05-11 11:28:57.000000000 +0100
+++ linux-2.6.6-getsb/mm/shmem.c	2004-05-18 13:36:22.000000000 +0100
@@ -1879,7 +1879,7 @@
 };
 
 static struct super_block *shmem_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_nodev(fs_type, flags, data, shmem_fill_super);
 }
diff -uNr linux-2.6.6/net/socket.c linux-2.6.6-getsb/net/socket.c
--- linux-2.6.6/net/socket.c	2004-05-11 11:28:58.000000000 +0100
+++ linux-2.6.6-getsb/net/socket.c	2004-05-18 13:33:37.000000000 +0100
@@ -323,7 +323,7 @@
 };
 
 static struct super_block *sockfs_get_sb(struct file_system_type *fs_type,
-	int flags, const char *dev_name, void *data)
+	int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_pseudo(fs_type, "socket:", &sockfs_ops, SOCKFS_MAGIC);
 }
diff -uNr linux-2.6.6/net/sunrpc/rpc_pipe.c linux-2.6.6-getsb/net/sunrpc/rpc_pipe.c
--- linux-2.6.6/net/sunrpc/rpc_pipe.c	2004-05-11 11:26:46.000000000 +0100
+++ linux-2.6.6-getsb/net/sunrpc/rpc_pipe.c	2004-05-18 13:34:18.000000000 +0100
@@ -793,7 +793,7 @@
 
 static struct super_block *
 rpc_get_sb(struct file_system_type *fs_type,
-		int flags, const char *dev_name, void *data)
+		int flags, const char *dev_name, void *data, struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, rpc_fill_super);
 }
diff -uNr linux-2.6.6/security/selinux/selinuxfs.c linux-2.6.6-getsb/security/selinux/selinuxfs.c
--- linux-2.6.6/security/selinux/selinuxfs.c	2004-05-11 11:28:58.000000000 +0100
+++ linux-2.6.6-getsb/security/selinux/selinuxfs.c	2004-05-18 13:36:43.000000000 +0100
@@ -1088,7 +1088,8 @@
 }
 
 static struct super_block *sel_get_sb(struct file_system_type *fs_type,
-				      int flags, const char *dev_name, void *data)
+				      int flags, const char *dev_name, void *data,
+				      struct dentry **_root)
 {
 	return get_sb_single(fs_type, flags, data, sel_fill_super);
 }

             reply	other threads:[~2004-05-18 14:15 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1084905576.5215.150.camel@lade.trondhjem.org>
2004-05-18 14:14 ` David Howells [this message]
2004-05-18 14:43   ` [PATCH] permit fs->get_sb() to return alternative root Trond Myklebust
     [not found]   ` <20040518152426.GY17014@parcelfarce.linux.theplanet.co.uk>
     [not found]     ` <1084895260.5215.22.camel@lade.trondhjem.org>
     [not found]       ` <20040518162812.GZ17014@parcelfarce.linux.theplanet.co.uk>
     [not found]         ` <1084898393.5215.43.camel@lade.trondhjem.org>
     [not found]           ` <Pine.LNX.4.58.0405180948190.25502@ppc970.osdl.org>
     [not found]             ` <1084899447.5215.49.camel@lade.trondhjem.org>
     [not found]               ` <20040518170410.GA17014@parcelfarce.linux.theplanet.co.uk>
     [not found]                 ` <1084902342.5215.94.camel@lade.trondhjem.org>
     [not found]                   ` <20040518174808.GD17014@parcelfarce.linux.theplanet.co.uk>
2004-05-20 11:22                     ` David Howells
2004-05-28  8:52                     ` David Howells

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6086.1084889689@redhat.com \
    --to=dhowells@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=torvalds@osdl.org \
    --cc=trond.myklebust@fys.uio.no \
    --cc=viro@parcelfarce.linux.theplanet.co.uk \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).