static int zram_remove(struct zram *zram)
 {
        struct block_device *bdev = zram->disk->part0;
+       bool claimed;
 
        mutex_lock(&bdev->bd_disk->open_mutex);
-       if (bdev->bd_openers || zram->claim) {
+       if (bdev->bd_openers) {
                mutex_unlock(&bdev->bd_disk->open_mutex);
                return -EBUSY;
        }
 
-       zram->claim = true;
+       claimed = zram->claim;
+       if (!claimed)
+               zram->claim = true;
        mutex_unlock(&bdev->bd_disk->open_mutex);
 
        zram_debugfs_unregister(zram);
 
-       /* Make sure all the pending I/O are finished */
-       fsync_bdev(bdev);
-       zram_reset_device(zram);
+       if (claimed) {
+               /*
+                * If we were claimed by reset_store(), del_gendisk() will
+                * wait until reset_store() is done, so nothing need to do.
+                */
+               ;
+       } else {
+               /* Make sure all the pending I/O are finished */
+               fsync_bdev(bdev);
+               zram_reset_device(zram);
+       }
 
        pr_info("Removed device: %s\n", zram->disk->disk_name);
 
        del_gendisk(zram->disk);
+
+       /* del_gendisk drains pending reset_store */
+       WARN_ON_ONCE(claimed && zram->claim);
+
        blk_cleanup_disk(zram->disk);
        kfree(zram);
        return 0;
 
 static int zram_remove_cb(int id, void *ptr, void *data)
 {
-       zram_remove(ptr);
+       WARN_ON_ONCE(zram_remove(ptr));
        return 0;
 }