[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>
This commit is contained in:
parent
454e2398be
commit
726c334223
@ -99,7 +99,7 @@ prototypes:
|
|||||||
int (*sync_fs)(struct super_block *sb, int wait);
|
int (*sync_fs)(struct super_block *sb, int wait);
|
||||||
void (*write_super_lockfs) (struct super_block *);
|
void (*write_super_lockfs) (struct super_block *);
|
||||||
void (*unlockfs) (struct super_block *);
|
void (*unlockfs) (struct super_block *);
|
||||||
int (*statfs) (struct super_block *, struct kstatfs *);
|
int (*statfs) (struct dentry *, struct kstatfs *);
|
||||||
int (*remount_fs) (struct super_block *, int *, char *);
|
int (*remount_fs) (struct super_block *, int *, char *);
|
||||||
void (*clear_inode) (struct inode *);
|
void (*clear_inode) (struct inode *);
|
||||||
void (*umount_begin) (struct super_block *);
|
void (*umount_begin) (struct super_block *);
|
||||||
|
@ -211,7 +211,7 @@ struct super_operations {
|
|||||||
int (*sync_fs)(struct super_block *sb, int wait);
|
int (*sync_fs)(struct super_block *sb, int wait);
|
||||||
void (*write_super_lockfs) (struct super_block *);
|
void (*write_super_lockfs) (struct super_block *);
|
||||||
void (*unlockfs) (struct super_block *);
|
void (*unlockfs) (struct super_block *);
|
||||||
int (*statfs) (struct super_block *, struct kstatfs *);
|
int (*statfs) (struct dentry *, struct kstatfs *);
|
||||||
int (*remount_fs) (struct super_block *, int *, char *);
|
int (*remount_fs) (struct super_block *, int *, char *);
|
||||||
void (*clear_inode) (struct inode *);
|
void (*clear_inode) (struct inode *);
|
||||||
void (*umount_begin) (struct super_block *);
|
void (*umount_begin) (struct super_block *);
|
||||||
|
@ -244,7 +244,7 @@ do_osf_statfs(struct dentry * dentry, struct osf_statfs __user *buffer,
|
|||||||
unsigned long bufsiz)
|
unsigned long bufsiz)
|
||||||
{
|
{
|
||||||
struct kstatfs linux_stat;
|
struct kstatfs linux_stat;
|
||||||
int error = vfs_statfs(dentry->d_inode->i_sb, &linux_stat);
|
int error = vfs_statfs(dentry, &linux_stat);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz);
|
error = linux_to_osf_statfs(&linux_stat, buffer, bufsiz);
|
||||||
return error;
|
return error;
|
||||||
|
@ -694,7 +694,7 @@ asmlinkage int irix_statfs(const char __user *path,
|
|||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf);
|
error = vfs_statfs(nd.dentry, &kbuf);
|
||||||
if (error)
|
if (error)
|
||||||
goto dput_and_out;
|
goto dput_and_out;
|
||||||
|
|
||||||
@ -732,7 +732,7 @@ asmlinkage int irix_fstatfs(unsigned int fd, struct irix_statfs __user *buf)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf);
|
error = vfs_statfs(file->f_dentry, &kbuf);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_f;
|
goto out_f;
|
||||||
|
|
||||||
@ -1360,7 +1360,7 @@ asmlinkage int irix_statvfs(char __user *fname, struct irix_statvfs __user *buf)
|
|||||||
error = user_path_walk(fname, &nd);
|
error = user_path_walk(fname, &nd);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf);
|
error = vfs_statfs(nd.dentry, &kbuf);
|
||||||
if (error)
|
if (error)
|
||||||
goto dput_and_out;
|
goto dput_and_out;
|
||||||
|
|
||||||
@ -1406,7 +1406,7 @@ asmlinkage int irix_fstatvfs(int fd, struct irix_statvfs __user *buf)
|
|||||||
error = -EBADF;
|
error = -EBADF;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf);
|
error = vfs_statfs(file->f_dentry, &kbuf);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_f;
|
goto out_f;
|
||||||
|
|
||||||
@ -1611,7 +1611,7 @@ asmlinkage int irix_statvfs64(char __user *fname, struct irix_statvfs64 __user *
|
|||||||
error = user_path_walk(fname, &nd);
|
error = user_path_walk(fname, &nd);
|
||||||
if (error)
|
if (error)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs(nd.dentry->d_inode->i_sb, &kbuf);
|
error = vfs_statfs(nd.dentry, &kbuf);
|
||||||
if (error)
|
if (error)
|
||||||
goto dput_and_out;
|
goto dput_and_out;
|
||||||
|
|
||||||
@ -1658,7 +1658,7 @@ asmlinkage int irix_fstatvfs64(int fd, struct irix_statvfs __user *buf)
|
|||||||
error = -EBADF;
|
error = -EBADF;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
error = vfs_statfs(file->f_dentry->d_inode->i_sb, &kbuf);
|
error = vfs_statfs(file->f_dentry, &kbuf);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_f;
|
goto out_f;
|
||||||
|
|
||||||
|
@ -145,7 +145,7 @@ static int hpux_ustat(dev_t dev, struct hpux_ustat __user *ubuf)
|
|||||||
s = user_get_super(dev);
|
s = user_get_super(dev);
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
err = vfs_statfs(s, &sbuf);
|
err = vfs_statfs(s->s_root, &sbuf);
|
||||||
drop_super(s);
|
drop_super(s);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
@ -186,12 +186,12 @@ struct hpux_statfs {
|
|||||||
int16_t f_pad;
|
int16_t f_pad;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int vfs_statfs_hpux(struct super_block *sb, struct hpux_statfs *buf)
|
static int vfs_statfs_hpux(struct dentry *dentry, struct hpux_statfs *buf)
|
||||||
{
|
{
|
||||||
struct kstatfs st;
|
struct kstatfs st;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
retval = vfs_statfs(sb, &st);
|
retval = vfs_statfs(dentry, &st);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
@ -219,7 +219,7 @@ asmlinkage long hpux_statfs(const char __user *path,
|
|||||||
error = user_path_walk(path, &nd);
|
error = user_path_walk(path, &nd);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
struct hpux_statfs tmp;
|
struct hpux_statfs tmp;
|
||||||
error = vfs_statfs_hpux(nd.dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs_hpux(nd.dentry, &tmp);
|
||||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
@ -237,7 +237,7 @@ asmlinkage long hpux_fstatfs(unsigned int fd, struct hpux_statfs __user * buf)
|
|||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
if (!file)
|
if (!file)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs_hpux(file->f_dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs_hpux(file->f_dentry, &tmp);
|
||||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
fput(file);
|
fput(file);
|
||||||
|
@ -356,7 +356,7 @@ static int report_statvfs(struct vfsmount *mnt, struct inode *inode, u32 buf)
|
|||||||
int error;
|
int error;
|
||||||
struct sol_statvfs __user *ss = A(buf);
|
struct sol_statvfs __user *ss = A(buf);
|
||||||
|
|
||||||
error = vfs_statfs(mnt->mnt_sb, &s);
|
error = vfs_statfs(mnt->mnt_root, &s);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
const char *p = mnt->mnt_sb->s_type->name;
|
const char *p = mnt->mnt_sb->s_type->name;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
@ -392,7 +392,7 @@ static int report_statvfs64(struct vfsmount *mnt, struct inode *inode, u32 buf)
|
|||||||
int error;
|
int error;
|
||||||
struct sol_statvfs64 __user *ss = A(buf);
|
struct sol_statvfs64 __user *ss = A(buf);
|
||||||
|
|
||||||
error = vfs_statfs(mnt->mnt_sb, &s);
|
error = vfs_statfs(mnt->mnt_root, &s);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
const char *p = mnt->mnt_sb->s_type->name;
|
const char *p = mnt->mnt_sb->s_type->name;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
@ -196,17 +196,17 @@ static int adfs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
return parse_options(sb, data);
|
return parse_options(sb, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int adfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int adfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct adfs_sb_info *asb = ADFS_SB(sb);
|
struct adfs_sb_info *asb = ADFS_SB(dentry->d_sb);
|
||||||
|
|
||||||
buf->f_type = ADFS_SUPER_MAGIC;
|
buf->f_type = ADFS_SUPER_MAGIC;
|
||||||
buf->f_namelen = asb->s_namelen;
|
buf->f_namelen = asb->s_namelen;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = dentry->d_sb->s_blocksize;
|
||||||
buf->f_blocks = asb->s_size;
|
buf->f_blocks = asb->s_size;
|
||||||
buf->f_files = asb->s_ids_per_zone * asb->s_map_size;
|
buf->f_files = asb->s_ids_per_zone * asb->s_map_size;
|
||||||
buf->f_bavail =
|
buf->f_bavail =
|
||||||
buf->f_bfree = adfs_map_free(sb);
|
buf->f_bfree = adfs_map_free(dentry->d_sb);
|
||||||
buf->f_ffree = (long)(buf->f_bfree * buf->f_files) / (long)buf->f_blocks;
|
buf->f_ffree = (long)(buf->f_bfree * buf->f_files) / (long)buf->f_blocks;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
extern struct timezone sys_tz;
|
extern struct timezone sys_tz;
|
||||||
|
|
||||||
static int affs_statfs(struct super_block *sb, struct kstatfs *buf);
|
static int affs_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
static int affs_remount (struct super_block *sb, int *flags, char *data);
|
static int affs_remount (struct super_block *sb, int *flags, char *data);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -508,8 +508,9 @@ affs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
affs_statfs(struct super_block *sb, struct kstatfs *buf)
|
affs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
int free;
|
int free;
|
||||||
|
|
||||||
pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB(sb)->s_partition_size,
|
pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB(sb)->s_partition_size,
|
||||||
|
@ -49,7 +49,7 @@ static int befs_nls2utf(struct super_block *sb, const char *in, int in_len,
|
|||||||
char **out, int *out_len);
|
char **out, int *out_len);
|
||||||
static void befs_put_super(struct super_block *);
|
static void befs_put_super(struct super_block *);
|
||||||
static int befs_remount(struct super_block *, int *, char *);
|
static int befs_remount(struct super_block *, int *, char *);
|
||||||
static int befs_statfs(struct super_block *, struct kstatfs *);
|
static int befs_statfs(struct dentry *, struct kstatfs *);
|
||||||
static int parse_options(char *, befs_mount_options *);
|
static int parse_options(char *, befs_mount_options *);
|
||||||
|
|
||||||
static const struct super_operations befs_sops = {
|
static const struct super_operations befs_sops = {
|
||||||
@ -880,8 +880,9 @@ befs_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
befs_statfs(struct super_block *sb, struct kstatfs *buf)
|
befs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
befs_debug(sb, "---> befs_statfs()");
|
befs_debug(sb, "---> befs_statfs()");
|
||||||
|
|
||||||
|
@ -203,8 +203,9 @@ static void bfs_put_super(struct super_block *s)
|
|||||||
s->s_fs_info = NULL;
|
s->s_fs_info = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int bfs_statfs(struct super_block *s, struct kstatfs *buf)
|
static int bfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *s = dentry->d_sb;
|
||||||
struct bfs_sb_info *info = BFS_SB(s);
|
struct bfs_sb_info *info = BFS_SB(s);
|
||||||
u64 id = huge_encode_dev(s->s_bdev->bd_dev);
|
u64 id = huge_encode_dev(s->s_bdev->bd_dev);
|
||||||
buf->f_type = BFS_MAGIC;
|
buf->f_type = BFS_MAGIC;
|
||||||
|
@ -166,8 +166,9 @@ cifs_put_super(struct super_block *sb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
cifs_statfs(struct super_block *sb, struct kstatfs *buf)
|
cifs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
int xid;
|
int xid;
|
||||||
int rc = -EOPNOTSUPP;
|
int rc = -EOPNOTSUPP;
|
||||||
struct cifs_sb_info *cifs_sb;
|
struct cifs_sb_info *cifs_sb;
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
/* VFS super_block ops */
|
/* VFS super_block ops */
|
||||||
static void coda_clear_inode(struct inode *);
|
static void coda_clear_inode(struct inode *);
|
||||||
static void coda_put_super(struct super_block *);
|
static void coda_put_super(struct super_block *);
|
||||||
static int coda_statfs(struct super_block *sb, struct kstatfs *buf);
|
static int coda_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
|
|
||||||
static kmem_cache_t * coda_inode_cachep;
|
static kmem_cache_t * coda_inode_cachep;
|
||||||
|
|
||||||
@ -278,13 +278,13 @@ struct inode_operations coda_file_inode_operations = {
|
|||||||
.setattr = coda_setattr,
|
.setattr = coda_setattr,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int coda_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int coda_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
|
||||||
error = venus_statfs(sb, buf);
|
error = venus_statfs(dentry, buf);
|
||||||
|
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
|
|
||||||
|
@ -611,7 +611,7 @@ int venus_pioctl(struct super_block *sb, struct CodaFid *fid,
|
|||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
int venus_statfs(struct super_block *sb, struct kstatfs *sfs)
|
int venus_statfs(struct dentry *dentry, struct kstatfs *sfs)
|
||||||
{
|
{
|
||||||
union inputArgs *inp;
|
union inputArgs *inp;
|
||||||
union outputArgs *outp;
|
union outputArgs *outp;
|
||||||
@ -620,7 +620,7 @@ int venus_statfs(struct super_block *sb, struct kstatfs *sfs)
|
|||||||
insize = max_t(unsigned int, INSIZE(statfs), OUTSIZE(statfs));
|
insize = max_t(unsigned int, INSIZE(statfs), OUTSIZE(statfs));
|
||||||
UPARG(CODA_STATFS);
|
UPARG(CODA_STATFS);
|
||||||
|
|
||||||
error = coda_upcall(coda_sbp(sb), insize, &outsize, inp);
|
error = coda_upcall(coda_sbp(dentry->d_sb), insize, &outsize, inp);
|
||||||
|
|
||||||
if (!error) {
|
if (!error) {
|
||||||
sfs->f_blocks = outp->coda_statfs.stat.f_blocks;
|
sfs->f_blocks = outp->coda_statfs.stat.f_blocks;
|
||||||
|
@ -197,7 +197,7 @@ asmlinkage long compat_sys_statfs(const char __user *path, struct compat_statfs
|
|||||||
error = user_path_walk(path, &nd);
|
error = user_path_walk(path, &nd);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
struct kstatfs tmp;
|
struct kstatfs tmp;
|
||||||
error = vfs_statfs(nd.dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs(nd.dentry, &tmp);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = put_compat_statfs(buf, &tmp);
|
error = put_compat_statfs(buf, &tmp);
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
@ -215,7 +215,7 @@ asmlinkage long compat_sys_fstatfs(unsigned int fd, struct compat_statfs __user
|
|||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
if (!file)
|
if (!file)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs(file->f_dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs(file->f_dentry, &tmp);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = put_compat_statfs(buf, &tmp);
|
error = put_compat_statfs(buf, &tmp);
|
||||||
fput(file);
|
fput(file);
|
||||||
@ -265,7 +265,7 @@ asmlinkage long compat_sys_statfs64(const char __user *path, compat_size_t sz, s
|
|||||||
error = user_path_walk(path, &nd);
|
error = user_path_walk(path, &nd);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
struct kstatfs tmp;
|
struct kstatfs tmp;
|
||||||
error = vfs_statfs(nd.dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs(nd.dentry, &tmp);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = put_compat_statfs64(buf, &tmp);
|
error = put_compat_statfs64(buf, &tmp);
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
@ -286,7 +286,7 @@ asmlinkage long compat_sys_fstatfs64(unsigned int fd, compat_size_t sz, struct c
|
|||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
if (!file)
|
if (!file)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs(file->f_dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs(file->f_dentry, &tmp);
|
||||||
if (!error)
|
if (!error)
|
||||||
error = put_compat_statfs64(buf, &tmp);
|
error = put_compat_statfs64(buf, &tmp);
|
||||||
fput(file);
|
fput(file);
|
||||||
|
@ -322,8 +322,10 @@ out:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cramfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int cramfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
buf->f_type = CRAMFS_MAGIC;
|
buf->f_type = CRAMFS_MAGIC;
|
||||||
buf->f_bsize = PAGE_CACHE_SIZE;
|
buf->f_bsize = PAGE_CACHE_SIZE;
|
||||||
buf->f_blocks = CRAMFS_SB(sb)->blocks;
|
buf->f_blocks = CRAMFS_SB(sb)->blocks;
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
#include <linux/buffer_head.h>
|
#include <linux/buffer_head.h>
|
||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
|
|
||||||
static int efs_statfs(struct super_block *s, struct kstatfs *buf);
|
static int efs_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
static int efs_fill_super(struct super_block *s, void *d, int silent);
|
static int efs_fill_super(struct super_block *s, void *d, int silent);
|
||||||
|
|
||||||
static int efs_get_sb(struct file_system_type *fs_type,
|
static int efs_get_sb(struct file_system_type *fs_type,
|
||||||
@ -322,8 +322,8 @@ out_no_fs:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int efs_statfs(struct super_block *s, struct kstatfs *buf) {
|
static int efs_statfs(struct dentry *dentry, struct kstatfs *buf) {
|
||||||
struct efs_sb_info *sb = SUPER_INFO(s);
|
struct efs_sb_info *sb = SUPER_INFO(dentry->d_sb);
|
||||||
|
|
||||||
buf->f_type = EFS_SUPER_MAGIC; /* efs magic number */
|
buf->f_type = EFS_SUPER_MAGIC; /* efs magic number */
|
||||||
buf->f_bsize = EFS_BLOCKSIZE; /* blocksize */
|
buf->f_bsize = EFS_BLOCKSIZE; /* blocksize */
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
static void ext2_sync_super(struct super_block *sb,
|
static void ext2_sync_super(struct super_block *sb,
|
||||||
struct ext2_super_block *es);
|
struct ext2_super_block *es);
|
||||||
static int ext2_remount (struct super_block * sb, int * flags, char * data);
|
static int ext2_remount (struct super_block * sb, int * flags, char * data);
|
||||||
static int ext2_statfs (struct super_block * sb, struct kstatfs * buf);
|
static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf);
|
||||||
|
|
||||||
void ext2_error (struct super_block * sb, const char * function,
|
void ext2_error (struct super_block * sb, const char * function,
|
||||||
const char * fmt, ...)
|
const char * fmt, ...)
|
||||||
@ -1038,8 +1038,9 @@ restore_opts:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ext2_statfs (struct super_block * sb, struct kstatfs * buf)
|
static int ext2_statfs (struct dentry * dentry, struct kstatfs * buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct ext2_sb_info *sbi = EXT2_SB(sb);
|
struct ext2_sb_info *sbi = EXT2_SB(sb);
|
||||||
unsigned long overhead;
|
unsigned long overhead;
|
||||||
int i;
|
int i;
|
||||||
|
@ -58,7 +58,7 @@ static int ext3_sync_fs(struct super_block *sb, int wait);
|
|||||||
static const char *ext3_decode_error(struct super_block * sb, int errno,
|
static const char *ext3_decode_error(struct super_block * sb, int errno,
|
||||||
char nbuf[16]);
|
char nbuf[16]);
|
||||||
static int ext3_remount (struct super_block * sb, int * flags, char * data);
|
static int ext3_remount (struct super_block * sb, int * flags, char * data);
|
||||||
static int ext3_statfs (struct super_block * sb, struct kstatfs * buf);
|
static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf);
|
||||||
static void ext3_unlockfs(struct super_block *sb);
|
static void ext3_unlockfs(struct super_block *sb);
|
||||||
static void ext3_write_super (struct super_block * sb);
|
static void ext3_write_super (struct super_block * sb);
|
||||||
static void ext3_write_super_lockfs(struct super_block *sb);
|
static void ext3_write_super_lockfs(struct super_block *sb);
|
||||||
@ -2318,8 +2318,9 @@ restore_opts:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ext3_statfs (struct super_block * sb, struct kstatfs * buf)
|
static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct ext3_sb_info *sbi = EXT3_SB(sb);
|
struct ext3_sb_info *sbi = EXT3_SB(sb);
|
||||||
struct ext3_super_block *es = sbi->s_es;
|
struct ext3_super_block *es = sbi->s_es;
|
||||||
unsigned long overhead;
|
unsigned long overhead;
|
||||||
|
@ -539,18 +539,18 @@ static int fat_remount(struct super_block *sb, int *flags, char *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fat_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int fat_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct msdos_sb_info *sbi = MSDOS_SB(sb);
|
struct msdos_sb_info *sbi = MSDOS_SB(dentry->d_sb);
|
||||||
|
|
||||||
/* If the count of free cluster is still unknown, counts it here. */
|
/* If the count of free cluster is still unknown, counts it here. */
|
||||||
if (sbi->free_clusters == -1) {
|
if (sbi->free_clusters == -1) {
|
||||||
int err = fat_count_free_clusters(sb);
|
int err = fat_count_free_clusters(dentry->d_sb);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf->f_type = sb->s_magic;
|
buf->f_type = dentry->d_sb->s_magic;
|
||||||
buf->f_bsize = sbi->cluster_size;
|
buf->f_bsize = sbi->cluster_size;
|
||||||
buf->f_blocks = sbi->max_cluster - FAT_START_ENT;
|
buf->f_blocks = sbi->max_cluster - FAT_START_ENT;
|
||||||
buf->f_bfree = sbi->free_clusters;
|
buf->f_bfree = sbi->free_clusters;
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/stat.h>
|
#include <linux/stat.h>
|
||||||
#include <linux/vfs.h>
|
#include <linux/vfs.h>
|
||||||
|
#include <linux/mount.h>
|
||||||
|
|
||||||
#include "vxfs.h"
|
#include "vxfs.h"
|
||||||
#include "vxfs_extern.h"
|
#include "vxfs_extern.h"
|
||||||
@ -55,7 +56,7 @@ MODULE_ALIAS("vxfs"); /* makes mount -t vxfs autoload the module */
|
|||||||
|
|
||||||
|
|
||||||
static void vxfs_put_super(struct super_block *);
|
static void vxfs_put_super(struct super_block *);
|
||||||
static int vxfs_statfs(struct super_block *, struct kstatfs *);
|
static int vxfs_statfs(struct dentry *, struct kstatfs *);
|
||||||
static int vxfs_remount(struct super_block *, int *, char *);
|
static int vxfs_remount(struct super_block *, int *, char *);
|
||||||
|
|
||||||
static struct super_operations vxfs_super_ops = {
|
static struct super_operations vxfs_super_ops = {
|
||||||
@ -90,12 +91,12 @@ vxfs_put_super(struct super_block *sbp)
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* vxfs_statfs - get filesystem information
|
* vxfs_statfs - get filesystem information
|
||||||
* @sbp: VFS superblock
|
* @dentry: VFS dentry to locate superblock
|
||||||
* @bufp: output buffer
|
* @bufp: output buffer
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* vxfs_statfs fills the statfs buffer @bufp with information
|
* vxfs_statfs fills the statfs buffer @bufp with information
|
||||||
* about the filesystem described by @sbp.
|
* about the filesystem described by @dentry.
|
||||||
*
|
*
|
||||||
* Returns:
|
* Returns:
|
||||||
* Zero.
|
* Zero.
|
||||||
@ -107,12 +108,12 @@ vxfs_put_super(struct super_block *sbp)
|
|||||||
* This is everything but complete...
|
* This is everything but complete...
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
vxfs_statfs(struct super_block *sbp, struct kstatfs *bufp)
|
vxfs_statfs(struct dentry *dentry, struct kstatfs *bufp)
|
||||||
{
|
{
|
||||||
struct vxfs_sb_info *infp = VXFS_SBI(sbp);
|
struct vxfs_sb_info *infp = VXFS_SBI(dentry->d_sb);
|
||||||
|
|
||||||
bufp->f_type = VXFS_SUPER_MAGIC;
|
bufp->f_type = VXFS_SUPER_MAGIC;
|
||||||
bufp->f_bsize = sbp->s_blocksize;
|
bufp->f_bsize = dentry->d_sb->s_blocksize;
|
||||||
bufp->f_blocks = infp->vsi_raw->vs_dsize;
|
bufp->f_blocks = infp->vsi_raw->vs_dsize;
|
||||||
bufp->f_bfree = infp->vsi_raw->vs_free;
|
bufp->f_bfree = infp->vsi_raw->vs_free;
|
||||||
bufp->f_bavail = 0;
|
bufp->f_bavail = 0;
|
||||||
|
@ -236,8 +236,9 @@ static void convert_fuse_statfs(struct kstatfs *stbuf, struct fuse_kstatfs *attr
|
|||||||
/* fsid is left zero */
|
/* fsid is left zero */
|
||||||
}
|
}
|
||||||
|
|
||||||
static int fuse_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int fuse_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct fuse_conn *fc = get_fuse_conn_super(sb);
|
struct fuse_conn *fc = get_fuse_conn_super(sb);
|
||||||
struct fuse_req *req;
|
struct fuse_req *req;
|
||||||
struct fuse_statfs_out outarg;
|
struct fuse_statfs_out outarg;
|
||||||
|
@ -80,8 +80,10 @@ static void hfs_put_super(struct super_block *sb)
|
|||||||
*
|
*
|
||||||
* changed f_files/f_ffree to reflect the fs_ablock/free_ablocks.
|
* changed f_files/f_ffree to reflect the fs_ablock/free_ablocks.
|
||||||
*/
|
*/
|
||||||
static int hfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int hfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
buf->f_type = HFS_SUPER_MAGIC;
|
buf->f_type = HFS_SUPER_MAGIC;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = sb->s_blocksize;
|
||||||
buf->f_blocks = (u32)HFS_SB(sb)->fs_ablocks * HFS_SB(sb)->fs_div;
|
buf->f_blocks = (u32)HFS_SB(sb)->fs_ablocks * HFS_SB(sb)->fs_div;
|
||||||
|
@ -212,8 +212,10 @@ static void hfsplus_put_super(struct super_block *sb)
|
|||||||
sb->s_fs_info = NULL;
|
sb->s_fs_info = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hfsplus_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int hfsplus_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
buf->f_type = HFSPLUS_SUPER_MAGIC;
|
buf->f_type = HFSPLUS_SUPER_MAGIC;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = sb->s_blocksize;
|
||||||
buf->f_blocks = HFSPLUS_SB(sb).total_blocks << HFSPLUS_SB(sb).fs_shift;
|
buf->f_blocks = HFSPLUS_SB(sb).total_blocks << HFSPLUS_SB(sb).fs_shift;
|
||||||
|
@ -239,7 +239,7 @@ static int read_inode(struct inode *ino)
|
|||||||
return(err);
|
return(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
int hostfs_statfs(struct super_block *sb, struct kstatfs *sf)
|
int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)
|
||||||
{
|
{
|
||||||
/* do_statfs uses struct statfs64 internally, but the linux kernel
|
/* do_statfs uses struct statfs64 internally, but the linux kernel
|
||||||
* struct statfs still has 32-bit versions for most of these fields,
|
* struct statfs still has 32-bit versions for most of these fields,
|
||||||
@ -252,7 +252,7 @@ int hostfs_statfs(struct super_block *sb, struct kstatfs *sf)
|
|||||||
long long f_files;
|
long long f_files;
|
||||||
long long f_ffree;
|
long long f_ffree;
|
||||||
|
|
||||||
err = do_statfs(HOSTFS_I(sb->s_root->d_inode)->host_filename,
|
err = do_statfs(HOSTFS_I(dentry->d_sb->s_root->d_inode)->host_filename,
|
||||||
&sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
|
&sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files,
|
||||||
&f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
|
&f_ffree, &sf->f_fsid, sizeof(sf->f_fsid),
|
||||||
&sf->f_namelen, sf->f_spare);
|
&sf->f_namelen, sf->f_spare);
|
||||||
|
@ -135,8 +135,9 @@ static unsigned count_bitmaps(struct super_block *s)
|
|||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hpfs_statfs(struct super_block *s, struct kstatfs *buf)
|
static int hpfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *s = dentry->d_sb;
|
||||||
struct hpfs_sb_info *sbi = hpfs_sb(s);
|
struct hpfs_sb_info *sbi = hpfs_sb(s);
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
|
||||||
|
@ -616,7 +616,7 @@ static const struct file_operations hppfs_dir_fops = {
|
|||||||
.fsync = hppfs_fsync,
|
.fsync = hppfs_fsync,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int hppfs_statfs(struct super_block *sb, struct kstatfs *sf)
|
static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf)
|
||||||
{
|
{
|
||||||
sf->f_blocks = 0;
|
sf->f_blocks = 0;
|
||||||
sf->f_bfree = 0;
|
sf->f_bfree = 0;
|
||||||
|
@ -467,9 +467,9 @@ static int hugetlbfs_set_page_dirty(struct page *page)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hugetlbfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int hugetlbfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(sb);
|
struct hugetlbfs_sb_info *sbinfo = HUGETLBFS_SB(dentry->d_sb);
|
||||||
|
|
||||||
buf->f_type = HUGETLBFS_MAGIC;
|
buf->f_type = HUGETLBFS_MAGIC;
|
||||||
buf->f_bsize = HPAGE_SIZE;
|
buf->f_bsize = HPAGE_SIZE;
|
||||||
|
@ -56,7 +56,7 @@ static void isofs_put_super(struct super_block *sb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void isofs_read_inode(struct inode *);
|
static void isofs_read_inode(struct inode *);
|
||||||
static int isofs_statfs (struct super_block *, struct kstatfs *);
|
static int isofs_statfs (struct dentry *, struct kstatfs *);
|
||||||
|
|
||||||
static kmem_cache_t *isofs_inode_cachep;
|
static kmem_cache_t *isofs_inode_cachep;
|
||||||
|
|
||||||
@ -901,8 +901,10 @@ out_freesbi:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int isofs_statfs (struct super_block *sb, struct kstatfs *buf)
|
static int isofs_statfs (struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
buf->f_type = ISOFS_SUPER_MAGIC;
|
buf->f_type = ISOFS_SUPER_MAGIC;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = sb->s_blocksize;
|
||||||
buf->f_blocks = (ISOFS_SB(sb)->s_nzones
|
buf->f_blocks = (ISOFS_SB(sb)->s_nzones
|
||||||
|
@ -377,9 +377,9 @@ jffs_new_inode(const struct inode * dir, struct jffs_raw_inode *raw_inode,
|
|||||||
|
|
||||||
/* Get statistics of the file system. */
|
/* Get statistics of the file system. */
|
||||||
static int
|
static int
|
||||||
jffs_statfs(struct super_block *sb, struct kstatfs *buf)
|
jffs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct jffs_control *c = (struct jffs_control *) sb->s_fs_info;
|
struct jffs_control *c = (struct jffs_control *) dentry->d_sb->s_fs_info;
|
||||||
struct jffs_fmcontrol *fmc;
|
struct jffs_fmcontrol *fmc;
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
@ -192,9 +192,9 @@ int jffs2_setattr(struct dentry *dentry, struct iattr *iattr)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
int jffs2_statfs(struct super_block *sb, struct kstatfs *buf)
|
int jffs2_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
|
struct jffs2_sb_info *c = JFFS2_SB_INFO(dentry->d_sb);
|
||||||
unsigned long avail;
|
unsigned long avail;
|
||||||
|
|
||||||
buf->f_type = JFFS2_SUPER_MAGIC;
|
buf->f_type = JFFS2_SUPER_MAGIC;
|
||||||
|
@ -175,7 +175,7 @@ void jffs2_clear_inode (struct inode *);
|
|||||||
void jffs2_dirty_inode(struct inode *inode);
|
void jffs2_dirty_inode(struct inode *inode);
|
||||||
struct inode *jffs2_new_inode (struct inode *dir_i, int mode,
|
struct inode *jffs2_new_inode (struct inode *dir_i, int mode,
|
||||||
struct jffs2_raw_inode *ri);
|
struct jffs2_raw_inode *ri);
|
||||||
int jffs2_statfs (struct super_block *, struct kstatfs *);
|
int jffs2_statfs (struct dentry *, struct kstatfs *);
|
||||||
void jffs2_write_super (struct super_block *);
|
void jffs2_write_super (struct super_block *);
|
||||||
int jffs2_remount_fs (struct super_block *, int *, char *);
|
int jffs2_remount_fs (struct super_block *, int *, char *);
|
||||||
int jffs2_do_fill_super(struct super_block *sb, void *data, int silent);
|
int jffs2_do_fill_super(struct super_block *sb, void *data, int silent);
|
||||||
|
@ -139,9 +139,9 @@ static void jfs_destroy_inode(struct inode *inode)
|
|||||||
kmem_cache_free(jfs_inode_cachep, ji);
|
kmem_cache_free(jfs_inode_cachep, ji);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int jfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int jfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct jfs_sb_info *sbi = JFS_SBI(sb);
|
struct jfs_sb_info *sbi = JFS_SBI(dentry->d_sb);
|
||||||
s64 maxinodes;
|
s64 maxinodes;
|
||||||
struct inomap *imap = JFS_IP(sbi->ipimap)->i_imap;
|
struct inomap *imap = JFS_IP(sbi->ipimap)->i_imap;
|
||||||
|
|
||||||
|
@ -20,9 +20,9 @@ int simple_getattr(struct vfsmount *mnt, struct dentry *dentry,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int simple_statfs(struct super_block *sb, struct kstatfs *buf)
|
int simple_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
buf->f_type = sb->s_magic;
|
buf->f_type = dentry->d_sb->s_magic;
|
||||||
buf->f_bsize = PAGE_CACHE_SIZE;
|
buf->f_bsize = PAGE_CACHE_SIZE;
|
||||||
buf->f_namelen = NAME_MAX;
|
buf->f_namelen = NAME_MAX;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
static void minix_read_inode(struct inode * inode);
|
static void minix_read_inode(struct inode * inode);
|
||||||
static int minix_write_inode(struct inode * inode, int wait);
|
static int minix_write_inode(struct inode * inode, int wait);
|
||||||
static int minix_statfs(struct super_block *sb, struct kstatfs *buf);
|
static int minix_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
static int minix_remount (struct super_block * sb, int * flags, char * data);
|
static int minix_remount (struct super_block * sb, int * flags, char * data);
|
||||||
|
|
||||||
static void minix_delete_inode(struct inode *inode)
|
static void minix_delete_inode(struct inode *inode)
|
||||||
@ -296,11 +296,11 @@ out_bad_sb:
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int minix_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int minix_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct minix_sb_info *sbi = minix_sb(sb);
|
struct minix_sb_info *sbi = minix_sb(dentry->d_sb);
|
||||||
buf->f_type = sb->s_magic;
|
buf->f_type = dentry->d_sb->s_magic;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = dentry->d_sb->s_blocksize;
|
||||||
buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size;
|
buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size;
|
||||||
buf->f_bfree = minix_count_free_blocks(sbi);
|
buf->f_bfree = minix_count_free_blocks(sbi);
|
||||||
buf->f_bavail = buf->f_bfree;
|
buf->f_bavail = buf->f_bfree;
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
|
|
||||||
static void ncp_delete_inode(struct inode *);
|
static void ncp_delete_inode(struct inode *);
|
||||||
static void ncp_put_super(struct super_block *);
|
static void ncp_put_super(struct super_block *);
|
||||||
static int ncp_statfs(struct super_block *, struct kstatfs *);
|
static int ncp_statfs(struct dentry *, struct kstatfs *);
|
||||||
|
|
||||||
static kmem_cache_t * ncp_inode_cachep;
|
static kmem_cache_t * ncp_inode_cachep;
|
||||||
|
|
||||||
@ -724,13 +724,14 @@ static void ncp_put_super(struct super_block *sb)
|
|||||||
kfree(server);
|
kfree(server);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ncp_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int ncp_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct dentry* d;
|
struct dentry* d;
|
||||||
struct inode* i;
|
struct inode* i;
|
||||||
struct ncp_inode_info* ni;
|
struct ncp_inode_info* ni;
|
||||||
struct ncp_server* s;
|
struct ncp_server* s;
|
||||||
struct ncp_volume_info vi;
|
struct ncp_volume_info vi;
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
int err;
|
int err;
|
||||||
__u8 dh;
|
__u8 dh;
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ static int nfs_write_inode(struct inode *,int);
|
|||||||
static void nfs_delete_inode(struct inode *);
|
static void nfs_delete_inode(struct inode *);
|
||||||
static void nfs_clear_inode(struct inode *);
|
static void nfs_clear_inode(struct inode *);
|
||||||
static void nfs_umount_begin(struct super_block *);
|
static void nfs_umount_begin(struct super_block *);
|
||||||
static int nfs_statfs(struct super_block *, struct kstatfs *);
|
static int nfs_statfs(struct dentry *, struct kstatfs *);
|
||||||
static int nfs_show_options(struct seq_file *, struct vfsmount *);
|
static int nfs_show_options(struct seq_file *, struct vfsmount *);
|
||||||
static int nfs_show_stats(struct seq_file *, struct vfsmount *);
|
static int nfs_show_stats(struct seq_file *, struct vfsmount *);
|
||||||
static void nfs_zap_acl_cache(struct inode *);
|
static void nfs_zap_acl_cache(struct inode *);
|
||||||
@ -534,8 +534,9 @@ nfs_fill_super(struct super_block *sb, struct nfs_mount_data *data, int silent)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
nfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
nfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct nfs_server *server = NFS_SB(sb);
|
struct nfs_server *server = NFS_SB(sb);
|
||||||
unsigned char blockbits;
|
unsigned char blockbits;
|
||||||
unsigned long blockres;
|
unsigned long blockres;
|
||||||
|
@ -1310,7 +1310,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,
|
|||||||
if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL)) ||
|
if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL)) ||
|
||||||
(bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
(bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
||||||
FATTR4_WORD1_SPACE_TOTAL))) {
|
FATTR4_WORD1_SPACE_TOTAL))) {
|
||||||
status = vfs_statfs(dentry->d_inode->i_sb, &statfs);
|
status = vfs_statfs(dentry, &statfs);
|
||||||
if (status)
|
if (status)
|
||||||
goto out_nfserr;
|
goto out_nfserr;
|
||||||
}
|
}
|
||||||
|
@ -1737,7 +1737,7 @@ int
|
|||||||
nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct kstatfs *stat)
|
nfsd_statfs(struct svc_rqst *rqstp, struct svc_fh *fhp, struct kstatfs *stat)
|
||||||
{
|
{
|
||||||
int err = fh_verify(rqstp, fhp, 0, MAY_NOP);
|
int err = fh_verify(rqstp, fhp, 0, MAY_NOP);
|
||||||
if (!err && vfs_statfs(fhp->fh_dentry->d_inode->i_sb,stat))
|
if (!err && vfs_statfs(fhp->fh_dentry,stat))
|
||||||
err = nfserr_io;
|
err = nfserr_io;
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
@ -2601,10 +2601,10 @@ static unsigned long __get_nr_free_mft_records(ntfs_volume *vol,
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* ntfs_statfs - return information about mounted NTFS volume
|
* ntfs_statfs - return information about mounted NTFS volume
|
||||||
* @sb: super block of mounted volume
|
* @dentry: dentry from mounted volume
|
||||||
* @sfs: statfs structure in which to return the information
|
* @sfs: statfs structure in which to return the information
|
||||||
*
|
*
|
||||||
* Return information about the mounted NTFS volume @sb in the statfs structure
|
* Return information about the mounted NTFS volume @dentry in the statfs structure
|
||||||
* pointed to by @sfs (this is initialized with zeros before ntfs_statfs is
|
* pointed to by @sfs (this is initialized with zeros before ntfs_statfs is
|
||||||
* called). We interpret the values to be correct of the moment in time at
|
* called). We interpret the values to be correct of the moment in time at
|
||||||
* which we are called. Most values are variable otherwise and this isn't just
|
* which we are called. Most values are variable otherwise and this isn't just
|
||||||
@ -2617,8 +2617,9 @@ static unsigned long __get_nr_free_mft_records(ntfs_volume *vol,
|
|||||||
*
|
*
|
||||||
* Return 0 on success or -errno on error.
|
* Return 0 on success or -errno on error.
|
||||||
*/
|
*/
|
||||||
static int ntfs_statfs(struct super_block *sb, struct kstatfs *sfs)
|
static int ntfs_statfs(struct dentry *dentry, struct kstatfs *sfs)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
s64 size;
|
s64 size;
|
||||||
ntfs_volume *vol = NTFS_SB(sb);
|
ntfs_volume *vol = NTFS_SB(sb);
|
||||||
ntfs_inode *mft_ni = NTFS_I(vol->mft_ino);
|
ntfs_inode *mft_ni = NTFS_I(vol->mft_ino);
|
||||||
|
@ -100,7 +100,7 @@ static int ocfs2_initialize_mem_caches(void);
|
|||||||
static void ocfs2_free_mem_caches(void);
|
static void ocfs2_free_mem_caches(void);
|
||||||
static void ocfs2_delete_osb(struct ocfs2_super *osb);
|
static void ocfs2_delete_osb(struct ocfs2_super *osb);
|
||||||
|
|
||||||
static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf);
|
static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
|
|
||||||
static int ocfs2_sync_fs(struct super_block *sb, int wait);
|
static int ocfs2_sync_fs(struct super_block *sb, int wait);
|
||||||
|
|
||||||
@ -857,7 +857,7 @@ static void ocfs2_put_super(struct super_block *sb)
|
|||||||
mlog_exit_void();
|
mlog_exit_void();
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int ocfs2_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct ocfs2_super *osb;
|
struct ocfs2_super *osb;
|
||||||
u32 numbits, freebits;
|
u32 numbits, freebits;
|
||||||
@ -866,9 +866,9 @@ static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf)
|
|||||||
struct buffer_head *bh = NULL;
|
struct buffer_head *bh = NULL;
|
||||||
struct inode *inode = NULL;
|
struct inode *inode = NULL;
|
||||||
|
|
||||||
mlog_entry("(%p, %p)\n", sb, buf);
|
mlog_entry("(%p, %p)\n", dentry->d_sb, buf);
|
||||||
|
|
||||||
osb = OCFS2_SB(sb);
|
osb = OCFS2_SB(dentry->d_sb);
|
||||||
|
|
||||||
inode = ocfs2_get_system_file_inode(osb,
|
inode = ocfs2_get_system_file_inode(osb,
|
||||||
GLOBAL_BITMAP_SYSTEM_INODE,
|
GLOBAL_BITMAP_SYSTEM_INODE,
|
||||||
@ -891,7 +891,7 @@ static int ocfs2_statfs(struct super_block *sb, struct kstatfs *buf)
|
|||||||
freebits = numbits - le32_to_cpu(bm_lock->id1.bitmap1.i_used);
|
freebits = numbits - le32_to_cpu(bm_lock->id1.bitmap1.i_used);
|
||||||
|
|
||||||
buf->f_type = OCFS2_SUPER_MAGIC;
|
buf->f_type = OCFS2_SUPER_MAGIC;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = dentry->d_sb->s_blocksize;
|
||||||
buf->f_namelen = OCFS2_MAX_FILENAME_LEN;
|
buf->f_namelen = OCFS2_MAX_FILENAME_LEN;
|
||||||
buf->f_blocks = ((sector_t) numbits) *
|
buf->f_blocks = ((sector_t) numbits) *
|
||||||
(osb->s_clustersize >> osb->sb->s_blocksize_bits);
|
(osb->s_clustersize >> osb->sb->s_blocksize_bits);
|
||||||
|
26
fs/open.c
26
fs/open.c
@ -31,18 +31,18 @@
|
|||||||
|
|
||||||
#include <asm/unistd.h>
|
#include <asm/unistd.h>
|
||||||
|
|
||||||
int vfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
int vfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
int retval = -ENODEV;
|
int retval = -ENODEV;
|
||||||
|
|
||||||
if (sb) {
|
if (dentry) {
|
||||||
retval = -ENOSYS;
|
retval = -ENOSYS;
|
||||||
if (sb->s_op->statfs) {
|
if (dentry->d_sb->s_op->statfs) {
|
||||||
memset(buf, 0, sizeof(*buf));
|
memset(buf, 0, sizeof(*buf));
|
||||||
retval = security_sb_statfs(sb);
|
retval = security_sb_statfs(dentry);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
retval = sb->s_op->statfs(sb, buf);
|
retval = dentry->d_sb->s_op->statfs(dentry, buf);
|
||||||
if (retval == 0 && buf->f_frsize == 0)
|
if (retval == 0 && buf->f_frsize == 0)
|
||||||
buf->f_frsize = buf->f_bsize;
|
buf->f_frsize = buf->f_bsize;
|
||||||
}
|
}
|
||||||
@ -52,12 +52,12 @@ int vfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
|||||||
|
|
||||||
EXPORT_SYMBOL(vfs_statfs);
|
EXPORT_SYMBOL(vfs_statfs);
|
||||||
|
|
||||||
static int vfs_statfs_native(struct super_block *sb, struct statfs *buf)
|
static int vfs_statfs_native(struct dentry *dentry, struct statfs *buf)
|
||||||
{
|
{
|
||||||
struct kstatfs st;
|
struct kstatfs st;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
retval = vfs_statfs(sb, &st);
|
retval = vfs_statfs(dentry, &st);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
@ -95,12 +95,12 @@ static int vfs_statfs_native(struct super_block *sb, struct statfs *buf)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vfs_statfs64(struct super_block *sb, struct statfs64 *buf)
|
static int vfs_statfs64(struct dentry *dentry, struct statfs64 *buf)
|
||||||
{
|
{
|
||||||
struct kstatfs st;
|
struct kstatfs st;
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
retval = vfs_statfs(sb, &st);
|
retval = vfs_statfs(dentry, &st);
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
@ -130,7 +130,7 @@ asmlinkage long sys_statfs(const char __user * path, struct statfs __user * buf)
|
|||||||
error = user_path_walk(path, &nd);
|
error = user_path_walk(path, &nd);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
struct statfs tmp;
|
struct statfs tmp;
|
||||||
error = vfs_statfs_native(nd.dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs_native(nd.dentry, &tmp);
|
||||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
@ -149,7 +149,7 @@ asmlinkage long sys_statfs64(const char __user *path, size_t sz, struct statfs64
|
|||||||
error = user_path_walk(path, &nd);
|
error = user_path_walk(path, &nd);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
struct statfs64 tmp;
|
struct statfs64 tmp;
|
||||||
error = vfs_statfs64(nd.dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs64(nd.dentry, &tmp);
|
||||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
path_release(&nd);
|
path_release(&nd);
|
||||||
@ -168,7 +168,7 @@ asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user * buf)
|
|||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
if (!file)
|
if (!file)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs_native(file->f_dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs_native(file->f_dentry, &tmp);
|
||||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
fput(file);
|
fput(file);
|
||||||
@ -189,7 +189,7 @@ asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, struct statfs64 __user
|
|||||||
file = fget(fd);
|
file = fget(fd);
|
||||||
if (!file)
|
if (!file)
|
||||||
goto out;
|
goto out;
|
||||||
error = vfs_statfs64(file->f_dentry->d_inode->i_sb, &tmp);
|
error = vfs_statfs64(file->f_dentry, &tmp);
|
||||||
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
if (!error && copy_to_user(buf, &tmp, sizeof(tmp)))
|
||||||
error = -EFAULT;
|
error = -EFAULT;
|
||||||
fput(file);
|
fput(file);
|
||||||
|
@ -128,7 +128,7 @@ static struct inode *qnx4_alloc_inode(struct super_block *sb);
|
|||||||
static void qnx4_destroy_inode(struct inode *inode);
|
static void qnx4_destroy_inode(struct inode *inode);
|
||||||
static void qnx4_read_inode(struct inode *);
|
static void qnx4_read_inode(struct inode *);
|
||||||
static int qnx4_remount(struct super_block *sb, int *flags, char *data);
|
static int qnx4_remount(struct super_block *sb, int *flags, char *data);
|
||||||
static int qnx4_statfs(struct super_block *, struct kstatfs *);
|
static int qnx4_statfs(struct dentry *, struct kstatfs *);
|
||||||
|
|
||||||
static struct super_operations qnx4_sops =
|
static struct super_operations qnx4_sops =
|
||||||
{
|
{
|
||||||
@ -282,8 +282,10 @@ unsigned long qnx4_block_map( struct inode *inode, long iblock )
|
|||||||
return block;
|
return block;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int qnx4_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
|
||||||
buf->f_type = sb->s_magic;
|
buf->f_type = sb->s_magic;
|
||||||
|
@ -60,7 +60,7 @@ static int is_any_reiserfs_magic_string(struct reiserfs_super_block *rs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int reiserfs_remount(struct super_block *s, int *flags, char *data);
|
static int reiserfs_remount(struct super_block *s, int *flags, char *data);
|
||||||
static int reiserfs_statfs(struct super_block *s, struct kstatfs *buf);
|
static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf);
|
||||||
|
|
||||||
static int reiserfs_sync_fs(struct super_block *s, int wait)
|
static int reiserfs_sync_fs(struct super_block *s, int wait)
|
||||||
{
|
{
|
||||||
@ -1938,15 +1938,15 @@ static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
|
|||||||
return errval;
|
return errval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int reiserfs_statfs(struct super_block *s, struct kstatfs *buf)
|
static int reiserfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(s);
|
struct reiserfs_super_block *rs = SB_DISK_SUPER_BLOCK(dentry->d_sb);
|
||||||
|
|
||||||
buf->f_namelen = (REISERFS_MAX_NAME(s->s_blocksize));
|
buf->f_namelen = (REISERFS_MAX_NAME(s->s_blocksize));
|
||||||
buf->f_bfree = sb_free_blocks(rs);
|
buf->f_bfree = sb_free_blocks(rs);
|
||||||
buf->f_bavail = buf->f_bfree;
|
buf->f_bavail = buf->f_bfree;
|
||||||
buf->f_blocks = sb_block_count(rs) - sb_bmap_nr(rs) - 1;
|
buf->f_blocks = sb_block_count(rs) - sb_bmap_nr(rs) - 1;
|
||||||
buf->f_bsize = s->s_blocksize;
|
buf->f_bsize = dentry->d_sb->s_blocksize;
|
||||||
/* changed to accommodate gcc folks. */
|
/* changed to accommodate gcc folks. */
|
||||||
buf->f_type = REISERFS_SUPER_MAGIC;
|
buf->f_type = REISERFS_SUPER_MAGIC;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -179,12 +179,12 @@ outnobh:
|
|||||||
/* That's simple too. */
|
/* That's simple too. */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
romfs_statfs(struct super_block *sb, struct kstatfs *buf)
|
romfs_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
buf->f_type = ROMFS_MAGIC;
|
buf->f_type = ROMFS_MAGIC;
|
||||||
buf->f_bsize = ROMBSIZE;
|
buf->f_bsize = ROMBSIZE;
|
||||||
buf->f_bfree = buf->f_bavail = buf->f_ffree;
|
buf->f_bfree = buf->f_bavail = buf->f_ffree;
|
||||||
buf->f_blocks = (romfs_maxsize(sb)+ROMBSIZE-1)>>ROMBSBITS;
|
buf->f_blocks = (romfs_maxsize(dentry->d_sb)+ROMBSIZE-1)>>ROMBSBITS;
|
||||||
buf->f_namelen = ROMFS_MAXFN;
|
buf->f_namelen = ROMFS_MAXFN;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
static void smb_delete_inode(struct inode *);
|
static void smb_delete_inode(struct inode *);
|
||||||
static void smb_put_super(struct super_block *);
|
static void smb_put_super(struct super_block *);
|
||||||
static int smb_statfs(struct super_block *, struct kstatfs *);
|
static int smb_statfs(struct dentry *, struct kstatfs *);
|
||||||
static int smb_show_options(struct seq_file *, struct vfsmount *);
|
static int smb_show_options(struct seq_file *, struct vfsmount *);
|
||||||
|
|
||||||
static kmem_cache_t *smb_inode_cachep;
|
static kmem_cache_t *smb_inode_cachep;
|
||||||
@ -641,13 +641,13 @@ out_no_server:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
smb_statfs(struct super_block *sb, struct kstatfs *buf)
|
smb_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
int result;
|
int result;
|
||||||
|
|
||||||
lock_kernel();
|
lock_kernel();
|
||||||
|
|
||||||
result = smb_proc_dskattr(sb, buf);
|
result = smb_proc_dskattr(dentry, buf);
|
||||||
|
|
||||||
unlock_kernel();
|
unlock_kernel();
|
||||||
|
|
||||||
|
@ -3226,9 +3226,9 @@ smb_proc_settime(struct dentry *dentry, struct smb_fattr *fattr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
smb_proc_dskattr(struct super_block *sb, struct kstatfs *attr)
|
smb_proc_dskattr(struct dentry *dentry, struct kstatfs *attr)
|
||||||
{
|
{
|
||||||
struct smb_sb_info *server = SMB_SB(sb);
|
struct smb_sb_info *server = SMB_SB(dentry->d_sb);
|
||||||
int result;
|
int result;
|
||||||
char *p;
|
char *p;
|
||||||
long unit;
|
long unit;
|
||||||
|
@ -29,7 +29,7 @@ extern int smb_proc_getattr(struct dentry *dir, struct smb_fattr *fattr);
|
|||||||
extern int smb_proc_setattr(struct dentry *dir, struct smb_fattr *fattr);
|
extern int smb_proc_setattr(struct dentry *dir, struct smb_fattr *fattr);
|
||||||
extern int smb_proc_setattr_unix(struct dentry *d, struct iattr *attr, unsigned int major, unsigned int minor);
|
extern int smb_proc_setattr_unix(struct dentry *d, struct iattr *attr, unsigned int major, unsigned int minor);
|
||||||
extern int smb_proc_settime(struct dentry *dentry, struct smb_fattr *fattr);
|
extern int smb_proc_settime(struct dentry *dentry, struct smb_fattr *fattr);
|
||||||
extern int smb_proc_dskattr(struct super_block *sb, struct kstatfs *attr);
|
extern int smb_proc_dskattr(struct dentry *dentry, struct kstatfs *attr);
|
||||||
extern int smb_proc_read_link(struct smb_sb_info *server, struct dentry *d, char *buffer, int len);
|
extern int smb_proc_read_link(struct smb_sb_info *server, struct dentry *d, char *buffer, int len);
|
||||||
extern int smb_proc_symlink(struct smb_sb_info *server, struct dentry *d, const char *oldpath);
|
extern int smb_proc_symlink(struct smb_sb_info *server, struct dentry *d, const char *oldpath);
|
||||||
extern int smb_proc_link(struct smb_sb_info *server, struct dentry *dentry, struct dentry *new_dentry);
|
extern int smb_proc_link(struct smb_sb_info *server, struct dentry *dentry, struct dentry *new_dentry);
|
||||||
|
@ -486,7 +486,7 @@ asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf)
|
|||||||
s = user_get_super(new_decode_dev(dev));
|
s = user_get_super(new_decode_dev(dev));
|
||||||
if (s == NULL)
|
if (s == NULL)
|
||||||
goto out;
|
goto out;
|
||||||
err = vfs_statfs(s, &sbuf);
|
err = vfs_statfs(s->s_root, &sbuf);
|
||||||
drop_super(s);
|
drop_super(s);
|
||||||
if (err)
|
if (err)
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -85,8 +85,9 @@ static void sysv_put_super(struct super_block *sb)
|
|||||||
kfree(sbi);
|
kfree(sbi);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sysv_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int sysv_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct sysv_sb_info *sbi = SYSV_SB(sb);
|
struct sysv_sb_info *sbi = SYSV_SB(sb);
|
||||||
|
|
||||||
buf->f_type = sb->s_magic;
|
buf->f_type = sb->s_magic;
|
||||||
|
@ -91,7 +91,7 @@ static void udf_load_partdesc(struct super_block *, struct buffer_head *);
|
|||||||
static void udf_open_lvid(struct super_block *);
|
static void udf_open_lvid(struct super_block *);
|
||||||
static void udf_close_lvid(struct super_block *);
|
static void udf_close_lvid(struct super_block *);
|
||||||
static unsigned int udf_count_free(struct super_block *);
|
static unsigned int udf_count_free(struct super_block *);
|
||||||
static int udf_statfs(struct super_block *, struct kstatfs *);
|
static int udf_statfs(struct dentry *, struct kstatfs *);
|
||||||
|
|
||||||
/* UDF filesystem type */
|
/* UDF filesystem type */
|
||||||
static int udf_get_sb(struct file_system_type *fs_type,
|
static int udf_get_sb(struct file_system_type *fs_type,
|
||||||
@ -1779,8 +1779,10 @@ udf_put_super(struct super_block *sb)
|
|||||||
* Written, tested, and released.
|
* Written, tested, and released.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
udf_statfs(struct super_block *sb, struct kstatfs *buf)
|
udf_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
|
|
||||||
buf->f_type = UDF_SUPER_MAGIC;
|
buf->f_type = UDF_SUPER_MAGIC;
|
||||||
buf->f_bsize = sb->s_blocksize;
|
buf->f_bsize = sb->s_blocksize;
|
||||||
buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb));
|
buf->f_blocks = UDF_SB_PARTLEN(sb, UDF_SB_PARTITION(sb));
|
||||||
|
@ -1113,8 +1113,9 @@ static int ufs_remount (struct super_block *sb, int *mount_flags, char *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ufs_statfs (struct super_block *sb, struct kstatfs *buf)
|
static int ufs_statfs (struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
|
struct super_block *sb = dentry->d_sb;
|
||||||
struct ufs_sb_private_info * uspi;
|
struct ufs_sb_private_info * uspi;
|
||||||
struct ufs_super_block_first * usb1;
|
struct ufs_super_block_first * usb1;
|
||||||
struct ufs_super_block * usb;
|
struct ufs_super_block * usb;
|
||||||
|
@ -684,10 +684,10 @@ xfs_fs_sync_super(
|
|||||||
|
|
||||||
STATIC int
|
STATIC int
|
||||||
xfs_fs_statfs(
|
xfs_fs_statfs(
|
||||||
struct super_block *sb,
|
struct dentry *dentry,
|
||||||
struct kstatfs *statp)
|
struct kstatfs *statp)
|
||||||
{
|
{
|
||||||
return -bhv_vfs_statvfs(vfs_from_sb(sb), statp, NULL);
|
return -bhv_vfs_statvfs(vfs_from_sb(dentry->d_sb), statp, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC int
|
STATIC int
|
||||||
|
@ -70,7 +70,7 @@ int venus_pioctl(struct super_block *sb, struct CodaFid *fid,
|
|||||||
unsigned int cmd, struct PioctlData *data);
|
unsigned int cmd, struct PioctlData *data);
|
||||||
int coda_downcall(int opcode, union outputArgs *out, struct super_block *sb);
|
int coda_downcall(int opcode, union outputArgs *out, struct super_block *sb);
|
||||||
int venus_fsync(struct super_block *sb, struct CodaFid *fid);
|
int venus_fsync(struct super_block *sb, struct CodaFid *fid);
|
||||||
int venus_statfs(struct super_block *sb, struct kstatfs *sfs);
|
int venus_statfs(struct dentry *dentry, struct kstatfs *sfs);
|
||||||
|
|
||||||
|
|
||||||
/* messages between coda filesystem in kernel and Venus */
|
/* messages between coda filesystem in kernel and Venus */
|
||||||
|
@ -1096,7 +1096,7 @@ struct super_operations {
|
|||||||
int (*sync_fs)(struct super_block *sb, int wait);
|
int (*sync_fs)(struct super_block *sb, int wait);
|
||||||
void (*write_super_lockfs) (struct super_block *);
|
void (*write_super_lockfs) (struct super_block *);
|
||||||
void (*unlockfs) (struct super_block *);
|
void (*unlockfs) (struct super_block *);
|
||||||
int (*statfs) (struct super_block *, struct kstatfs *);
|
int (*statfs) (struct dentry *, struct kstatfs *);
|
||||||
int (*remount_fs) (struct super_block *, int *, char *);
|
int (*remount_fs) (struct super_block *, int *, char *);
|
||||||
void (*clear_inode) (struct inode *);
|
void (*clear_inode) (struct inode *);
|
||||||
void (*umount_begin) (struct super_block *);
|
void (*umount_begin) (struct super_block *);
|
||||||
@ -1325,7 +1325,7 @@ extern struct vfsmount *copy_tree(struct vfsmount *, struct dentry *, int);
|
|||||||
extern void mnt_set_mountpoint(struct vfsmount *, struct dentry *,
|
extern void mnt_set_mountpoint(struct vfsmount *, struct dentry *,
|
||||||
struct vfsmount *);
|
struct vfsmount *);
|
||||||
|
|
||||||
extern int vfs_statfs(struct super_block *, struct kstatfs *);
|
extern int vfs_statfs(struct dentry *, struct kstatfs *);
|
||||||
|
|
||||||
/* /sys/fs */
|
/* /sys/fs */
|
||||||
extern struct subsystem fs_subsys;
|
extern struct subsystem fs_subsys;
|
||||||
@ -1746,7 +1746,7 @@ extern int dcache_dir_close(struct inode *, struct file *);
|
|||||||
extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
|
extern loff_t dcache_dir_lseek(struct file *, loff_t, int);
|
||||||
extern int dcache_readdir(struct file *, void *, filldir_t);
|
extern int dcache_readdir(struct file *, void *, filldir_t);
|
||||||
extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
extern int simple_getattr(struct vfsmount *, struct dentry *, struct kstat *);
|
||||||
extern int simple_statfs(struct super_block *, struct kstatfs *);
|
extern int simple_statfs(struct dentry *, struct kstatfs *);
|
||||||
extern int simple_link(struct dentry *, struct inode *, struct dentry *);
|
extern int simple_link(struct dentry *, struct inode *, struct dentry *);
|
||||||
extern int simple_unlink(struct inode *, struct dentry *);
|
extern int simple_unlink(struct inode *, struct dentry *);
|
||||||
extern int simple_rmdir(struct inode *, struct dentry *);
|
extern int simple_rmdir(struct inode *, struct dentry *);
|
||||||
|
@ -17,6 +17,11 @@
|
|||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <asm/atomic.h>
|
#include <asm/atomic.h>
|
||||||
|
|
||||||
|
struct super_block;
|
||||||
|
struct vfsmount;
|
||||||
|
struct dentry;
|
||||||
|
struct namespace;
|
||||||
|
|
||||||
#define MNT_NOSUID 0x01
|
#define MNT_NOSUID 0x01
|
||||||
#define MNT_NODEV 0x02
|
#define MNT_NODEV 0x02
|
||||||
#define MNT_NOEXEC 0x04
|
#define MNT_NOEXEC 0x04
|
||||||
|
@ -171,9 +171,9 @@ struct swap_info_struct;
|
|||||||
* Deallocate and clear the sb->s_security field.
|
* Deallocate and clear the sb->s_security field.
|
||||||
* @sb contains the super_block structure to be modified.
|
* @sb contains the super_block structure to be modified.
|
||||||
* @sb_statfs:
|
* @sb_statfs:
|
||||||
* Check permission before obtaining filesystem statistics for the @sb
|
* Check permission before obtaining filesystem statistics for the @mnt
|
||||||
* filesystem.
|
* mountpoint.
|
||||||
* @sb contains the super_block structure for the filesystem.
|
* @dentry is a handle on the superblock for the filesystem.
|
||||||
* Return 0 if permission is granted.
|
* Return 0 if permission is granted.
|
||||||
* @sb_mount:
|
* @sb_mount:
|
||||||
* Check permission before an object specified by @dev_name is mounted on
|
* Check permission before an object specified by @dev_name is mounted on
|
||||||
@ -1127,7 +1127,7 @@ struct security_operations {
|
|||||||
int (*sb_copy_data)(struct file_system_type *type,
|
int (*sb_copy_data)(struct file_system_type *type,
|
||||||
void *orig, void *copy);
|
void *orig, void *copy);
|
||||||
int (*sb_kern_mount) (struct super_block *sb, void *data);
|
int (*sb_kern_mount) (struct super_block *sb, void *data);
|
||||||
int (*sb_statfs) (struct super_block * sb);
|
int (*sb_statfs) (struct dentry *dentry);
|
||||||
int (*sb_mount) (char *dev_name, struct nameidata * nd,
|
int (*sb_mount) (char *dev_name, struct nameidata * nd,
|
||||||
char *type, unsigned long flags, void *data);
|
char *type, unsigned long flags, void *data);
|
||||||
int (*sb_check_sb) (struct vfsmount * mnt, struct nameidata * nd);
|
int (*sb_check_sb) (struct vfsmount * mnt, struct nameidata * nd);
|
||||||
@ -1450,9 +1450,9 @@ static inline int security_sb_kern_mount (struct super_block *sb, void *data)
|
|||||||
return security_ops->sb_kern_mount (sb, data);
|
return security_ops->sb_kern_mount (sb, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int security_sb_statfs (struct super_block *sb)
|
static inline int security_sb_statfs (struct dentry *dentry)
|
||||||
{
|
{
|
||||||
return security_ops->sb_statfs (sb);
|
return security_ops->sb_statfs (dentry);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int security_sb_mount (char *dev_name, struct nameidata *nd,
|
static inline int security_sb_mount (char *dev_name, struct nameidata *nd,
|
||||||
@ -2162,7 +2162,7 @@ static inline int security_sb_kern_mount (struct super_block *sb, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int security_sb_statfs (struct super_block *sb)
|
static inline int security_sb_statfs (struct dentry *dentry)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -118,7 +118,7 @@ static int check_free_space(struct file *file)
|
|||||||
spin_unlock(&acct_globals.lock);
|
spin_unlock(&acct_globals.lock);
|
||||||
|
|
||||||
/* May block */
|
/* May block */
|
||||||
if (vfs_statfs(file->f_dentry->d_inode->i_sb, &sbuf))
|
if (vfs_statfs(file->f_dentry, &sbuf))
|
||||||
return res;
|
return res;
|
||||||
suspend = sbuf.f_blocks * SUSPEND;
|
suspend = sbuf.f_blocks * SUSPEND;
|
||||||
resume = sbuf.f_blocks * RESUME;
|
resume = sbuf.f_blocks * RESUME;
|
||||||
|
@ -1654,9 +1654,9 @@ static ssize_t shmem_file_sendfile(struct file *in_file, loff_t *ppos,
|
|||||||
return desc.error;
|
return desc.error;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int shmem_statfs(struct super_block *sb, struct kstatfs *buf)
|
static int shmem_statfs(struct dentry *dentry, struct kstatfs *buf)
|
||||||
{
|
{
|
||||||
struct shmem_sb_info *sbinfo = SHMEM_SB(sb);
|
struct shmem_sb_info *sbinfo = SHMEM_SB(dentry->d_sb);
|
||||||
|
|
||||||
buf->f_type = TMPFS_MAGIC;
|
buf->f_type = TMPFS_MAGIC;
|
||||||
buf->f_bsize = PAGE_CACHE_SIZE;
|
buf->f_bsize = PAGE_CACHE_SIZE;
|
||||||
|
@ -191,7 +191,7 @@ static int dummy_sb_kern_mount (struct super_block *sb, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dummy_sb_statfs (struct super_block *sb)
|
static int dummy_sb_statfs (struct dentry *dentry)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1903,13 +1903,13 @@ static int selinux_sb_kern_mount(struct super_block *sb, void *data)
|
|||||||
return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
|
return superblock_has_perm(current, sb, FILESYSTEM__MOUNT, &ad);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int selinux_sb_statfs(struct super_block *sb)
|
static int selinux_sb_statfs(struct dentry *dentry)
|
||||||
{
|
{
|
||||||
struct avc_audit_data ad;
|
struct avc_audit_data ad;
|
||||||
|
|
||||||
AVC_AUDIT_DATA_INIT(&ad,FS);
|
AVC_AUDIT_DATA_INIT(&ad,FS);
|
||||||
ad.u.fs.dentry = sb->s_root;
|
ad.u.fs.dentry = dentry->d_sb->s_root;
|
||||||
return superblock_has_perm(current, sb, FILESYSTEM__GETATTR, &ad);
|
return superblock_has_perm(current, dentry->d_sb, FILESYSTEM__GETATTR, &ad);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int selinux_mount(char * dev_name,
|
static int selinux_mount(char * dev_name,
|
||||||
|
Loading…
Reference in New Issue
Block a user