diff options
author | Christoph Hellwig <hch@lst.de> | 2008-04-30 03:54:46 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-30 11:29:51 -0400 |
commit | 86098fa0115358abf5159093d11ddb306ce4b0da (patch) | |
tree | 7a927fb77339a594608baf0ed2507085056bd262 | |
parent | 4dbf930ed6c1f8aa992937d0461f8f70d4004aad (diff) |
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: Christoph Hellwig <hch@lst.de>
Cc: Chris Mason <chris.mason@oracle.com>
Cc: Jeff Mahoney <jeffm@suse.com>
Acked-by: Edward Shishkin <edward.shishkin@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | fs/reiserfs/journal.c | 50 | ||||
-rw-r--r-- | include/linux/reiserfs_fs_sb.h | 1 |
2 files changed, 23 insertions, 28 deletions
diff --git a/fs/reiserfs/journal.c b/fs/reiserfs/journal.c index da86042b3e03..e396b2fa4743 100644 --- a/fs/reiserfs/journal.c +++ b/fs/reiserfs/journal.c | |||
@@ -2574,11 +2574,9 @@ static int release_journal_dev(struct super_block *super, | |||
2574 | 2574 | ||
2575 | result = 0; | 2575 | result = 0; |
2576 | 2576 | ||
2577 | if (journal->j_dev_file != NULL) { | 2577 | if (journal->j_dev_bd != NULL) { |
2578 | result = filp_close(journal->j_dev_file, NULL); | 2578 | if (journal->j_dev_bd->bd_dev != super->s_dev) |
2579 | journal->j_dev_file = NULL; | 2579 | bd_release(journal->j_dev_bd); |
2580 | journal->j_dev_bd = NULL; | ||
2581 | } else if (journal->j_dev_bd != NULL) { | ||
2582 | result = blkdev_put(journal->j_dev_bd); | 2580 | result = blkdev_put(journal->j_dev_bd); |
2583 | journal->j_dev_bd = NULL; | 2581 | journal->j_dev_bd = NULL; |
2584 | } | 2582 | } |
@@ -2603,7 +2601,6 @@ static int journal_init_dev(struct super_block *super, | |||
2603 | result = 0; | 2601 | result = 0; |
2604 | 2602 | ||
2605 | journal->j_dev_bd = NULL; | 2603 | journal->j_dev_bd = NULL; |
2606 | journal->j_dev_file = NULL; | ||
2607 | jdev = SB_ONDISK_JOURNAL_DEVICE(super) ? | 2604 | jdev = SB_ONDISK_JOURNAL_DEVICE(super) ? |
2608 | new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev; | 2605 | new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev; |
2609 | 2606 | ||
@@ -2620,35 +2617,34 @@ static int journal_init_dev(struct super_block *super, | |||
2620 | "cannot init journal device '%s': %i", | 2617 | "cannot init journal device '%s': %i", |
2621 | __bdevname(jdev, b), result); | 2618 | __bdevname(jdev, b), result); |
2622 | return result; | 2619 | return result; |
2623 | } else if (jdev != super->s_dev) | 2620 | } else if (jdev != super->s_dev) { |
2621 | result = bd_claim(journal->j_dev_bd, journal); | ||
2622 | if (result) { | ||
2623 | blkdev_put(journal->j_dev_bd); | ||
2624 | return result; | ||
2625 | } | ||
2626 | |||
2624 | set_blocksize(journal->j_dev_bd, super->s_blocksize); | 2627 | set_blocksize(journal->j_dev_bd, super->s_blocksize); |
2628 | } | ||
2629 | |||
2625 | return 0; | 2630 | return 0; |
2626 | } | 2631 | } |
2627 | 2632 | ||
2628 | journal->j_dev_file = filp_open(jdev_name, 0, 0); | 2633 | journal->j_dev_bd = open_bdev_excl(jdev_name, 0, journal); |
2629 | if (!IS_ERR(journal->j_dev_file)) { | 2634 | if (IS_ERR(journal->j_dev_bd)) { |
2630 | struct inode *jdev_inode = journal->j_dev_file->f_mapping->host; | 2635 | result = PTR_ERR(journal->j_dev_bd); |
2631 | if (!S_ISBLK(jdev_inode->i_mode)) { | 2636 | journal->j_dev_bd = NULL; |
2632 | reiserfs_warning(super, "journal_init_dev: '%s' is " | ||
2633 | "not a block device", jdev_name); | ||
2634 | result = -ENOTBLK; | ||
2635 | release_journal_dev(super, journal); | ||
2636 | } else { | ||
2637 | /* ok */ | ||
2638 | journal->j_dev_bd = I_BDEV(jdev_inode); | ||
2639 | set_blocksize(journal->j_dev_bd, super->s_blocksize); | ||
2640 | reiserfs_info(super, | ||
2641 | "journal_init_dev: journal device: %s\n", | ||
2642 | bdevname(journal->j_dev_bd, b)); | ||
2643 | } | ||
2644 | } else { | ||
2645 | result = PTR_ERR(journal->j_dev_file); | ||
2646 | journal->j_dev_file = NULL; | ||
2647 | reiserfs_warning(super, | 2637 | reiserfs_warning(super, |
2648 | "journal_init_dev: Cannot open '%s': %i", | 2638 | "journal_init_dev: Cannot open '%s': %i", |
2649 | jdev_name, result); | 2639 | jdev_name, result); |
2640 | return result; | ||
2650 | } | 2641 | } |
2651 | return result; | 2642 | |
2643 | set_blocksize(journal->j_dev_bd, super->s_blocksize); | ||
2644 | reiserfs_info(super, | ||
2645 | "journal_init_dev: journal device: %s\n", | ||
2646 | bdevname(journal->j_dev_bd, b)); | ||
2647 | return 0; | ||
2652 | } | 2648 | } |
2653 | 2649 | ||
2654 | /** | 2650 | /** |
diff --git a/include/linux/reiserfs_fs_sb.h b/include/linux/reiserfs_fs_sb.h index db5ef9b83c3f..336ee43ed7d8 100644 --- a/include/linux/reiserfs_fs_sb.h +++ b/include/linux/reiserfs_fs_sb.h | |||
@@ -177,7 +177,6 @@ struct reiserfs_journal { | |||
177 | struct reiserfs_journal_cnode *j_last; /* newest journal block */ | 177 | struct reiserfs_journal_cnode *j_last; /* newest journal block */ |
178 | struct reiserfs_journal_cnode *j_first; /* oldest journal block. start here for traverse */ | 178 | struct reiserfs_journal_cnode *j_first; /* oldest journal block. start here for traverse */ |
179 | 179 | ||
180 | struct file *j_dev_file; | ||
181 | struct block_device *j_dev_bd; | 180 | struct block_device *j_dev_bd; |
182 | int j_1st_reserved_block; /* first block on s_dev of reserved area journal */ | 181 | int j_1st_reserved_block; /* first block on s_dev of reserved area journal */ |
183 | 182 | ||