static int can_dirty(struct reiserfs_journal_cnode *cn);
 static int journal_join(struct reiserfs_transaction_handle *th,
                        struct super_block *sb);
-static void release_journal_dev(struct super_block *super,
-                              struct reiserfs_journal *journal);
+static void release_journal_dev(struct reiserfs_journal *journal);
 static void dirty_one_transaction(struct super_block *s,
                                 struct reiserfs_journal_list *jl);
 static void flush_async_commits(struct work_struct *work);
         * j_header_bh is on the journal dev, make sure
         * not to release the journal dev until we brelse j_header_bh
         */
-       release_journal_dev(sb, journal);
+       release_journal_dev(journal);
        vfree(journal);
 }
 
 
        cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb);
        reiserfs_info(sb, "checking transaction log (%pg)\n",
-                     journal->j_dev_bd);
+                     journal->j_bdev_handle->bdev);
        start = ktime_get_seconds();
 
        /*
                 * device and journal device to be the same
                 */
                d_bh =
-                   reiserfs_breada(journal->j_dev_bd, cur_dblock,
+                   reiserfs_breada(journal->j_bdev_handle->bdev, cur_dblock,
                                    sb->s_blocksize,
                                    SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
                                    SB_ONDISK_JOURNAL_SIZE(sb));
        SB_JOURNAL(sb)->j_current_jl = alloc_journal_list(sb);
 }
 
-static void release_journal_dev(struct super_block *super,
-                              struct reiserfs_journal *journal)
+static void release_journal_dev(struct reiserfs_journal *journal)
 {
-       if (journal->j_dev_bd != NULL) {
-               void *holder = NULL;
-
-               if (journal->j_dev_bd->bd_dev != super->s_dev)
-                       holder = journal;
-
-               blkdev_put(journal->j_dev_bd, holder);
-               journal->j_dev_bd = NULL;
+       if (journal->j_bdev_handle) {
+               bdev_release(journal->j_bdev_handle);
+               journal->j_bdev_handle = NULL;
        }
 }
 
 
        result = 0;
 
-       journal->j_dev_bd = NULL;
+       journal->j_bdev_handle = NULL;
        jdev = SB_ONDISK_JOURNAL_DEVICE(super) ?
            new_decode_dev(SB_ONDISK_JOURNAL_DEVICE(super)) : super->s_dev;
 
        if ((!jdev_name || !jdev_name[0])) {
                if (jdev == super->s_dev)
                        holder = NULL;
-               journal->j_dev_bd = blkdev_get_by_dev(jdev, blkdev_mode, holder,
-                                                     NULL);
-               if (IS_ERR(journal->j_dev_bd)) {
-                       result = PTR_ERR(journal->j_dev_bd);
-                       journal->j_dev_bd = NULL;
+               journal->j_bdev_handle = bdev_open_by_dev(jdev, blkdev_mode,
+                                                         holder, NULL);
+               if (IS_ERR(journal->j_bdev_handle)) {
+                       result = PTR_ERR(journal->j_bdev_handle);
+                       journal->j_bdev_handle = NULL;
                        reiserfs_warning(super, "sh-458",
                                         "cannot init journal device unknown-block(%u,%u): %i",
                                         MAJOR(jdev), MINOR(jdev), result);
                        return result;
                } else if (jdev != super->s_dev)
-                       set_blocksize(journal->j_dev_bd, super->s_blocksize);
+                       set_blocksize(journal->j_bdev_handle->bdev,
+                                     super->s_blocksize);
 
                return 0;
        }
 
-       journal->j_dev_bd = blkdev_get_by_path(jdev_name, blkdev_mode, holder,
-                                              NULL);
-       if (IS_ERR(journal->j_dev_bd)) {
-               result = PTR_ERR(journal->j_dev_bd);
-               journal->j_dev_bd = NULL;
+       journal->j_bdev_handle = bdev_open_by_path(jdev_name, blkdev_mode,
+                                                  holder, NULL);
+       if (IS_ERR(journal->j_bdev_handle)) {
+               result = PTR_ERR(journal->j_bdev_handle);
+               journal->j_bdev_handle = NULL;
                reiserfs_warning(super, "sh-457",
                                 "journal_init_dev: Cannot open '%s': %i",
                                 jdev_name, result);
                return result;
        }
 
-       set_blocksize(journal->j_dev_bd, super->s_blocksize);
+       set_blocksize(journal->j_bdev_handle->bdev, super->s_blocksize);
        reiserfs_info(super,
                      "journal_init_dev: journal device: %pg\n",
-                     journal->j_dev_bd);
+                     journal->j_bdev_handle->bdev);
        return 0;
 }
 
                                 "journal header magic %x (device %pg) does "
                                 "not match to magic found in super block %x",
                                 jh->jh_journal.jp_journal_magic,
-                                journal->j_dev_bd,
+                                journal->j_bdev_handle->bdev,
                                 sb_jp_journal_magic(rs));
                brelse(bhjh);
                goto free_and_return;
        reiserfs_info(sb, "journal params: device %pg, size %u, "
                      "journal first block %u, max trans len %u, max batch %u, "
                      "max commit age %u, max trans age %u\n",
-                     journal->j_dev_bd,
+                     journal->j_bdev_handle->bdev,
                      SB_ONDISK_JOURNAL_SIZE(sb),
                      SB_ONDISK_JOURNAL_1st_BLOCK(sb),
                      journal->j_trans_max,
 
        /* oldest journal block.  start here for traverse */
        struct reiserfs_journal_cnode *j_first;
 
-       struct block_device *j_dev_bd;
+       struct bdev_handle *j_bdev_handle;
 
        /* first block on s_dev of reserved area journal */
        int j_1st_reserved_block;
 #define journal_hash(t,sb,block) ((t)[_jhashfn((sb),(block)) & JBH_HASH_MASK])
 
 /* We need these to make journal.c code more readable */
-#define journal_find_get_block(s, block) __find_get_block(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
-#define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
-#define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_dev_bd, block, s->s_blocksize)
+#define journal_find_get_block(s, block) __find_get_block(\
+               SB_JOURNAL(s)->j_bdev_handle->bdev, block, s->s_blocksize)
+#define journal_getblk(s, block) __getblk(SB_JOURNAL(s)->j_bdev_handle->bdev,\
+               block, s->s_blocksize)
+#define journal_bread(s, block) __bread(SB_JOURNAL(s)->j_bdev_handle->bdev,\
+               block, s->s_blocksize)
 
 enum reiserfs_bh_state_bits {
        BH_JDirty = BH_PrivateStart,    /* buffer is in current transaction */