aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/filesystems/Locking6
-rw-r--r--Documentation/filesystems/porting7
-rw-r--r--Documentation/filesystems/vfs.txt56
-rw-r--r--fs/super.c67
-rw-r--r--include/linux/fs.h14
5 files changed, 47 insertions, 103 deletions
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
index 4471a416c274..2e994efe12cb 100644
--- a/Documentation/filesystems/Locking
+++ b/Documentation/filesystems/Locking
@@ -166,13 +166,11 @@ prototypes:
166 void (*kill_sb) (struct super_block *); 166 void (*kill_sb) (struct super_block *);
167locking rules: 167locking rules:
168 may block 168 may block
169get_sb yes
170mount yes 169mount yes
171kill_sb yes 170kill_sb yes
172 171
173->get_sb() returns error or 0 with locked superblock attached to the vfsmount 172->mount() returns ERR_PTR or the root dentry; its superblock should be locked
174(exclusive on ->s_umount). 173on return.
175->mount() returns ERR_PTR or the root dentry.
176->kill_sb() takes a write-locked superblock, does all shutdown work on it, 174->kill_sb() takes a write-locked superblock, does all shutdown work on it,
177unlocks and drops the reference. 175unlocks and drops the reference.
178 176
diff --git a/Documentation/filesystems/porting b/Documentation/filesystems/porting
index dfbcd1b00b0a..0c986c9e8519 100644
--- a/Documentation/filesystems/porting
+++ b/Documentation/filesystems/porting
@@ -394,3 +394,10 @@ file) you must return -EOPNOTSUPP if FALLOC_FL_PUNCH_HOLE is set in mode.
394Currently you can only have FALLOC_FL_PUNCH_HOLE with FALLOC_FL_KEEP_SIZE set, 394Currently you can only have FALLOC_FL_PUNCH_HOLE with FALLOC_FL_KEEP_SIZE set,
395so the i_size should not change when hole punching, even when puching the end of 395so the i_size should not change when hole punching, even when puching the end of
396a file off. 396a file off.
397
398--
399[mandatory]
400 ->get_sb() is gone. Switch to use of ->mount(). Typically it's just
401a matter of switching from calling get_sb_... to mount_... and changing the
402function type. If you were doing it manually, just switch from setting ->mnt_root
403to some pointer to returning that pointer. On errors return ERR_PTR(...).
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
index 94cf97b901d7..ef0714aa8e40 100644
--- a/Documentation/filesystems/vfs.txt
+++ b/Documentation/filesystems/vfs.txt
@@ -95,10 +95,11 @@ functions:
95 extern int unregister_filesystem(struct file_system_type *); 95 extern int unregister_filesystem(struct file_system_type *);
96 96
97The passed struct file_system_type describes your filesystem. When a 97The passed struct file_system_type describes your filesystem. When a
98request is made to mount a device onto a directory in your filespace, 98request is made to mount a filesystem onto a directory in your namespace,
99the VFS will call the appropriate get_sb() method for the specific 99the VFS will call the appropriate mount() method for the specific
100filesystem. The dentry for the mount point will then be updated to 100filesystem. New vfsmount refering to the tree returned by ->mount()
101point to the root inode for the new filesystem. 101will be attached to the mountpoint, so that when pathname resolution
102reaches the mountpoint it will jump into the root of that vfsmount.
102 103
103You can see all filesystems that are registered to the kernel in the 104You can see all filesystems that are registered to the kernel in the
104file /proc/filesystems. 105file /proc/filesystems.
@@ -107,14 +108,14 @@ file /proc/filesystems.
107struct file_system_type 108struct file_system_type
108----------------------- 109-----------------------
109 110
110This describes the filesystem. As of kernel 2.6.22, the following 111This describes the filesystem. As of kernel 2.6.39, the following
111members are defined: 112members are defined:
112 113
113struct file_system_type { 114struct file_system_type {
114 const char *name; 115 const char *name;
115 int fs_flags; 116 int fs_flags;
116 int (*get_sb) (struct file_system_type *, int, 117 struct dentry (*mount) (struct file_system_type *, int,
117 const char *, void *, struct vfsmount *); 118 const char *, void *);
118 void (*kill_sb) (struct super_block *); 119 void (*kill_sb) (struct super_block *);
119 struct module *owner; 120 struct module *owner;
120 struct file_system_type * next; 121 struct file_system_type * next;
@@ -128,11 +129,11 @@ struct file_system_type {
128 129
129 fs_flags: various flags (i.e. FS_REQUIRES_DEV, FS_NO_DCACHE, etc.) 130 fs_flags: various flags (i.e. FS_REQUIRES_DEV, FS_NO_DCACHE, etc.)
130 131
131 get_sb: the method to call when a new instance of this 132 mount: the method to call when a new instance of this
132 filesystem should be mounted 133 filesystem should be mounted
133 134
134 kill_sb: the method to call when an instance of this filesystem 135 kill_sb: the method to call when an instance of this filesystem
135 should be unmounted 136 should be shut down
136 137
137 owner: for internal VFS use: you should initialize this to THIS_MODULE in 138 owner: for internal VFS use: you should initialize this to THIS_MODULE in
138 most cases. 139 most cases.
@@ -141,7 +142,7 @@ struct file_system_type {
141 142
142 s_lock_key, s_umount_key: lockdep-specific 143 s_lock_key, s_umount_key: lockdep-specific
143 144
144The get_sb() method has the following arguments: 145The mount() method has the following arguments:
145 146
146 struct file_system_type *fs_type: describes the filesystem, partly initialized 147 struct file_system_type *fs_type: describes the filesystem, partly initialized
147 by the specific filesystem code 148 by the specific filesystem code
@@ -153,32 +154,39 @@ The get_sb() method has the following arguments:
153 void *data: arbitrary mount options, usually comes as an ASCII 154 void *data: arbitrary mount options, usually comes as an ASCII
154 string (see "Mount Options" section) 155 string (see "Mount Options" section)
155 156
156 struct vfsmount *mnt: a vfs-internal representation of a mount point 157The mount() method must return the root dentry of the tree requested by
158caller. An active reference to its superblock must be grabbed and the
159superblock must be locked. On failure it should return ERR_PTR(error).
157 160
158The get_sb() method must determine if the block device specified 161The arguments match those of mount(2) and their interpretation
159in the dev_name and fs_type contains a filesystem of the type the method 162depends on filesystem type. E.g. for block filesystems, dev_name is
160supports. If it succeeds in opening the named block device, it initializes a 163interpreted as block device name, that device is opened and if it
161struct super_block descriptor for the filesystem contained by the block device. 164contains a suitable filesystem image the method creates and initializes
162On failure it returns an error. 165struct super_block accordingly, returning its root dentry to caller.
166
167->mount() may choose to return a subtree of existing filesystem - it
168doesn't have to create a new one. The main result from the caller's
169point of view is a reference to dentry at the root of (sub)tree to
170be attached; creation of new superblock is a common side effect.
163 171
164The most interesting member of the superblock structure that the 172The most interesting member of the superblock structure that the
165get_sb() method fills in is the "s_op" field. This is a pointer to 173mount() method fills in is the "s_op" field. This is a pointer to
166a "struct super_operations" which describes the next level of the 174a "struct super_operations" which describes the next level of the
167filesystem implementation. 175filesystem implementation.
168 176
169Usually, a filesystem uses one of the generic get_sb() implementations 177Usually, a filesystem uses one of the generic mount() implementations
170and provides a fill_super() method instead. The generic methods are: 178and provides a fill_super() callback instead. The generic variants are:
171 179
172 get_sb_bdev: mount a filesystem residing on a block device 180 mount_bdev: mount a filesystem residing on a block device
173 181
174 get_sb_nodev: mount a filesystem that is not backed by a device 182 mount_nodev: mount a filesystem that is not backed by a device
175 183
176 get_sb_single: mount a filesystem which shares the instance between 184 mount_single: mount a filesystem which shares the instance between
177 all mounts 185 all mounts
178 186
179A fill_super() method implementation has the following arguments: 187A fill_super() callback implementation has the following arguments:
180 188
181 struct super_block *sb: the superblock structure. The method fill_super() 189 struct super_block *sb: the superblock structure. The callback
182 must initialize this properly. 190 must initialize this properly.
183 191
184 void *data: arbitrary mount options, usually comes as an ASCII 192 void *data: arbitrary mount options, usually comes as an ASCII
diff --git a/fs/super.c b/fs/super.c
index 7e9dd4cc2c01..4bae0ef6110e 100644
--- a/fs/super.c
+++ b/fs/super.c
@@ -843,23 +843,6 @@ error:
843} 843}
844EXPORT_SYMBOL(mount_bdev); 844EXPORT_SYMBOL(mount_bdev);
845 845
846int get_sb_bdev(struct file_system_type *fs_type,
847 int flags, const char *dev_name, void *data,
848 int (*fill_super)(struct super_block *, void *, int),
849 struct vfsmount *mnt)
850{
851 struct dentry *root;
852
853 root = mount_bdev(fs_type, flags, dev_name, data, fill_super);
854 if (IS_ERR(root))
855 return PTR_ERR(root);
856 mnt->mnt_root = root;
857 mnt->mnt_sb = root->d_sb;
858 return 0;
859}
860
861EXPORT_SYMBOL(get_sb_bdev);
862
863void kill_block_super(struct super_block *sb) 846void kill_block_super(struct super_block *sb)
864{ 847{
865 struct block_device *bdev = sb->s_bdev; 848 struct block_device *bdev = sb->s_bdev;
@@ -897,22 +880,6 @@ struct dentry *mount_nodev(struct file_system_type *fs_type,
897} 880}
898EXPORT_SYMBOL(mount_nodev); 881EXPORT_SYMBOL(mount_nodev);
899 882
900int get_sb_nodev(struct file_system_type *fs_type,
901 int flags, void *data,
902 int (*fill_super)(struct super_block *, void *, int),
903 struct vfsmount *mnt)
904{
905 struct dentry *root;
906
907 root = mount_nodev(fs_type, flags, data, fill_super);
908 if (IS_ERR(root))
909 return PTR_ERR(root);
910 mnt->mnt_root = root;
911 mnt->mnt_sb = root->d_sb;
912 return 0;
913}
914EXPORT_SYMBOL(get_sb_nodev);
915
916static int compare_single(struct super_block *s, void *p) 883static int compare_single(struct super_block *s, void *p)
917{ 884{
918 return 1; 885 return 1;
@@ -943,22 +910,6 @@ struct dentry *mount_single(struct file_system_type *fs_type,
943} 910}
944EXPORT_SYMBOL(mount_single); 911EXPORT_SYMBOL(mount_single);
945 912
946int get_sb_single(struct file_system_type *fs_type,
947 int flags, void *data,
948 int (*fill_super)(struct super_block *, void *, int),
949 struct vfsmount *mnt)
950{
951 struct dentry *root;
952 root = mount_single(fs_type, flags, data, fill_super);
953 if (IS_ERR(root))
954 return PTR_ERR(root);
955 mnt->mnt_root = root;
956 mnt->mnt_sb = root->d_sb;
957 return 0;
958}
959
960EXPORT_SYMBOL(get_sb_single);
961
962struct vfsmount * 913struct vfsmount *
963vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data) 914vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void *data)
964{ 915{
@@ -988,19 +939,13 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void
988 goto out_free_secdata; 939 goto out_free_secdata;
989 } 940 }
990 941
991 if (type->mount) { 942 root = type->mount(type, flags, name, data);
992 root = type->mount(type, flags, name, data); 943 if (IS_ERR(root)) {
993 if (IS_ERR(root)) { 944 error = PTR_ERR(root);
994 error = PTR_ERR(root); 945 goto out_free_secdata;
995 goto out_free_secdata;
996 }
997 mnt->mnt_root = root;
998 mnt->mnt_sb = root->d_sb;
999 } else {
1000 error = type->get_sb(type, flags, name, data, mnt);
1001 if (error < 0)
1002 goto out_free_secdata;
1003 } 946 }
947 mnt->mnt_root = root;
948 mnt->mnt_sb = root->d_sb;
1004 BUG_ON(!mnt->mnt_sb); 949 BUG_ON(!mnt->mnt_sb);
1005 WARN_ON(!mnt->mnt_sb->s_bdi); 950 WARN_ON(!mnt->mnt_sb->s_bdi);
1006 mnt->mnt_sb->s_flags |= MS_BORN; 951 mnt->mnt_sb->s_flags |= MS_BORN;
diff --git a/include/linux/fs.h b/include/linux/fs.h
index e6d3fe45981b..ffaa0e4926ed 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -1797,8 +1797,6 @@ int sync_inode_metadata(struct inode *inode, int wait);
1797struct file_system_type { 1797struct file_system_type {
1798 const char *name; 1798 const char *name;
1799 int fs_flags; 1799 int fs_flags;
1800 int (*get_sb) (struct file_system_type *, int,
1801 const char *, void *, struct vfsmount *);
1802 struct dentry *(*mount) (struct file_system_type *, int, 1800 struct dentry *(*mount) (struct file_system_type *, int,
1803 const char *, void *); 1801 const char *, void *);
1804 void (*kill_sb) (struct super_block *); 1802 void (*kill_sb) (struct super_block *);
@@ -1821,24 +1819,12 @@ extern struct dentry *mount_ns(struct file_system_type *fs_type, int flags,
1821extern struct dentry *mount_bdev(struct file_system_type *fs_type, 1819extern struct dentry *mount_bdev(struct file_system_type *fs_type,
1822 int flags, const char *dev_name, void *data, 1820 int flags, const char *dev_name, void *data,
1823 int (*fill_super)(struct super_block *, void *, int)); 1821 int (*fill_super)(struct super_block *, void *, int));
1824extern int get_sb_bdev(struct file_system_type *fs_type,
1825 int flags, const char *dev_name, void *data,
1826 int (*fill_super)(struct super_block *, void *, int),
1827 struct vfsmount *mnt);
1828extern struct dentry *mount_single(struct file_system_type *fs_type, 1822extern struct dentry *mount_single(struct file_system_type *fs_type,
1829 int flags, void *data, 1823 int flags, void *data,
1830 int (*fill_super)(struct super_block *, void *, int)); 1824 int (*fill_super)(struct super_block *, void *, int));
1831extern int get_sb_single(struct file_system_type *fs_type,
1832 int flags, void *data,
1833 int (*fill_super)(struct super_block *, void *, int),
1834 struct vfsmount *mnt);
1835extern struct dentry *mount_nodev(struct file_system_type *fs_type, 1825extern struct dentry *mount_nodev(struct file_system_type *fs_type,
1836 int flags, void *data, 1826 int flags, void *data,
1837 int (*fill_super)(struct super_block *, void *, int)); 1827 int (*fill_super)(struct super_block *, void *, int));
1838extern int get_sb_nodev(struct file_system_type *fs_type,
1839 int flags, void *data,
1840 int (*fill_super)(struct super_block *, void *, int),
1841 struct vfsmount *mnt);
1842void generic_shutdown_super(struct super_block *sb); 1828void generic_shutdown_super(struct super_block *sb);
1843void kill_block_super(struct super_block *sb); 1829void kill_block_super(struct super_block *sb);
1844void kill_anon_super(struct super_block *sb); 1830void kill_anon_super(struct super_block *sb);