[PATCH] reiserfs: journal_init fix
Edward Shishkin [Sun, 1 May 2005 15:59:09 +0000 (08:59 -0700)]
This fixes segmentation fault when specifying bad journal device via
a mount option.

Don't pass a zero pointer to bdevname() if filp_open() returns error.

Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

fs/reiserfs/journal.c

index c9ad3a7..b16d65a 100644 (file)
@@ -2306,13 +2306,16 @@ static int journal_init_dev( struct super_block *super,
        if( !IS_ERR( journal -> j_dev_file ) ) {
                struct inode *jdev_inode = journal->j_dev_file->f_mapping->host;
                if( !S_ISBLK( jdev_inode -> i_mode ) ) {
-                       reiserfs_warning  (super, "journal_init_dev: '%s' is "
-                                          "not a block device", jdev_name );
+                       reiserfs_warning(super, "journal_init_dev: '%s' is "
+                                        "not a block device", jdev_name );
                        result = -ENOTBLK;
+                       release_journal_dev( super, journal );
                } else  {
                        /* ok */
                        journal->j_dev_bd = I_BDEV(jdev_inode);
                        set_blocksize(journal->j_dev_bd, super->s_blocksize);
+                       reiserfs_info(super, "journal_init_dev: journal device: %s\n",
+                                     bdevname(journal->j_dev_bd, b));
                }
        } else {
                result = PTR_ERR( journal -> j_dev_file );
@@ -2321,11 +2324,6 @@ static int journal_init_dev( struct super_block *super,
                                  "journal_init_dev: Cannot open '%s': %i",
                                  jdev_name, result );
        }
-       if( result != 0 ) {
-               release_journal_dev( super, journal );
-       }
-       reiserfs_info(super, "journal_init_dev: journal device: %s\n",
-               bdevname(journal->j_dev_bd, b));
        return result;
 }