]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
Merge tag 'md/4.6-rc2-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md
authorLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Apr 2016 18:23:27 +0000 (11:23 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sat, 9 Apr 2016 18:23:27 +0000 (11:23 -0700)
Pull MD fixes from Shaohua Li:
 "This update mainly fixes bugs:

   - fix error handling (Guoqing)
   - fix a crash when a disk is hotremoved (me)
   - fix a dead loop (Wei Fang)"

* tag 'md/4.6-rc2-fix' of git://git.kernel.org/pub/scm/linux/kernel/git/shli/md:
  md/bitmap: clear bitmap if bitmap_create failed
  MD: add rdev reference for super write
  md: fix a trivial typo in comments
  md:raid1: fix a dead loop when read from a WriteMostly disk

1  2 
drivers/md/bitmap.c

diff --combined drivers/md/bitmap.c
index bef71751aade88d7277f2ae4573c921f17446304,2a0362fc21077b7b81847f35e205ba44b7326962..3fe86b54d50be37e88f83504cff5de90820b5fb7
@@@ -322,7 -322,7 +322,7 @@@ __clear_page_buffers(struct page *page
  {
        ClearPagePrivate(page);
        set_page_private(page, 0);
 -      page_cache_release(page);
 +      put_page(page);
  }
  static void free_buffers(struct page *page)
  {
@@@ -1673,6 -1673,9 +1673,9 @@@ static void bitmap_free(struct bitmap *
        if (!bitmap) /* there was no bitmap */
                return;
  
+       if (bitmap->sysfs_can_clear)
+               sysfs_put(bitmap->sysfs_can_clear);
        if (mddev_is_clustered(bitmap->mddev) && bitmap->mddev->cluster_info &&
                bitmap->cluster_slot == md_cluster_ops->slot_number(bitmap->mddev))
                md_cluster_stop(bitmap->mddev);
@@@ -1712,15 -1715,13 +1715,13 @@@ void bitmap_destroy(struct mddev *mddev
        if (mddev->thread)
                mddev->thread->timeout = MAX_SCHEDULE_TIMEOUT;
  
-       if (bitmap->sysfs_can_clear)
-               sysfs_put(bitmap->sysfs_can_clear);
        bitmap_free(bitmap);
  }
  
  /*
   * initialize the bitmap structure
   * if this returns an error, bitmap_destroy must be called to do clean up
+  * once mddev->bitmap is set
   */
  struct bitmap *bitmap_create(struct mddev *mddev, int slot)
  {
@@@ -1865,8 -1866,10 +1866,10 @@@ int bitmap_copy_from_slot(struct mddev 
        struct bitmap_counts *counts;
        struct bitmap *bitmap = bitmap_create(mddev, slot);
  
-       if (IS_ERR(bitmap))
+       if (IS_ERR(bitmap)) {
+               bitmap_free(bitmap);
                return PTR_ERR(bitmap);
+       }
  
        rv = bitmap_init_from_disk(bitmap, 0);
        if (rv)
@@@ -2170,14 -2173,14 +2173,14 @@@ location_store(struct mddev *mddev, con
                                else {
                                        mddev->bitmap = bitmap;
                                        rv = bitmap_load(mddev);
-                                       if (rv) {
-                                               bitmap_destroy(mddev);
+                                       if (rv)
                                                mddev->bitmap_info.offset = 0;
-                                       }
                                }
                                mddev->pers->quiesce(mddev, 0);
-                               if (rv)
+                               if (rv) {
+                                       bitmap_destroy(mddev);
                                        return rv;
+                               }
                        }
                }
        }