hostfs: don't keep a field in each inode when we are using it only in root
Subsystems (2)
PATCH 26/58 hostfs: don't keep a field in each inode when we are using it only in root
Signed-off-by Al Viro <[email protected]>
--- fs/hostfs/hostfs_kern.c | 39 +++++++++++++++------------------------ 1 files changed, 15 insertions(+), 24 deletions(-)
fs/hostfs/hostfs_kern.c +15 -24
@@ -19,7 +19,6 @@#include "kern.h" struct hostfs_inode_info { -char *host_filename;int fd;fmode_t mode;struct inode vfs_inode;
@@ -103,7 +102,7 @@ static char *dentry_name(struct dentry *dentry, int extra) parent = parent->d_parent; } - root =HOSTFS_I (parent->d_inode)->host_filename; + root = parent->d_sb->s_fs_info; len +=strlen (root); name =kmalloc (len + extra +1 ,GFP_KERNEL );if (name ==NULL )
@@ -266,7 +265,7 @@ int hostfs_statfs(struct dentry *dentry, struct kstatfs *sf)long long f_files;long long f_ffree; - err =do_statfs (HOSTFS_I (dentry->d_sb->s_root->d_inode)->host_filename, + err =do_statfs (dentry->d_sb->s_fs_info, &sf->f_bsize, &f_blocks, &f_bfree, &f_bavail, &f_files, &f_ffree, &sf->f_fsid,sizeof (sf->f_fsid), &sf->f_namelen, sf->f_spare);
@@ -285,13 +284,10 @@ static struct inode *hostfs_alloc_inode(struct super_block *sb) {struct hostfs_inode_info *hi; - hi =kmalloc (sizeof (*hi),GFP_KERNEL ); + hi =kzalloc (sizeof (*hi),GFP_KERNEL );if (hi ==NULL )return NULL ; - - *hi = ((struct hostfs_inode_info ) { .host_filename =NULL , - .fd =-1 , - .mode =0 }); + hi->fd =-1 ;inode_init_once (&hi->vfs_inode);return &hi->vfs_inode; }
@@ -308,14 +304,12 @@ static void hostfs_evict_inode(struct inode *inode)static void hostfs_destroy_inode (struct inode *inode) { -kfree (HOSTFS_I (inode)->host_filename);kfree (HOSTFS_I (inode)); }static int hostfs_show_options (struct seq_file *seq,struct vfsmount *vfs) { -struct inode *root = vfs->mnt_sb->s_root->d_inode; -const char *root_path =HOSTFS_I (root)->host_filename; +const char *root_path = vfs->mnt_sb->s_fs_info;size_t offset =strlen (root_ino) +1 ;if (strlen (root_path) > offset)
@@ -978,8 +972,8 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) req_root ="" ; err = -ENOMEM ; - host_root_path =kmalloc (strlen (root_ino) +1 - +strlen (req_root) +1 ,GFP_KERNEL ); + sb->s_fs_info = host_root_path = +kmalloc (strlen (root_ino) +strlen (req_root) +2 ,GFP_KERNEL );if (host_root_path ==NULL ) goto out;
@@ -988,20 +982,13 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) root_inode =hostfs_iget (sb);if (IS_ERR (root_inode)) { err =PTR_ERR (root_inode); - goto out_free; + goto out; } err =init_inode (root_inode,NULL );if (err) goto out_put; -HOSTFS_I (root_inode)->host_filename = host_root_path; -/* -* Avoid that in the error path, iput(root_inode) frees again -* host_root_path through hostfs_destroy_inode! -*/ - host_root_path =NULL ; - err = -ENOMEM ; sb->s_root =d_alloc_root (root_inode);if (sb->s_root ==NULL )
@@ -1019,8 +1006,6 @@ static int hostfs_fill_sb_common(struct super_block *sb, void *d, int silent) out_put:iput (root_inode); -out_free: -kfree (host_root_path); out:return err; }
@@ -1032,11 +1017,17 @@ static int hostfs_read_sb(struct file_system_type *type,return get_sb_nodev (type, flags, data, hostfs_fill_sb_common, mnt); } +static void hostfs_kill_sb (struct super_block *s) +{ +kill_anon_super (s); +kfree (s->s_fs_info); +} +static struct file_system_type hostfs_type = { .owner =THIS_MODULE , .name ="hostfs" , .get_sb = hostfs_read_sb, - .kill_sb = kill_anon_super, + .kill_sb = hostfs_kill_sb, .fs_flags =0 , };
Signature · 1 line
1.5.6.5