qnx4: clean qnx4_fill_super() up
authorAl Viro <viro@zeniv.linux.org.uk>
Wed, 11 Dec 2013 00:48:58 +0000 (19:48 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Sat, 25 Jan 2014 08:13:03 +0000 (03:13 -0500)
* pass on-disk superblock to qnx4_chkroot() explicitly
* don't leave stale (and unused) pointers in qnx4_super_block
* free stuff in ->kill_sb(); ->put_super() becomes empty and dies
* simplify failure exits

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/qnx4/inode.c
fs/qnx4/qnx4.h

index 2e8caa6..8955881 100644 (file)
@@ -27,7 +27,6 @@
 
 static const struct super_operations qnx4_sops;
 
-static void qnx4_put_super(struct super_block *sb);
 static struct inode *qnx4_alloc_inode(struct super_block *sb);
 static void qnx4_destroy_inode(struct inode *inode);
 static int qnx4_remount(struct super_block *sb, int *flags, char *data);
@@ -37,7 +36,6 @@ static const struct super_operations qnx4_sops =
 {
        .alloc_inode    = qnx4_alloc_inode,
        .destroy_inode  = qnx4_destroy_inode,
-       .put_super      = qnx4_put_super,
        .statfs         = qnx4_statfs,
        .remount_fs     = qnx4_remount,
 };
@@ -148,18 +146,19 @@ static int qnx4_statfs(struct dentry *dentry, struct kstatfs *buf)
  * it really _is_ a qnx4 filesystem, and to check the size
  * of the directory entry.
  */
-static const char *qnx4_checkroot(struct super_block *sb)
+static const char *qnx4_checkroot(struct super_block *sb,
+                                 struct qnx4_super_block *s)
 {
        struct buffer_head *bh;
        struct qnx4_inode_entry *rootdir;
        int rd, rl;
        int i, j;
 
-       if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/')
+       if (s->RootDir.di_fname[0] != '/' || s->RootDir.di_fname[1] != '\0')
                return "no qnx4 filesystem (no root dir).";
        QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id));
-       rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1;
-       rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size);
+       rd = le32_to_cpu(s->RootDir.di_first_xtnt.xtnt_blk) - 1;
+       rl = le32_to_cpu(s->RootDir.di_first_xtnt.xtnt_size);
        for (j = 0; j < rl; j++) {
                bh = sb_bread(sb, rd + j);      /* root dir, first block */
                if (bh == NULL)
@@ -189,7 +188,6 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
        struct inode *root;
        const char *errmsg;
        struct qnx4_sb_info *qs;
-       int ret = -EINVAL;
 
        qs = kzalloc(sizeof(struct qnx4_sb_info), GFP_KERNEL);
        if (!qs)
@@ -198,67 +196,50 @@ static int qnx4_fill_super(struct super_block *s, void *data, int silent)
 
        sb_set_blocksize(s, QNX4_BLOCK_SIZE);
 
+       s->s_op = &qnx4_sops;
+       s->s_magic = QNX4_SUPER_MAGIC;
+       s->s_flags |= MS_RDONLY;        /* Yup, read-only yet */
+
        /* Check the superblock signature. Since the qnx4 code is
           dangerous, we should leave as quickly as possible
           if we don't belong here... */
        bh = sb_bread(s, 1);
        if (!bh) {
                printk(KERN_ERR "qnx4: unable to read the superblock\n");
-               goto outnobh;
+               return -EINVAL;
        }
-       if ( le32_to_cpup((__le32*) bh->b_data) != QNX4_SUPER_MAGIC ) {
-               if (!silent)
-                       printk(KERN_ERR "qnx4: wrong fsid in superblock.\n");
-               goto out;
-       }
-       s->s_op = &qnx4_sops;
-       s->s_magic = QNX4_SUPER_MAGIC;
-       s->s_flags |= MS_RDONLY;        /* Yup, read-only yet */
-       qnx4_sb(s)->sb_buf = bh;
-       qnx4_sb(s)->sb = (struct qnx4_super_block *) bh->b_data;
-
 
        /* check before allocating dentries, inodes, .. */
-       errmsg = qnx4_checkroot(s);
+       errmsg = qnx4_checkroot(s, (struct qnx4_super_block *) bh->b_data);
+       brelse(bh);
        if (errmsg != NULL) {
                if (!silent)
                        printk(KERN_ERR "qnx4: %s\n", errmsg);
-               goto out;
+               return -EINVAL;
        }
 
        /* does root not have inode number QNX4_ROOT_INO ?? */
        root = qnx4_iget(s, QNX4_ROOT_INO * QNX4_INODES_PER_BLOCK);
        if (IS_ERR(root)) {
                printk(KERN_ERR "qnx4: get inode failed\n");
-               ret = PTR_ERR(root);
-               goto outb;
+               return PTR_ERR(root);
        }
 
-       ret = -ENOMEM;
        s->s_root = d_make_root(root);
        if (s->s_root == NULL)
-               goto outb;
+               return -ENOMEM;
 
-       brelse(bh);
        return 0;
-
-      outb:
-       kfree(qs->BitMap);
-      out:
-       brelse(bh);
-      outnobh:
-       kfree(qs);
-       s->s_fs_info = NULL;
-       return ret;
 }
 
-static void qnx4_put_super(struct super_block *sb)
+static void qnx4_kill_sb(struct super_block *sb)
 {
        struct qnx4_sb_info *qs = qnx4_sb(sb);
-       kfree( qs->BitMap );
-       kfree( qs );
-       sb->s_fs_info = NULL;
-       return;
+       kill_block_super(sb);
+       if (qs) {
+               kfree(qs->BitMap);
+               kfree(qs);
+       }
 }
 
 static int qnx4_readpage(struct file *file, struct page *page)
@@ -409,7 +390,7 @@ static struct file_system_type qnx4_fs_type = {
        .owner          = THIS_MODULE,
        .name           = "qnx4",
        .mount          = qnx4_mount,
-       .kill_sb        = kill_block_super,
+       .kill_sb        = qnx4_kill_sb,
        .fs_flags       = FS_REQUIRES_DEV,
 };
 MODULE_ALIAS_FS("qnx4");
index 34e2d32..c9b1be2 100644 (file)
@@ -10,8 +10,6 @@
 #endif
 
 struct qnx4_sb_info {
-       struct buffer_head      *sb_buf;        /* superblock buffer */
-       struct qnx4_super_block *sb;            /* our superblock */
        unsigned int            Version;        /* may be useful */
        struct qnx4_inode_entry *BitMap;        /* useful */
 };