ext4: fix double unlock buffer mess during fs-resize
authorDmitry Monakhov <dmonakhov@openvz.org>
Wed, 26 Sep 2012 03:19:25 +0000 (23:19 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 26 Sep 2012 03:19:25 +0000 (23:19 -0400)
bh_submit_read() is responsible for unlock bh on endio.  In addition,
we need to use bh_uptodate_or_lock() to avoid races.

Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/resize.c

index 9f821ce3980021a01c23ad8763a2b66f2a5734bf..f21fdbf5c75df946f7dcf64e1d29e87ff42061b9 100644 (file)
@@ -1181,17 +1181,12 @@ static struct buffer_head *ext4_get_bitmap(struct super_block *sb, __u64 block)
        struct buffer_head *bh = sb_getblk(sb, block);
        if (!bh)
                return NULL;
-
-       if (bitmap_uptodate(bh))
-               return bh;
-
-       lock_buffer(bh);
-       if (bh_submit_read(bh) < 0) {
-               unlock_buffer(bh);
-               brelse(bh);
-               return NULL;
+       if (!bh_uptodate_or_lock(bh)) {
+               if (bh_submit_read(bh) < 0) {
+                       brelse(bh);
+                       return NULL;
+               }
        }
-       unlock_buffer(bh);
 
        return bh;
 }