diff -uNrp linux-2.6.12-rc2-mm3-fscache/arch/ia64/kernel/perfmon.c linux-2.6.12-rc2-mm3-nfs-getsb/arch/ia64/kernel/perfmon.c --- linux-2.6.12-rc2-mm3-fscache/arch/ia64/kernel/perfmon.c 2005-04-12 15:48:40.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/arch/ia64/kernel/perfmon.c 2005-04-12 16:14:35.000000000 +0100 @@ -591,7 +591,8 @@ pfm_get_unmapped_area(struct file *file, 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 -uNrp linux-2.6.12-rc2-mm3-fscache/arch/um/drivers/mconsole_kern.c linux-2.6.12-rc2-mm3-nfs-getsb/arch/um/drivers/mconsole_kern.c --- linux-2.6.12-rc2-mm3-fscache/arch/um/drivers/mconsole_kern.c 2005-03-02 12:07:58.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/arch/um/drivers/mconsole_kern.c 2005-04-12 16:24:49.000000000 +0100 @@ -130,6 +130,7 @@ void mconsole_proc(struct mc_request *re struct nameidata nd; struct file_system_type *proc; struct super_block *super; + struct dentry *root; struct file *file; int n, err; char *ptr = req->request.data, *buf; @@ -143,7 +144,8 @@ void mconsole_proc(struct mc_request *re goto out; } - super = (*proc->get_sb)(proc, 0, NULL, NULL); + root = NULL; + super = (*proc->get_sb)(proc, 0, NULL, NULL, &root); put_filesystem(proc); if(super == NULL){ mconsole_reply(req, "Failed to get procfs superblock", 1, 0); @@ -151,7 +153,7 @@ void mconsole_proc(struct mc_request *re } up_write(&super->s_umount); - nd.dentry = super->s_root; + nd.dentry = root ? root : dget(super->s_root); nd.mnt = NULL; nd.flags = O_RDONLY + 1; nd.last_type = LAST_ROOT; diff -uNrp linux-2.6.12-rc2-mm3-fscache/Documentation/filesystems/Locking linux-2.6.12-rc2-mm3-nfs-getsb/Documentation/filesystems/Locking --- linux-2.6.12-rc2-mm3-fscache/Documentation/filesystems/Locking 2005-04-06 13:44:40.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/Documentation/filesystems/Locking 2005-04-12 16:34:29.000000000 +0100 @@ -143,7 +143,7 @@ see also dquot_operations section. --------------------------- file_system_type --------------------------- prototypes: struct super_block *(*get_sb) (struct file_system_type *, int, - const char *, void *); + const char *, void *, struct dentry **); void (*kill_sb) (struct super_block *); locking rules: may block BKL diff -uNrp linux-2.6.12-rc2-mm3-fscache/Documentation/filesystems/porting linux-2.6.12-rc2-mm3-nfs-getsb/Documentation/filesystems/porting --- linux-2.6.12-rc2-mm3-fscache/Documentation/filesystems/porting 2004-06-18 13:42:30.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/Documentation/filesystems/porting 2005-04-12 16:33:52.000000000 +0100 @@ -51,7 +51,7 @@ success and negative number in case of e informative error value to report). Call it foo_fill_super(). Now declare struct super_block foo_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 -uNrp linux-2.6.12-rc2-mm3-fscache/drivers/isdn/capi/capifs.c linux-2.6.12-rc2-mm3-nfs-getsb/drivers/isdn/capi/capifs.c --- linux-2.6.12-rc2-mm3-fscache/drivers/isdn/capi/capifs.c 2005-03-02 12:08:09.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/drivers/isdn/capi/capifs.c 2005-04-12 16:14:36.000000000 +0100 @@ -119,7 +119,7 @@ fail: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/drivers/misc/ibmasm/ibmasmfs.c linux-2.6.12-rc2-mm3-nfs-getsb/drivers/misc/ibmasm/ibmasmfs.c --- linux-2.6.12-rc2-mm3-fscache/drivers/misc/ibmasm/ibmasmfs.c 2005-03-02 12:08:13.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/drivers/misc/ibmasm/ibmasmfs.c 2005-04-12 16:14:36.000000000 +0100 @@ -103,7 +103,8 @@ static int ibmasmfs_fill_super (struct s 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 -uNrp linux-2.6.12-rc2-mm3-fscache/drivers/oprofile/oprofilefs.c linux-2.6.12-rc2-mm3-nfs-getsb/drivers/oprofile/oprofilefs.c --- linux-2.6.12-rc2-mm3-fscache/drivers/oprofile/oprofilefs.c 2005-03-02 12:08:20.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/drivers/oprofile/oprofilefs.c 2005-04-12 16:14:36.000000000 +0100 @@ -273,7 +273,7 @@ static int oprofilefs_fill_super(struct 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 -uNrp linux-2.6.12-rc2-mm3-fscache/drivers/perfctr/virtual.c linux-2.6.12-rc2-mm3-nfs-getsb/drivers/perfctr/virtual.c --- linux-2.6.12-rc2-mm3-fscache/drivers/perfctr/virtual.c 2005-04-12 15:48:57.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/drivers/perfctr/virtual.c 2005-04-12 16:32:50.000000000 +0100 @@ -918,7 +918,8 @@ static struct file_operations vperfctr_f static struct super_block * vperfctrfs_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, "vperfctr:", NULL, VPERFCTRFS_MAGIC); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/drivers/usb/core/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/drivers/usb/core/inode.c --- linux-2.6.12-rc2-mm3-fscache/drivers/usb/core/inode.c 2005-04-12 15:48:59.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/drivers/usb/core/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -559,7 +559,7 @@ static void fs_remove_file (struct dentr /* --------------------------------------------------------------------- */ 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 -uNrp linux-2.6.12-rc2-mm3-fscache/drivers/usb/gadget/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/drivers/usb/gadget/inode.c --- linux-2.6.12-rc2-mm3-fscache/drivers/usb/gadget/inode.c 2005-04-06 13:45:18.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/drivers/usb/gadget/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -2063,7 +2063,7 @@ gadgetfs_fill_super (struct super_block /* "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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/adfs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/adfs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/adfs/super.c 2005-01-04 11:13:36.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/adfs/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -470,7 +470,7 @@ error: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/affs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/affs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/affs/super.c 2005-03-02 12:08:35.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/affs/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -528,7 +528,7 @@ affs_statfs(struct super_block *sb, stru } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/afs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/afs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/afs/super.c 2005-04-12 15:49:01.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/afs/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -40,7 +40,7 @@ static void afs_i_init_once(void *foo, k 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); @@ -297,7 +297,8 @@ static int afs_fill_super(struct super_b 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/autofs/init.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/autofs/init.c --- linux-2.6.12-rc2-mm3-fscache/fs/autofs/init.c 2004-06-18 13:41:28.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/autofs/init.c 2005-04-12 16:14:36.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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/autofs4/init.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/autofs4/init.c --- linux-2.6.12-rc2-mm3-fscache/fs/autofs4/init.c 2004-06-18 13:41:20.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/autofs4/init.c 2005-04-12 16:14:36.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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/befs/linuxvfs.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/befs/linuxvfs.c --- linux-2.6.12-rc2-mm3-fscache/fs/befs/linuxvfs.c 2004-10-19 10:42:07.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/befs/linuxvfs.c 2005-04-12 16:14:36.000000000 +0100 @@ -910,7 +910,7 @@ befs_statfs(struct super_block *sb, stru 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/bfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/bfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/bfs/inode.c 2005-03-02 12:08:35.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/bfs/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -382,7 +382,7 @@ out: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/binfmt_misc.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/binfmt_misc.c --- linux-2.6.12-rc2-mm3-fscache/fs/binfmt_misc.c 2005-03-02 12:08:35.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/binfmt_misc.c 2005-04-12 16:14:36.000000000 +0100 @@ -741,7 +741,7 @@ static int bm_fill_super(struct super_bl } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/block_dev.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/block_dev.c --- linux-2.6.12-rc2-mm3-fscache/fs/block_dev.c 2005-03-02 12:08:35.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/block_dev.c 2005-04-12 16:14:36.000000000 +0100 @@ -301,7 +301,7 @@ static struct super_operations bdev_sops }; static struct super_block *bd_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, "bdev:", &bdev_sops, 0x62646576); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/cachefs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/cachefs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/cachefs/super.c 2005-04-12 15:49:02.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/cachefs/super.c 2005-04-12 16:30:59.000000000 +0100 @@ -28,7 +28,7 @@ static void cachefs_i_init_once(void *_i static struct super_block *cachefs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, - void *data); + void *data, struct dentry **_root); static struct inode *cachefs_alloc_inode(struct super_block *sb); static void cachefs_destroy_inode(struct inode *inode); @@ -123,7 +123,8 @@ void __exit cachefs_fs_exit(void) static struct super_block *cachefs_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, - void *options) + void *options, + struct dentry **_root) { struct super_block *sb; diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/cifs/cifsfs.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/cifs/cifsfs.c --- linux-2.6.12-rc2-mm3-fscache/fs/cifs/cifsfs.c 2005-04-12 15:49:02.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/cifs/cifsfs.c 2005-04-12 16:14:36.000000000 +0100 @@ -417,7 +417,7 @@ struct super_operations cifs_super_ops = 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/coda/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/coda/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/coda/inode.c 2005-03-02 12:08:35.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/coda/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -306,7 +306,7 @@ static int coda_statfs(struct super_bloc /* 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/cramfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/cramfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/cramfs/inode.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/cramfs/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -495,7 +495,7 @@ static struct super_operations cramfs_op }; 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/debugfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/debugfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/debugfs/inode.c 2005-03-02 12:08:35.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/debugfs/inode.c 2005-04-12 16:30:33.000000000 +0100 @@ -122,7 +122,7 @@ static struct dentry * get_dentry(struct static struct super_block *debug_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, debug_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/devfs/base.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/devfs/base.c --- linux-2.6.12-rc2-mm3-fscache/fs/devfs/base.c 2005-03-02 12:08:36.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/devfs/base.c 2005-04-12 16:14:36.000000000 +0100 @@ -2551,7 +2551,7 @@ static int devfs_fill_super(struct super 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/devpts/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/devpts/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/devpts/inode.c 2005-03-02 12:08:36.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/devpts/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -129,7 +129,7 @@ fail: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/efs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/efs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/efs/super.c 2005-03-02 12:08:36.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/efs/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -19,7 +19,7 @@ static int efs_statfs(struct super_block static int efs_fill_super(struct super_block *s, void *d, int silent); 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/eventpoll.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/eventpoll.c --- linux-2.6.12-rc2-mm3-fscache/fs/eventpoll.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/eventpoll.c 2005-04-12 16:14:36.000000000 +0100 @@ -315,7 +315,7 @@ static int eventpollfs_delete_dentry(str 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(). @@ -1576,7 +1576,7 @@ eexit_1: 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/ext2/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/ext2/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/ext2/super.c 2005-04-12 15:49:02.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/ext2/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -1011,7 +1011,7 @@ static int ext2_statfs (struct super_blo } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/ext3/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/ext3/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/ext3/super.c 2005-04-12 15:49:02.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/ext3/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -2491,7 +2491,7 @@ out: #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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/freevxfs/vxfs_super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/freevxfs/vxfs_super.c --- linux-2.6.12-rc2-mm3-fscache/fs/freevxfs/vxfs_super.c 2004-10-19 10:42:07.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/freevxfs/vxfs_super.c 2005-04-12 16:14:36.000000000 +0100 @@ -243,7 +243,7 @@ out: * 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/fuse/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/fuse/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/fuse/inode.c 2005-04-12 15:49:02.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/fuse/inode.c 2005-04-12 16:31:11.000000000 +0100 @@ -573,7 +573,7 @@ static int fuse_fill_super(struct super_ static struct super_block *fuse_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, - void *raw_data) + void *raw_data, struct dentry **_root) { return get_sb_nodev(fs_type, flags, raw_data, fuse_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/hfs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/hfs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/hfs/super.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/hfs/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -348,7 +348,8 @@ bail3: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/hfsplus/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/hfsplus/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/hfsplus/super.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/hfsplus/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -455,7 +455,8 @@ static void hfsplus_destroy_inode(struct #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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/hostfs/hostfs_kern.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/hostfs/hostfs_kern.c --- linux-2.6.12-rc2-mm3-fscache/fs/hostfs/hostfs_kern.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/hostfs/hostfs_kern.c 2005-04-12 16:29:06.000000000 +0100 @@ -1006,7 +1006,7 @@ static int hostfs_fill_sb_common(struct static struct super_block *hostfs_read_sb(struct file_system_type *type, int flags, const char *dev_name, - void *data) + void *data, struct dentry **_root) { return(get_sb_nodev(type, flags, data, hostfs_fill_sb_common)); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/hpfs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/hpfs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/hpfs/super.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/hpfs/super.c 2005-04-12 16:14:36.000000000 +0100 @@ -662,7 +662,7 @@ bail0: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/hppfs/hppfs_kern.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/hppfs/hppfs_kern.c --- linux-2.6.12-rc2-mm3-fscache/fs/hppfs/hppfs_kern.c 2004-10-19 10:42:08.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/hppfs/hppfs_kern.c 2005-04-12 16:30:14.000000000 +0100 @@ -776,7 +776,7 @@ static int hppfs_fill_super(struct super static struct super_block *hppfs_read_super(struct file_system_type *type, int flags, const char *dev_name, - void *data) + void *data, struct dentry **_root) { return(get_sb_nodev(type, flags, data, hppfs_fill_super)); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/hugetlbfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/hugetlbfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/hugetlbfs/inode.c 2005-04-06 13:45:24.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/hugetlbfs/inode.c 2005-04-12 16:14:36.000000000 +0100 @@ -719,7 +719,7 @@ void hugetlb_put_quota(struct address_sp } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/isofs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/isofs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/isofs/inode.c 2005-04-12 15:49:02.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/isofs/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -1405,7 +1405,7 @@ struct inode *isofs_iget(struct super_bl } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/jffs/inode-v23.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/jffs/inode-v23.c --- linux-2.6.12-rc2-mm3-fscache/fs/jffs/inode-v23.c 2005-04-06 13:45:25.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/jffs/inode-v23.c 2005-04-12 16:14:37.000000000 +0100 @@ -1788,7 +1788,7 @@ static struct super_operations jffs_ops }; 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/jffs2/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/jffs2/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/jffs2/super.c 2005-04-12 15:49:03.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/jffs2/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -179,7 +179,7 @@ static struct super_block *jffs2_get_sb_ 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/jfs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/jfs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/jfs/super.c 2005-04-12 15:49:03.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/jfs/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -548,7 +548,7 @@ static void jfs_unlockfs(struct super_bl } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/minix/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/minix/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/minix/inode.c 2004-10-19 10:42:08.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/minix/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -558,7 +558,7 @@ void minix_truncate(struct inode * inode } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/msdos/namei.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/msdos/namei.c --- linux-2.6.12-rc2-mm3-fscache/fs/msdos/namei.c 2005-04-06 13:45:26.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/msdos/namei.c 2005-04-12 16:22:47.000000000 +0100 @@ -680,7 +680,7 @@ static int msdos_fill_super(struct super static struct super_block *msdos_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, - void *data) + void *data, struct dentry **_altroot) { return get_sb_bdev(fs_type, flags, dev_name, data, msdos_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/ncpfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/ncpfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/ncpfs/inode.c 2004-10-19 10:42:08.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/ncpfs/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -962,7 +962,7 @@ int ncp_current_malloced; #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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/nfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/nfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/nfs/inode.c 2005-04-12 15:49:03.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/nfs/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -1429,7 +1429,7 @@ static int nfs_compare_super(struct supe } 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 = NULL; @@ -1806,7 +1806,7 @@ nfs_copy_user_string(char *dst, struct n } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/nfsd/nfsctl.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/nfsd/nfsctl.c --- linux-2.6.12-rc2-mm3-fscache/fs/nfsd/nfsctl.c 2004-10-19 10:42:08.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/nfsd/nfsctl.c 2005-04-12 16:14:37.000000000 +0100 @@ -376,7 +376,7 @@ static int nfsd_fill_super(struct super_ } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/ntfs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/ntfs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/ntfs/super.c 2005-04-12 15:49:05.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/ntfs/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -2611,7 +2611,7 @@ kmem_cache_t *ntfs_index_ctx_cache; 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/openpromfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/openpromfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/openpromfs/inode.c 2005-03-02 12:08:40.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/openpromfs/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -1055,7 +1055,7 @@ out_no_root: } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/pipe.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/pipe.c --- linux-2.6.12-rc2-mm3-fscache/fs/pipe.c 2005-04-06 13:45:26.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/pipe.c 2005-04-12 16:14:37.000000000 +0100 @@ -801,7 +801,7 @@ no_files: */ 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/proc/root.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/proc/root.c --- linux-2.6.12-rc2-mm3-fscache/fs/proc/root.c 2005-01-04 11:13:41.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/proc/root.c 2005-04-12 16:14:37.000000000 +0100 @@ -25,7 +25,7 @@ struct proc_dir_entry *proc_sys_root; #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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/qnx4/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/qnx4/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/qnx4/inode.c 2005-04-06 13:45:27.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/qnx4/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -560,7 +560,7 @@ static void destroy_inodecache(void) } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/ramfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/ramfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/ramfs/inode.c 2005-04-06 13:45:27.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/ramfs/inode.c 2005-04-12 16:28:03.000000000 +0100 @@ -203,13 +203,13 @@ static int ramfs_fill_super(struct super } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/reiser4/vfs_ops.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/reiser4/vfs_ops.c --- linux-2.6.12-rc2-mm3-fscache/fs/reiser4/vfs_ops.c 2005-04-12 15:49:06.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/reiser4/vfs_ops.c 2005-04-12 16:32:05.000000000 +0100 @@ -1181,7 +1181,8 @@ reiser4_get_sb(struct file_system_type * * type */ , int flags /* flags */ , const char *dev_name /* device name */ , - void *data /* mount options */ ) + void *data, /* mount options */ + struct dentry **_root /* alternate root dentry to sb_root */) { return get_sb_bdev(fs_type, flags, dev_name, data, reiser4_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/reiserfs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/reiserfs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/reiserfs/super.c 2005-04-12 15:49:06.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/reiserfs/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -2082,7 +2082,7 @@ out: 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/relayfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/relayfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/relayfs/inode.c 2005-04-12 15:49:06.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/relayfs/inode.c 2005-04-12 16:32:20.000000000 +0100 @@ -371,7 +371,7 @@ static int relayfs_fill_super(struct sup static struct super_block * relayfs_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, relayfs_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/romfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/romfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/romfs/inode.c 2005-03-02 12:08:41.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/romfs/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -607,7 +607,7 @@ static struct super_operations romfs_ops }; 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/smbfs/inode.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/smbfs/inode.c --- linux-2.6.12-rc2-mm3-fscache/fs/smbfs/inode.c 2005-03-02 12:08:41.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/smbfs/inode.c 2005-04-12 16:14:37.000000000 +0100 @@ -789,7 +789,7 @@ int smb_current_vmalloced; #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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/super.c 2005-04-12 15:49:06.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/super.c 2005-04-12 16:18:51.000000000 +0100 @@ -799,6 +799,7 @@ do_kern_mount(const char *fstype, int fl 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; @@ -823,21 +824,25 @@ do_kern_mount(const char *fstype, int fl } } - 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 = dget(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 = root; + mnt->mnt_mountpoint = root; mnt->mnt_parent = mnt; mnt->mnt_namespace = current->namespace; up_write(&sb->s_umount); put_filesystem(type); return mnt; out_sb: + dput(root); up_write(&sb->s_umount); deactivate_super(sb); sb = ERR_PTR(error); diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/sysfs/mount.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/sysfs/mount.c --- linux-2.6.12-rc2-mm3-fscache/fs/sysfs/mount.c 2005-04-06 13:45:27.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/sysfs/mount.c 2005-04-12 16:14:37.000000000 +0100 @@ -65,7 +65,7 @@ static int sysfs_fill_super(struct super } 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/sysv/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/sysv/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/sysv/super.c 2004-10-19 10:42:09.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/sysv/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -507,13 +507,13 @@ failed: /* 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/udf/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/udf/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/udf/super.c 2005-03-02 12:08:42.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/udf/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -100,7 +100,7 @@ static int udf_statfs(struct super_block /* 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/ufs/super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/ufs/super.c --- linux-2.6.12-rc2-mm3-fscache/fs/ufs/super.c 2005-04-06 13:45:27.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/ufs/super.c 2005-04-12 16:14:37.000000000 +0100 @@ -1308,7 +1308,7 @@ out: #endif 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 -uNrp linux-2.6.12-rc2-mm3-fscache/fs/vfat/namei.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/vfat/namei.c --- linux-2.6.12-rc2-mm3-fscache/fs/vfat/namei.c 2005-04-06 13:45:27.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/vfat/namei.c 2005-04-12 16:22:34.000000000 +0100 @@ -1051,7 +1051,7 @@ static int vfat_fill_super(struct super_ static struct super_block *vfat_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, - void *data) + void *data, struct dentry **_altroot) { return get_sb_bdev(fs_type, flags, dev_name, data, vfat_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/fs/xfs/linux-2.6/xfs_super.c linux-2.6.12-rc2-mm3-nfs-getsb/fs/xfs/linux-2.6/xfs_super.c --- linux-2.6.12-rc2-mm3-fscache/fs/xfs/linux-2.6/xfs_super.c 2005-04-06 13:45:27.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/fs/xfs/linux-2.6/xfs_super.c 2005-04-12 16:25:35.000000000 +0100 @@ -813,7 +813,8 @@ linvfs_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, linvfs_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/include/linux/fs.h linux-2.6.12-rc2-mm3-nfs-getsb/include/linux/fs.h --- linux-2.6.12-rc2-mm3-fscache/include/linux/fs.h 2005-04-12 15:49:11.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/include/linux/fs.h 2005-04-12 16:14:35.000000000 +0100 @@ -1193,7 +1193,7 @@ struct file_system_type { 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 -uNrp linux-2.6.12-rc2-mm3-fscache/include/linux/ramfs.h linux-2.6.12-rc2-mm3-nfs-getsb/include/linux/ramfs.h --- linux-2.6.12-rc2-mm3-fscache/include/linux/ramfs.h 2004-10-19 10:42:17.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/include/linux/ramfs.h 2005-04-12 16:33:17.000000000 +0100 @@ -3,7 +3,7 @@ struct inode *ramfs_get_inode(struct super_block *sb, int mode, dev_t dev); 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); extern struct file_operations ramfs_file_operations; extern struct vm_operations_struct generic_file_vm_ops; diff -uNrp linux-2.6.12-rc2-mm3-fscache/ipc/mqueue.c linux-2.6.12-rc2-mm3-nfs-getsb/ipc/mqueue.c --- linux-2.6.12-rc2-mm3-fscache/ipc/mqueue.c 2005-01-04 11:13:56.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/ipc/mqueue.c 2005-04-12 16:14:38.000000000 +0100 @@ -201,7 +201,7 @@ static int mqueue_fill_super(struct supe 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 -uNrp linux-2.6.12-rc2-mm3-fscache/kernel/cpuset.c linux-2.6.12-rc2-mm3-nfs-getsb/kernel/cpuset.c --- linux-2.6.12-rc2-mm3-fscache/kernel/cpuset.c 2005-04-12 15:49:13.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/kernel/cpuset.c 2005-04-12 16:34:53.000000000 +0100 @@ -315,7 +315,7 @@ static int cpuset_fill_super(struct supe static struct super_block *cpuset_get_sb(struct file_system_type *fs_type, int flags, const char *unused_dev_name, - void *data) + void *data, struct dentry **_root) { return get_sb_single(fs_type, flags, data, cpuset_fill_super); } diff -uNrp linux-2.6.12-rc2-mm3-fscache/kernel/futex.c linux-2.6.12-rc2-mm3-nfs-getsb/kernel/futex.c --- linux-2.6.12-rc2-mm3-fscache/kernel/futex.c 2005-04-06 13:45:39.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/kernel/futex.c 2005-04-12 16:14:38.000000000 +0100 @@ -771,7 +771,7 @@ asmlinkage long sys_futex(u32 __user *ua 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 -uNrp linux-2.6.12-rc2-mm3-fscache/mm/shmem.c linux-2.6.12-rc2-mm3-nfs-getsb/mm/shmem.c --- linux-2.6.12-rc2-mm3-fscache/mm/shmem.c 2005-04-12 15:49:14.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/mm/shmem.c 2005-04-12 16:14:38.000000000 +0100 @@ -2193,7 +2193,7 @@ static struct xattr_handler *shmem_xattr #endif /* CONFIG_TMPFS_XATTR */ 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 -uNrp linux-2.6.12-rc2-mm3-fscache/net/socket.c linux-2.6.12-rc2-mm3-nfs-getsb/net/socket.c --- linux-2.6.12-rc2-mm3-fscache/net/socket.c 2005-04-12 15:49:16.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/net/socket.c 2005-04-12 16:14:38.000000000 +0100 @@ -325,7 +325,7 @@ static struct super_operations sockfs_op }; 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 -uNrp linux-2.6.12-rc2-mm3-fscache/net/sunrpc/rpc_pipe.c linux-2.6.12-rc2-mm3-nfs-getsb/net/sunrpc/rpc_pipe.c --- linux-2.6.12-rc2-mm3-fscache/net/sunrpc/rpc_pipe.c 2005-03-02 12:09:10.000000000 +0000 +++ linux-2.6.12-rc2-mm3-nfs-getsb/net/sunrpc/rpc_pipe.c 2005-04-12 16:14:38.000000000 +0100 @@ -786,7 +786,7 @@ out: 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 -uNrp linux-2.6.12-rc2-mm3-fscache/security/selinux/selinuxfs.c linux-2.6.12-rc2-mm3-nfs-getsb/security/selinux/selinuxfs.c --- linux-2.6.12-rc2-mm3-fscache/security/selinux/selinuxfs.c 2005-04-12 15:49:17.000000000 +0100 +++ linux-2.6.12-rc2-mm3-nfs-getsb/security/selinux/selinuxfs.c 2005-04-12 16:14:38.000000000 +0100 @@ -1296,7 +1296,8 @@ out: } 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); }