Re: [systemd-devel] systemd-213: regression with zram

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



25.06.2014 06:36, Minchan Kim wrote:
Could you test this patch? It passed my test.
Thanks!

 From 4ab4931c3fa7e6527e3a849d5e4c4f727143e66c Mon Sep 17 00:00:00 2001
From: Minchan Kim <minchan@xxxxxxxxxx>
Date: Wed, 25 Jun 2014 09:20:24 +0900
Subject: [PATCH] zram: revalidate disk after capacity change

Alexander reported mkswap on /dev/zram0 is failed if other process
is opening the block device file.

Step is as follows,

0. Reset the unused zram device.
1. Use a program that opens /dev/zram0 with O_RDWR and sleeps until killed.
2. While that program sleeps, echo the correct value to /sys/block/zram0/disksize.
3. Verify (e.g. in /proc/partitions) that the disk size is applied correctly. It is.
4. While that program still sleeps, attempt to mkswap /dev/zram0. This fails:
result: mkswap: error: swap area needs to be at least 40 KiB

When I investigated, the size get by ioctl(fd, BLKGETSIZE64) on mkswap
to get a size of blockdev was zero although zram0 has right size
by 2.

The reason is zram didn't revalidate disk after changing capacity
so that size of blockdev's inode is not uptodate until all of file is close.

This patch should fix the problem.

Reported-by: Alexander E. Patrakov <patrakov@xxxxxxxxx>
Signed-off-by: Minchan Kim <minchan@xxxxxxxxxx>

Tested-by: Alexander E. Patrakov <patrakov@xxxxxxxxx>

It indeed fixes the problem.

---
  drivers/block/zram/zram_drv.c | 5 ++++-
  1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 48eccb350180..089e72cd37be 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -622,8 +622,10 @@ 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);
  }

@@ -664,6 +666,7 @@ 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);
  	return len;



--
Alexander E. Patrakov
--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux