ext4: simplify some code in read_mmp_block()
authorDan Carpenter <dan.carpenter@oracle.com>
Sat, 15 Aug 2015 15:30:31 +0000 (11:30 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 15 Aug 2015 15:30:31 +0000 (11:30 -0400)
My static check complains because we have:

if (!*bh)
return -ENOMEM;
if (*bh) {

The second check is unnecessary.

I've simplified this code by moving the "if (!*bh)" checks around.  Also
Andreas Dilger says we should probably print a warning if sb_getblk()
fails.

[ Restructured the code so that we print a warning message as well if
  the mmp block doesn't check out, and to print the error code to
  disambiguate between the error cases.  - TYT ]

Reviewed-by: Andreas Dilger <adilger@dilger.ca>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
fs/ext4/mmp.c

index 8313ca3..048c52a 100644 (file)
@@ -69,6 +69,7 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh,
                          ext4_fsblk_t mmp_block)
 {
        struct mmp_struct *mmp;
+       int ret;
 
        if (*bh)
                clear_buffer_uptodate(*bh);
@@ -76,33 +77,36 @@ static int read_mmp_block(struct super_block *sb, struct buffer_head **bh,
        /* This would be sb_bread(sb, mmp_block), except we need to be sure
         * that the MD RAID device cache has been bypassed, and that the read
         * is not blocked in the elevator. */
-       if (!*bh)
+       if (!*bh) {
                *bh = sb_getblk(sb, mmp_block);
-       if (!*bh)
-               return -ENOMEM;
-       if (*bh) {
-               get_bh(*bh);
-               lock_buffer(*bh);
-               (*bh)->b_end_io = end_buffer_read_sync;
-               submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh);
-               wait_on_buffer(*bh);
-               if (!buffer_uptodate(*bh)) {
-                       brelse(*bh);
-                       *bh = NULL;
+               if (!*bh) {
+                       ret = -ENOMEM;
+                       goto warn_exit;
                }
        }
-       if (unlikely(!*bh)) {
-               ext4_warning(sb, "Error while reading MMP block %llu",
-                            mmp_block);
-               return -EIO;
+
+       get_bh(*bh);
+       lock_buffer(*bh);
+       (*bh)->b_end_io = end_buffer_read_sync;
+       submit_bh(READ_SYNC | REQ_META | REQ_PRIO, *bh);
+       wait_on_buffer(*bh);
+       if (!buffer_uptodate(*bh)) {
+               brelse(*bh);
+               *bh = NULL;
+               ret = -EIO;
+               goto warn_exit;
        }
 
        mmp = (struct mmp_struct *)((*bh)->b_data);
-       if (le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC ||
-           !ext4_mmp_csum_verify(sb, mmp))
-               return -EINVAL;
-
-       return 0;
+       if (le32_to_cpu(mmp->mmp_magic) == EXT4_MMP_MAGIC &&
+           ext4_mmp_csum_verify(sb, mmp))
+               return 0;
+       ret = -EINVAL;
+
+warn_exit:
+       ext4_warning(sb, "Error %d while reading MMP block %llu",
+                    ret, mmp_block);
+       return ret;
 }
 
 /*