]> git.hungrycats.org Git - linux/commitdiff
[PATCH] struct super_block cleanup - msdos/vfat
authorBrian Gerst <bgerst@didntduck.org>
Fri, 15 Mar 2002 07:15:59 +0000 (23:15 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 15 Mar 2002 07:15:59 +0000 (23:15 -0800)
Seperates msdos_sb_info from struct super_block for msdos and vfat.
Umsdos is terminally broken and is not included.

fs/fat/fatfs_syms.c
fs/fat/inode.c
fs/msdos/namei.c
fs/vfat/namei.c
include/linux/fs.h
include/linux/msdos_fs.h

index 8b7152af25ae8491b2cf6ba9e2d8e0f70f591b52..1c3884da4c2417c5557fef21246f8c0966f6ce36 100644 (file)
@@ -24,7 +24,7 @@ EXPORT_SYMBOL(fat_put_super);
 EXPORT_SYMBOL(fat_attach);
 EXPORT_SYMBOL(fat_detach);
 EXPORT_SYMBOL(fat_build_inode);
-EXPORT_SYMBOL(fat_read_super);
+EXPORT_SYMBOL(fat_fill_super);
 EXPORT_SYMBOL(fat_search_long);
 EXPORT_SYMBOL(fat_readdir);
 EXPORT_SYMBOL(fat_scan);
index 10efdd661c63b6b4342702b1be38c7e7b7290420..b2e6f985e5abc7de4041158fe454e348b854b6f0 100644 (file)
@@ -167,32 +167,36 @@ void fat_clear_inode(struct inode *inode)
 
 void fat_put_super(struct super_block *sb)
 {
-       if (MSDOS_SB(sb)->cvf_format->cvf_version) {
-               dec_cvf_format_use_count_by_version(MSDOS_SB(sb)->cvf_format->cvf_version);
-               MSDOS_SB(sb)->cvf_format->unmount_cvf(sb);
+       struct msdos_sb_info *sbi = MSDOS_SB(sb);
+
+       if (sbi->cvf_format->cvf_version) {
+               dec_cvf_format_use_count_by_version(sbi->cvf_format->cvf_version);
+               sbi->cvf_format->unmount_cvf(sb);
        }
-       if (MSDOS_SB(sb)->fat_bits == 32) {
+       if (sbi->fat_bits == 32) {
                fat_clusters_flush(sb);
        }
        fat_cache_inval_dev(sb);
        set_blocksize (sb->s_dev,BLOCK_SIZE);
-       if (MSDOS_SB(sb)->nls_disk) {
-               unload_nls(MSDOS_SB(sb)->nls_disk);
-               MSDOS_SB(sb)->nls_disk = NULL;
-               MSDOS_SB(sb)->options.codepage = 0;
+       if (sbi->nls_disk) {
+               unload_nls(sbi->nls_disk);
+               sbi->nls_disk = NULL;
+               sbi->options.codepage = 0;
        }
-       if (MSDOS_SB(sb)->nls_io) {
-               unload_nls(MSDOS_SB(sb)->nls_io);
-               MSDOS_SB(sb)->nls_io = NULL;
+       if (sbi->nls_io) {
+               unload_nls(sbi->nls_io);
+               sbi->nls_io = NULL;
        }
        /*
         * Note: the iocharset option might have been specified
         * without enabling nls_io, so check for it here.
         */
-       if (MSDOS_SB(sb)->options.iocharset) {
-               kfree(MSDOS_SB(sb)->options.iocharset);
-               MSDOS_SB(sb)->options.iocharset = NULL;
+       if (sbi->options.iocharset) {
+               kfree(sbi->options.iocharset);
+               sbi->options.iocharset = NULL;
        }
+       sb->u.generic_sbp = NULL;
+       kfree(sbi);
 }
 
 
@@ -582,18 +586,14 @@ static struct super_operations fat_sops = {
 
 /*
  * Read the super block of an MS-DOS FS.
- *
- * Note that this may be called from vfat_read_super
- * with some fields already initialized.
  */
-struct super_block *
-fat_read_super(struct super_block *sb, void *data, int silent,
-               struct inode_operations *fs_dir_inode_ops)
+int fat_fill_super(struct super_block *sb, void *data, int silent,
+                  struct inode_operations *fs_dir_inode_ops, int isvfat)
 {
        struct inode *root_inode;
        struct buffer_head *bh;
        struct fat_boot_sector *b;
-       struct msdos_sb_info *sbi = MSDOS_SB(sb);
+       struct msdos_sb_info *sbi;
        int logical_sector_size, fat_clusters, debug, cp;
        unsigned int total_sectors, rootdir_sectors;
        long error = -EIO;
@@ -602,12 +602,19 @@ fat_read_super(struct super_block *sb, void *data, int silent,
        char cvf_format[21];
        char cvf_options[101];
 
+       sbi = kmalloc(sizeof(struct msdos_sb_info), GFP_KERNEL);
+       if (!sbi)
+               return -ENOMEM;
+       sb->u.generic_sbp = sbi;
+       memset(sbi, 0, sizeof(struct msdos_sb_info));
+
        cvf_format[0] = '\0';
        cvf_options[0] = '\0';
        sbi->private_data = NULL;
 
        sb->s_magic = MSDOS_SUPER_MAGIC;
        sb->s_op = &fat_sops;
+       sbi->options.isvfat = isvfat;
        sbi->dir_ops = fs_dir_inode_ops;
        sbi->cvf_format = &default_cvf;
 
@@ -830,10 +837,10 @@ fat_read_super(struct super_block *sb, void *data, int silent,
                sbi->cvf_format = cvf_formats[i];
                ++cvf_format_use_count[i];
        }
-       return sb;
+       return 0;
 
 out_invalid:
-       error = 0;
+       error = -EINVAL;
 
 out_fail:
        if (sbi->nls_io)
@@ -845,8 +852,10 @@ out_fail:
        if (sbi->private_data)
                kfree(sbi->private_data);
        sbi->private_data = NULL;
+       sb->u.generic_sbp = NULL;
+       kfree(sbi);
 
-       return ERR_PTR(error);
+       return error;
 }
 
 int fat_statfs(struct super_block *sb,struct statfs *buf)
index 34d1eaa3fe2b35715a4b639b064d263a8beae6d9..89194a5b18bd71bdb42b6717b38e76b7caa7aa74 100644 (file)
@@ -603,17 +603,14 @@ struct inode_operations msdos_dir_inode_operations = {
 
 int msdos_fill_super(struct super_block *sb,void *data, int silent)
 {
-       struct super_block *res;
+       int res;
 
-       MSDOS_SB(sb)->options.isvfat = 0;
-       res = fat_read_super(sb, data, silent, &msdos_dir_inode_operations);
-       if (IS_ERR(res))
-               return PTR_ERR(res);
-       if (res == NULL) {
+       res = fat_fill_super(sb, data, silent, &msdos_dir_inode_operations, 0);
+       if (res) {
                if (!silent)
                        printk(KERN_INFO "VFS: Can't find a valid"
                               " MSDOS filesystem on dev %s.\n", sb->s_id);
-               return -EINVAL;
+               return res;
        }
 
        sb->s_root->d_op = &msdos_dentry_operations;
index 905ebd902b1735c1b18f5f971a228ad4420c8bc7..6fb299d74d22cedc544acf165f43136e2abf8f1a 100644 (file)
@@ -1285,25 +1285,25 @@ struct inode_operations vfat_dir_inode_operations = {
 
 int vfat_fill_super(struct super_block *sb, void *data, int silent)
 {
-       struct super_block *res;
+       int res;
+       struct msdos_sb_info *sbi;
   
-       MSDOS_SB(sb)->options.isvfat = 1;
-       res = fat_read_super(sb, data, silent, &vfat_dir_inode_operations);
-       if (IS_ERR(res))
-               return PTR_ERR(res);
-       if (res == NULL) {
+       res = fat_fill_super(sb, data, silent, &vfat_dir_inode_operations, 1);
+       if (res) {
                if (!silent)
                        printk(KERN_INFO "VFS: Can't find a valid"
                               " VFAT filesystem on dev %s.\n", sb->s_id);
-               return -EINVAL;
+               return res;
        }
 
-       if (parse_options((char *) data, &(MSDOS_SB(sb)->options))) {
-               MSDOS_SB(sb)->options.dotsOK = 0;
-               if (MSDOS_SB(sb)->options.posixfs) {
-                       MSDOS_SB(sb)->options.name_check = 's';
+       sbi = MSDOS_SB(sb);
+
+       if (parse_options((char *) data, &(sbi->options))) {
+               sbi->options.dotsOK = 0;
+               if (sbi->options.posixfs) {
+                       sbi->options.name_check = 's';
                }
-               if (MSDOS_SB(sb)->options.name_check != 's') {
+               if (sbi->options.name_check != 's') {
                        sb->s_root->d_op = &vfat_dentry_ops[0];
                } else {
                        sb->s_root->d_op = &vfat_dentry_ops[2];
index e28fd5ee47be0ac19560c946108f26349ad96b46..41eb1e05a41f1c201692f212fe5250b68c54f5e3 100644 (file)
@@ -648,7 +648,6 @@ struct quota_mount_options
 #include <linux/ext3_fs_sb.h>
 #include <linux/hpfs_fs_sb.h>
 #include <linux/ntfs_fs_sb.h>
-#include <linux/msdos_fs_sb.h>
 #include <linux/iso_fs_sb.h>
 #include <linux/sysv_fs_sb.h>
 #include <linux/affs_fs_sb.h>
@@ -700,7 +699,6 @@ struct super_block {
                struct ext3_sb_info     ext3_sb;
                struct hpfs_sb_info     hpfs_sb;
                struct ntfs_sb_info     ntfs_sb;
-               struct msdos_sb_info    msdos_sb;
                struct isofs_sb_info    isofs_sb;
                struct sysv_sb_info     sysv_sb;
                struct affs_sb_info     affs_sb;
index 4851d846d9123845a83ebe71a93476708612202a..022e7a89d98a8ebc15b24135eb13edba258f5765 100644 (file)
@@ -5,6 +5,7 @@
  * The MS-DOS filesystem constants/structures
  */
 #include <linux/msdos_fs_i.h>
+#include <linux/msdos_fs_sb.h>
 
 #include <asm/byteorder.h>
 
 #define MSDOS_VALID_MODE (S_IFREG | S_IFDIR | S_IRWXU | S_IRWXG | S_IRWXO)
        /* valid file mode bits */
 
-#define MSDOS_SB(s) (&((s)->u.msdos_sb))
+static inline struct msdos_sb_info *MSDOS_SB(struct super_block *sb)
+{
+       return sb->u.generic_sbp;
+}
+
 static inline struct msdos_inode_info *MSDOS_I(struct inode *inode)
 {
        return list_entry(inode, struct msdos_inode_info, vfs_inode);
@@ -282,9 +287,8 @@ extern struct inode *fat_build_inode(struct super_block *sb,
 extern void fat_delete_inode(struct inode *inode);
 extern void fat_clear_inode(struct inode *inode);
 extern void fat_put_super(struct super_block *sb);
-extern struct super_block *
-fat_read_super(struct super_block *sb, void *data, int silent,
-              struct inode_operations *fs_dir_inode_ops);
+int fat_fill_super(struct super_block *sb, void *data, int silent,
+                  struct inode_operations *fs_dir_inode_ops, int isvfat);
 extern int fat_statfs(struct super_block *sb, struct statfs *buf);
 extern void fat_write_inode(struct inode *inode, int wait);
 extern int fat_notify_change(struct dentry * dentry, struct iattr * attr);