|
@@ -622,11 +622,18 @@ static void zram_reset_device(struct zram *zram, bool reset_capacity)
|
|
|
memset(&zram->stats, 0, sizeof(zram->stats));
|
|
|
|
|
|
zram->disksize = 0;
|
|
|
- if (reset_capacity) {
|
|
|
+ if (reset_capacity)
|
|
|
set_capacity(zram->disk, 0);
|
|
|
- revalidate_disk(zram->disk);
|
|
|
- }
|
|
|
+
|
|
|
up_write(&zram->init_lock);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Revalidate disk out of the init_lock to avoid lockdep splat.
|
|
|
+ * It's okay because disk's capacity is protected by init_lock
|
|
|
+ * so that revalidate_disk always sees up-to-date capacity.
|
|
|
+ */
|
|
|
+ if (reset_capacity)
|
|
|
+ revalidate_disk(zram->disk);
|
|
|
}
|
|
|
|
|
|
static ssize_t disksize_store(struct device *dev,
|
|
@@ -666,8 +673,15 @@ static ssize_t disksize_store(struct device *dev,
|
|
|
zram->comp = comp;
|
|
|
zram->disksize = disksize;
|
|
|
set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);
|
|
|
- revalidate_disk(zram->disk);
|
|
|
up_write(&zram->init_lock);
|
|
|
+
|
|
|
+ /*
|
|
|
+ * Revalidate disk out of the init_lock to avoid lockdep splat.
|
|
|
+ * It's okay because disk's capacity is protected by init_lock
|
|
|
+ * so that revalidate_disk always sees up-to-date capacity.
|
|
|
+ */
|
|
|
+ revalidate_disk(zram->disk);
|
|
|
+
|
|
|
return len;
|
|
|
|
|
|
out_destroy_comp:
|