diff options
author | David Howells <dhowells@redhat.com> | 2006-06-23 05:02:58 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-23 10:42:45 -0400 |
commit | 726c334223180e3c0197cc980a432681370d4baf (patch) | |
tree | 8327b354bb3dc959a6606051ae6f8d4d035e38a2 /arch | |
parent | 454e2398be9b9fa30433fccc548db34d19aa9958 (diff) |
[PATCH] VFS: Permit filesystem to perform statfs with a known root dentry
Give the statfs superblock operation a dentry pointer rather than a superblock
pointer.
This complements the get_sb() patch. That reduced the significance of
sb->s_root, allowing NFS to place a fake root there. However, NFS does
require a dentry to use as a target for the statfs operation. This permits
the root in the vfsmount to be used instead.
linux/mount.h has been added where necessary to make allyesconfig build
successfully.
Interest has also been expressed for use with the FUSE and XFS filesystems.
Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: Nathan Scott <nathans@sgi.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/alpha/kernel/osf_sys.c | 2 | ||||
-rw-r--r-- | arch/mips/kernel/sysirix.c | 12 | ||||
-rw-r--r-- | arch/parisc/hpux/sys_hpux.c | 10 | ||||
-rw-r--r-- | arch/sparc64/solaris/fs.c | 4 |
4 files changed, 14 insertions, 14 deletions
diff --git a/arch/alpha/kernel/osf_sys.c b/arch/alpha/kernel/osf_sys.c index 31afe3d91ac6..e15dcf4f3dcd 100644 --- a/arch/alpha/kernel/osf_sys.c +++ b/arch/alpha/kernel/osf_sys.c | |||
@@ -244,7 +244,7 @@ do_osf_statfs(struct dentry * dentry, struct osf_statfs __user *buffer, | |||
244 | unsigned long bufsiz) | 244 | unsigned long bufsiz) |
245 | { | 245 | { |
246 | struct kstatfs linux_stat; | 246 | struct kstatfs linux_stat; |
247 | int error = vfs_statfs(dentry->d_inode->i_sb, &linux_stat); | 247 | int error = vfs_statfs(dentry, &linux_stat); |
248 | if (!error) | 248 | if (!error) |
249 | error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz); | 249 | error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz); |
250 | return error; | 250 | return error; |
diff --git a/arch/mips/kernel/sysirix.c b/arch/mips/kernel/sysirix.c index 5407b784cd01..19e1ef43eb4b 100644 --- a/arch/mips/kernel/sysirix.c +++ b/arch/mips/kernel/sysirix.c | |||
@@ -694,7 +694,7 @@ asmlinkage int irix_statfs(const char __user *path, | |||
694 | if (error) | 694 | if (error) |
695 | goto out; | 695 | goto out; |
696 | 696 | ||
697 | error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf); | 697 | error = vfs_statfs(nd.dentry, &kbuf); |
698 | if (error) | 698 | if (error) |
699 | goto dput_and_out; | 699 | goto dput_and_out; |
700 | 700 | ||
@@ -732,7 +732,7 @@ asmlinkage int irix_fstatfs(unsigned int fd, struct irix_statfs __user *buf) | |||
732 | goto out; | 732 | goto out; |
733 | } | 733 | } |
734 | 734 | ||
735 | error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf); | 735 | error = vfs_statfs(file->f_dentry, &kbuf); |
736 | if (error) | 736 | if (error) |
737 | goto out_f; | 737 | goto out_f; |
738 | 738 | ||
@@ -1360,7 +1360,7 @@ asmlinkage int irix_statvfs(char __user *fname, struct irix_statvfs __user *buf) | |||
1360 | error = user_path_walk(fname, &nd); | 1360 | error = user_path_walk(fname, &nd); |
1361 | if (error) | 1361 | if (error) |
1362 | goto out; | 1362 | goto out; |
1363 | error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf); | 1363 | error = vfs_statfs(nd.dentry, &kbuf); |
1364 | if (error) | 1364 | if (error) |
1365 | goto dput_and_out; | 1365 | goto dput_and_out; |
1366 | 1366 | ||
@@ -1406,7 +1406,7 @@ asmlinkage int irix_fstatvfs(int fd, struct irix_statvfs __user *buf) | |||
1406 | error = -EBADF; | 1406 | error = -EBADF; |
1407 | goto out; | 1407 | goto out; |
1408 | } | 1408 | } |
1409 | error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf); | 1409 | error = vfs_statfs(file->f_dentry, &kbuf); |
1410 | if (error) | 1410 | if (error) |
1411 | goto out_f; | 1411 | goto out_f; |
1412 | 1412 | ||
@@ -1611,7 +1611,7 @@ asmlinkage int irix_statvfs64(char __user *fname, struct irix_statvfs64 __user * | |||
1611 | error = user_path_walk(fname, &nd); | 1611 | error = user_path_walk(fname, &nd); |
1612 | if (error) | 1612 | if (error) |
1613 | goto out; | 1613 | goto out; |
1614 | error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf); | 1614 | error = vfs_statfs(nd.dentry, &kbuf); |
1615 | if (error) | 1615 | if (error) |
1616 | goto dput_and_out; | 1616 | goto dput_and_out; |
1617 | 1617 | ||
@@ -1658,7 +1658,7 @@ asmlinkage int irix_fstatvfs64(int fd, struct irix_statvfs __user *buf) | |||
1658 | error = -EBADF; | 1658 | error = -EBADF; |
1659 | goto out; | 1659 | goto out; |
1660 | } | 1660 | } |
1661 | error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf); | 1661 | error = vfs_statfs(file->f_dentry, &kbuf); |
1662 | if (error) | 1662 | if (error) |
1663 | goto out_f; | 1663 | goto out_f; |
1664 | 1664 | ||
diff --git a/arch/parisc/hpux/sys_hpux.c b/arch/parisc/hpux/sys_hpux.c index 05273ccced0e..cb69727027ae 100644 --- a/arch/parisc/hpux/sys_hpux.c +++ b/arch/parisc/hpux/sys_hpux.c | |||
@@ -145,7 +145,7 @@ static int hpux_ustat(dev_t dev, struct hpux_ustat __user *ubuf) | |||
145 | s = user_get_super(dev); | 145 | s = user_get_super(dev); |
146 | if (s == NULL) | 146 | if (s == NULL) |
147 | goto out; | 147 | goto out; |
148 | err = vfs_statfs(s, &sbuf); | 148 | err = vfs_statfs(s->s_root, &sbuf); |
149 | drop_super(s); | 149 | drop_super(s); |
150 | if (err) | 150 | if (err) |
151 | goto out; | 151 | goto out; |
@@ -186,12 +186,12 @@ struct hpux_statfs { | |||
186 | int16_t f_pad; | 186 | int16_t f_pad; |
187 | }; | 187 | }; |
188 | 188 | ||
189 | static int vfs_statfs_hpux(struct super_block *sb, struct hpux_statfs *buf) | 189 | static int vfs_statfs_hpux(struct dentry *dentry, struct hpux_statfs *buf) |
190 | { | 190 | { |
191 | struct kstatfs st; | 191 | struct kstatfs st; |
192 | int retval; | 192 | int retval; |
193 | 193 | ||
194 | retval = vfs_statfs(sb, &st); | 194 | retval = vfs_statfs(dentry, &st); |
195 | if (retval) | 195 | if (retval) |
196 | return retval; | 196 | return retval; |
197 | 197 | ||
@@ -219,7 +219,7 @@ asmlinkage long hpux_statfs(const char __user *path, | |||
219 | error = user_path_walk(path, &nd); | 219 | error = user_path_walk(path, &nd); |
220 | if (!error) { | 220 | if (!error) { |
221 | struct hpux_statfs tmp; | 221 | struct hpux_statfs tmp; |
222 | error = vfs_statfs_hpux(nd.dentry->d_inode->i_sb, &tmp); | 222 | error = vfs_statfs_hpux(nd.dentry, &tmp); |
223 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | 223 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) |
224 | error = -EFAULT; | 224 | error = -EFAULT; |
225 | path_release(&nd); | 225 | path_release(&nd); |
@@ -237,7 +237,7 @@ asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf) | |||
237 | file = fget(fd); | 237 | file = fget(fd); |
238 | if (!file) | 238 | if (!file) |
239 | goto out; | 239 | goto out; |
240 | error = vfs_statfs_hpux(file->f_dentry->d_inode->i_sb, &tmp); | 240 | error = vfs_statfs_hpux(file->f_dentry, &tmp); |
241 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) | 241 | if (!error && copy_to_user(buf, &tmp, sizeof(tmp))) |
242 | error = -EFAULT; | 242 | error = -EFAULT; |
243 | fput(file); | 243 | fput(file); |
diff --git a/arch/sparc64/solaris/fs.c b/arch/sparc64/solaris/fs.c index 4885ca6cbc77..0f0eb6aa1c40 100644 --- a/arch/sparc64/solaris/fs.c +++ b/arch/sparc64/solaris/fs.c | |||
@@ -356,7 +356,7 @@ static int report_statvfs(struct vfsmount *mnt, struct inode *inode, u32 buf) | |||
356 | int error; | 356 | int error; |
357 | struct sol_statvfs __user *ss = A(buf); | 357 | struct sol_statvfs __user *ss = A(buf); |
358 | 358 | ||
359 | error = vfs_statfs(mnt->mnt_sb, &s); | 359 | error = vfs_statfs(mnt->mnt_root, &s); |
360 | if (!error) { | 360 | if (!error) { |
361 | const char *p = mnt->mnt_sb->s_type->name; | 361 | const char *p = mnt->mnt_sb->s_type->name; |
362 | int i = 0; | 362 | int i = 0; |
@@ -392,7 +392,7 @@ static int report_statvfs64(struct vfsmount *mnt, struct inode *inode, u32 buf) | |||
392 | int error; | 392 | int error; |
393 | struct sol_statvfs64 __user *ss = A(buf); | 393 | struct sol_statvfs64 __user *ss = A(buf); |
394 | 394 | ||
395 | error = vfs_statfs(mnt->mnt_sb, &s); | 395 | error = vfs_statfs(mnt->mnt_root, &s); |
396 | if (!error) { | 396 | if (!error) { |
397 | const char *p = mnt->mnt_sb->s_type->name; | 397 | const char *p = mnt->mnt_sb->s_type->name; |
398 | int i = 0; | 398 | int i = 0; |