Messages in this thread Patch in this message | | | From | Geliang Tang <> | Subject | [PATCH] zram: move init_done check to the beginning of disksize_store | Date | Sat, 31 Oct 2015 22:50:30 +0800 |
| |
If we set disksize when disksize has been set, we will get the following error report: "write error: Cannot allocate memory". This is because disksize_store fails at zram_meta_alloc. This is not what we expect. To solve this problem, this patch moves init_done check to the beginning of disksize_store.
Signed-off-by: Geliang Tang <geliangtang@163.com> --- drivers/block/zram/zram_drv.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 81a557c..609fc2b 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -1028,6 +1028,14 @@ static ssize_t disksize_store(struct device *dev, struct zram *zram = dev_to_zram(dev); int err; + down_read(&zram->init_lock); + if (init_done(zram)) { + up_read(&zram->init_lock); + pr_info("Cannot change disksize for initialized device\n"); + return -EBUSY; + } + up_read(&zram->init_lock); + disksize = memparse(buf, NULL); if (!disksize) return -EINVAL; @@ -1046,12 +1054,6 @@ static ssize_t disksize_store(struct device *dev, } down_write(&zram->init_lock); - if (init_done(zram)) { - pr_info("Cannot change disksize for initialized device\n"); - err = -EBUSY; - goto out_destroy_comp; - } - init_waitqueue_head(&zram->io_done); atomic_set(&zram->refcount, 1); zram->meta = meta; @@ -1069,9 +1071,6 @@ static ssize_t disksize_store(struct device *dev, return len; -out_destroy_comp: - up_write(&zram->init_lock); - zcomp_destroy(comp); out_free_meta: zram_meta_free(meta, disksize); return err; -- 2.4.3
| |