Commit 86098fa0 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Linus Torvalds

reiserfs: use open_bdev_excl

Use the proper helper to open a blockdevice by name for filesystem use,
this makes sure it's properly claimed (also added for open-by-number) and
gets rid of the struct file abuse.

Tested by mounting a reiserfs filesystem with external journal.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: Jeff Mahoney <jeffm@suse.com>
Acked-by: default avatarEdward Shishkin <edward.shishkin@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4dbf930e
...@@ -2574,11 +2574,9 @@ static int release_journal_dev(struct super_block *super, ...@@ -2574,11 +2574,9 @@ static int release_journal_dev(struct super_block *super,
result = 0; result = 0;
if (journal->j_dev_file != NULL) { if (journal->j_dev_bd != NULL) {
result = filp_close(journal->j_dev_file, NULL); if (journal->j_dev_bd->bd_dev != super->s_dev)
journal->j_dev_file = NULL; bd_release(journal->j_dev_bd);
journal->j_dev_bd = NULL;
} else if (journal->j_dev_bd != NULL) {
result = blkdev_put(journal->j_dev_bd); result = blkdev_put(journal->j_dev_bd);
journal->j_dev_bd = NULL; journal->j_dev_bd = NULL;
} }
...@@ -2603,7 +2601,6 @@ static int journal_init_dev(struct super_block *super, ...@@ -2603,7 +2601,6 @@ static int journal_init_dev(struct super_block *super,
result = 0; result = 0;
journal->j_dev_bd = NULL; journal->j_dev_bd = NULL;
journal->j_dev_file = NULL;
jdev = SB_ONDISK_JOURNAL_DEVICE(super) ? jdev = SB_ONDISK_JOURNAL_DEVICE(super) ?
new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev; new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev;
...@@ -2620,35 +2617,34 @@ static int journal_init_dev(struct super_block *super, ...@@ -2620,35 +2617,34 @@ static int journal_init_dev(struct super_block *super,
"cannot init journal device '%s': %i", "cannot init journal device '%s': %i",
__bdevname(jdev, b), result); __bdevname(jdev, b), result);
return result; return result;
} else if (jdev != super->s_dev) } else if (jdev != super->s_dev) {
result = bd_claim(journal->j_dev_bd, journal);
if (result) {
blkdev_put(journal->j_dev_bd);
return result;
}
set_blocksize(journal->j_dev_bd, super->s_blocksize); set_blocksize(journal->j_dev_bd, super->s_blocksize);
}
return 0; return 0;
} }
journal->j_dev_file = filp_open(jdev_name, 0, 0); journal->j_dev_bd = open_bdev_excl(jdev_name, 0, journal);
if (!IS_ERR(journal->j_dev_file)) { if (IS_ERR(journal->j_dev_bd)) {
struct inode *jdev_inode = journal->j_dev_file->f_mapping->host; result = PTR_ERR(journal->j_dev_bd);
if (!S_ISBLK(jdev_inode->i_mode)) { journal->j_dev_bd = NULL;
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);
journal->j_dev_file = NULL;
reiserfs_warning(super, reiserfs_warning(super,
"journal_init_dev: Cannot open '%s': %i", "journal_init_dev: Cannot open '%s': %i",
jdev_name, result); jdev_name, result);
return result;
} }
return result;
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));
return 0;
} }
/** /**
......
...@@ -177,7 +177,6 @@ struct reiserfs_journal { ...@@ -177,7 +177,6 @@ struct reiserfs_journal {
struct reiserfs_journal_cnode *j_last; /* newest journal block */ struct reiserfs_journal_cnode *j_last; /* newest journal block */
struct reiserfs_journal_cnode *j_first; /* oldest journal block. start here for traverse */ struct reiserfs_journal_cnode *j_first; /* oldest journal block. start here for traverse */
struct file *j_dev_file;
struct block_device *j_dev_bd; struct block_device *j_dev_bd;
int j_1st_reserved_block; /* first block on s_dev of reserved area journal */ int j_1st_reserved_block; /* first block on s_dev of reserved area journal */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment