]> git.hungrycats.org Git - linux/commitdiff
[PATCH] d_alloc_root() fixes: hpfs
authorAlexander Viro <viro@www.linux.org.uk>
Thu, 4 Mar 2004 05:23:44 +0000 (21:23 -0800)
committerLinus Torvalds <torvalds@ppc970.osdl.org>
Thu, 4 Mar 2004 05:23:44 +0000 (21:23 -0800)
 - inode leak on d_alloc_root() failure

fs/hpfs/super.c

index 166a2d4168cc7877848bee91364fb592c402de9a..df7a4880b37d8c653f8ad579373e194eaff08f05 100644 (file)
@@ -448,6 +448,7 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
        struct hpfs_super_block *superblock;
        struct hpfs_spare_block *spareblock;
        struct hpfs_sb_info *sbi;
+       struct inode *root;
 
        uid_t uid;
        gid_t gid;
@@ -613,10 +614,11 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
        brelse(bh0);
 
        hpfs_lock_iget(s, 1);
-       s->s_root = d_alloc_root(iget(s, sbi->sb_root));
+       root = iget(s, sbi->sb_root);
        hpfs_unlock_iget(s);
-       if (!s->s_root || !s->s_root->d_inode) {
-               printk("HPFS: iget failed. Why???\n");
+       s->s_root = d_alloc_root(root);
+       if (!s->s_root) {
+               iput(root);
                goto bail0;
        }
        hpfs_set_dentry_operations(s->s_root);
@@ -627,22 +629,24 @@ static int hpfs_fill_super(struct super_block *s, void *options, int silent)
 
        root_dno = hpfs_fnode_dno(s, sbi->sb_root);
        if (root_dno)
-               de = map_dirent(s->s_root->d_inode, root_dno, "\001\001", 2, NULL, &qbh);
-       if (!root_dno || !de) hpfs_error(s, "unable to find root dir");
+               de = map_dirent(root, root_dno, "\001\001", 2, NULL, &qbh);
+       if (!de)
+               hpfs_error(s, "unable to find root dir");
        else {
-               s->s_root->d_inode->i_atime.tv_sec = local_to_gmt(s, de->read_date);
-               s->s_root->d_inode->i_atime.tv_nsec = 0;
-               s->s_root->d_inode->i_mtime.tv_sec = local_to_gmt(s, de->write_date);
-               s->s_root->d_inode->i_mtime.tv_nsec = 0;
-               s->s_root->d_inode->i_ctime.tv_sec = local_to_gmt(s, de->creation_date);
-               s->s_root->d_inode->i_ctime.tv_nsec = 0;
-               hpfs_i(s->s_root->d_inode)->i_ea_size = de->ea_size;
-               hpfs_i(s->s_root->d_inode)->i_parent_dir = s->s_root->d_inode->i_ino;
-               if (s->s_root->d_inode->i_size == -1) s->s_root->d_inode->i_size = 2048;
-               if (s->s_root->d_inode->i_blocks == -1) s->s_root->d_inode->i_blocks = 5;
+               root->i_atime.tv_sec = local_to_gmt(s, de->read_date);
+               root->i_atime.tv_nsec = 0;
+               root->i_mtime.tv_sec = local_to_gmt(s, de->write_date);
+               root->i_mtime.tv_nsec = 0;
+               root->i_ctime.tv_sec = local_to_gmt(s, de->creation_date);
+               root->i_ctime.tv_nsec = 0;
+               hpfs_i(root)->i_ea_size = de->ea_size;
+               hpfs_i(root)->i_parent_dir = root->i_ino;
+               if (root->i_size == -1)
+                       root->i_size = 2048;
+               if (root->i_blocks == -1)
+                       root->i_blocks = 5;
+               hpfs_brelse4(&qbh);
        }
-       if (de) hpfs_brelse4(&qbh);
-
        return 0;
 
 bail4: brelse(bh2);