md: fix some issues with alloc_disk_sb()
authorNeilBrown <neilb@suse.com>
Wed, 2 Nov 2016 03:16:49 +0000 (14:16 +1100)
committerShaohua Li <shli@fb.com>
Mon, 7 Nov 2016 23:08:21 +0000 (15:08 -0800)
1/ don't print a warning if allocation fails.
 page_alloc() does that already.
2/ always check return status for error.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Shaohua Li <shli@fb.com>
drivers/md/md.c

index 94f882af94aa66e1e04d6ab1c49dfb2ebf8a100a..88c1821901513548f2e394a13d293f0b88d44368 100644 (file)
@@ -684,11 +684,8 @@ static inline sector_t calc_dev_sboffset(struct md_rdev *rdev)
 static int alloc_disk_sb(struct md_rdev *rdev)
 {
        rdev->sb_page = alloc_page(GFP_KERNEL);
-       if (!rdev->sb_page) {
-               printk(KERN_ALERT "md: out of memory.\n");
+       if (!rdev->sb_page)
                return -ENOMEM;
-       }
-
        return 0;
 }
 
@@ -8788,15 +8785,18 @@ static int read_rdev(struct mddev *mddev, struct md_rdev *rdev)
         * variable in case we err in the future
         */
        rdev->sb_page = NULL;
-       alloc_disk_sb(rdev);
-       ClearPageUptodate(rdev->sb_page);
-       rdev->sb_loaded = 0;
-       err = super_types[mddev->major_version].load_super(rdev, NULL, mddev->minor_version);
-
+       err = alloc_disk_sb(rdev);
+       if (err == 0) {
+               ClearPageUptodate(rdev->sb_page);
+               rdev->sb_loaded = 0;
+               err = super_types[mddev->major_version].
+                       load_super(rdev, NULL, mddev->minor_version);
+       }
        if (err < 0) {
                pr_warn("%s: %d Could not reload rdev(%d) err: %d. Restoring old values\n",
                                __func__, __LINE__, rdev->desc_nr, err);
-               put_page(rdev->sb_page);
+               if (rdev->sb_page)
+                       put_page(rdev->sb_page);
                rdev->sb_page = swapout;
                rdev->sb_loaded = 1;
                return err;