diff options
| author | Brian Gerst <bgerst@didntduck.org> | 2002-03-14 23:16:03 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2002-03-14 23:16:03 -0800 |
| commit | 88774498ce0502af118d42b76ff93acdcb0a1579 (patch) | |
| tree | d1ed3aa41a751e08c9f34f166517c4e4848aabed | |
| parent | 2191d229f70f20ce7d1fa25f4cc2cb67071ad7b1 (diff) | |
[PATCH] struct super_block cleanup - smbfs
Seperates smb_sb_info from struct super_block.
| -rw-r--r-- | fs/smbfs/inode.c | 20 | ||||
| -rw-r--r-- | fs/smbfs/proc.c | 2 | ||||
| -rw-r--r-- | include/linux/fs.h | 2 | ||||
| -rw-r--r-- | include/linux/smb_fs.h | 6 | ||||
| -rw-r--r-- | include/linux/smb_fs_sb.h | 8 |
5 files changed, 28 insertions, 10 deletions
diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c index 2f57be53425a..a3426d6a0ddc 100644 --- a/fs/smbfs/inode.c +++ b/fs/smbfs/inode.c @@ -400,7 +400,7 @@ parse_options(struct smb_mount_data_kernel *mnt, char *options) static int smb_show_options(struct seq_file *s, struct vfsmount *m) { - struct smb_mount_data_kernel *mnt = m->mnt_sb->u.smbfs_sb.mnt; + struct smb_mount_data_kernel *mnt = SMB_SB(m->mnt_sb)->mnt; int i; for (i = 0; opts[i].name != NULL; i++) @@ -435,7 +435,7 @@ smb_show_options(struct seq_file *s, struct vfsmount *m) static void smb_put_super(struct super_block *sb) { - struct smb_sb_info *server = &(sb->u.smbfs_sb); + struct smb_sb_info *server = SMB_SB(sb); if (server->sock_file) { smb_dont_catch_keepalive(server); @@ -457,11 +457,13 @@ smb_put_super(struct super_block *sb) unload_nls(server->local_nls); server->local_nls = NULL; } + sb->u.generic_sbp = NULL; + smb_kfree(server); } int smb_fill_super(struct super_block *sb, void *raw_data, int silent) { - struct smb_sb_info *server = &sb->u.smbfs_sb; + struct smb_sb_info *server; struct smb_mount_data_kernel *mnt; struct smb_mount_data *oldmnt; struct inode *root_inode; @@ -482,6 +484,13 @@ int smb_fill_super(struct super_block *sb, void *raw_data, int silent) sb->s_magic = SMB_SUPER_MAGIC; sb->s_op = &smb_sops; + server = smb_kmalloc(sizeof(struct smb_sb_info), GFP_KERNEL); + if (!server) + goto out_no_server; + sb->u.generic_sbp = server; + memset(server, 0, sizeof(struct smb_sb_info)); + + server->super_block = sb; server->mnt = NULL; server->sock_file = NULL; init_MUTEX(&server->sem); @@ -578,6 +587,8 @@ out_no_temp: out_no_mem: if (!server->mnt) printk(KERN_ERR "smb_fill_super: allocation failure\n"); + sb->u.generic_sbp = NULL; + smb_kfree(server); goto out_fail; out_wrong_data: printk(KERN_ERR "smbfs: mount_data version %d is not supported\n", ver); @@ -586,6 +597,9 @@ out_no_data: printk(KERN_ERR "smb_fill_super: missing data argument\n"); out_fail: return -EINVAL; +out_no_server: + printk(KERN_ERR "smb_fill_super: cannot allocate struct smb_sb_info\n"); + return -ENOMEM; } static int diff --git a/fs/smbfs/proc.c b/fs/smbfs/proc.c index 336619bf6ec1..671a6f7bf76d 100644 --- a/fs/smbfs/proc.c +++ b/fs/smbfs/proc.c @@ -2884,7 +2884,7 @@ smb_proc_settime(struct dentry *dentry, struct smb_fattr *fattr) int smb_proc_dskattr(struct super_block *sb, struct statfs *attr) { - struct smb_sb_info *server = &(sb->u.smbfs_sb); + struct smb_sb_info *server = SMB_SB(sb); int result; char *p; long unit; diff --git a/include/linux/fs.h b/include/linux/fs.h index 41eb1e05a41f..effe19261c54 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -653,7 +653,6 @@ struct quota_mount_options #include <linux/affs_fs_sb.h> #include <linux/ufs_fs_sb.h> #include <linux/romfs_fs_sb.h> -#include <linux/smb_fs_sb.h> #include <linux/hfs_fs_sb.h> #include <linux/adfs_fs_sb.h> #include <linux/qnx4_fs_sb.h> @@ -705,7 +704,6 @@ struct super_block { struct ufs_sb_info ufs_sb; struct shmem_sb_info shmem_sb; struct romfs_sb_info romfs_sb; - struct smb_sb_info smbfs_sb; struct hfs_sb_info hfs_sb; struct adfs_sb_info adfs_sb; struct qnx4_sb_info qnx4_sb; diff --git a/include/linux/smb_fs.h b/include/linux/smb_fs.h index 62c079d5a44b..f554cf9057a8 100644 --- a/include/linux/smb_fs.h +++ b/include/linux/smb_fs.h @@ -11,6 +11,7 @@ #include <linux/smb.h> #include <linux/smb_fs_i.h> +#include <linux/smb_fs_sb.h> /* * ioctl commands @@ -29,6 +30,11 @@ #include <linux/smb_mount.h> #include <asm/unaligned.h> +static inline struct smb_sb_info *SMB_SB(struct super_block *sb) +{ + return sb->u.generic_sbp; +} + static inline struct smb_inode_info *SMB_I(struct inode *inode) { return list_entry(inode, struct smb_inode_info, vfs_inode); diff --git a/include/linux/smb_fs_sb.h b/include/linux/smb_fs_sb.h index 8226f7ecb79b..c5db9cd5136c 100644 --- a/include/linux/smb_fs_sb.h +++ b/include/linux/smb_fs_sb.h @@ -15,10 +15,9 @@ #include <linux/smb.h> /* structure access macros */ -#define server_from_inode(inode) (&(inode)->i_sb->u.smbfs_sb) -#define server_from_dentry(dentry) (&(dentry)->d_sb->u.smbfs_sb) -#define SB_of(server) ((struct super_block *) ((char *)(server) - \ - (unsigned long)(&((struct super_block *)0)->u.smbfs_sb))) +#define server_from_inode(inode) SMB_SB((inode)->i_sb) +#define server_from_dentry(dentry) SMB_SB((dentry)->d_sb) +#define SB_of(server) ((server)->super_block) struct smb_sb_info { enum smb_conn_state state; @@ -55,6 +54,7 @@ struct smb_sb_info { char *name_buf; struct smb_ops *ops; + struct super_block *super_block; }; |
