android_kernel_google_msm/drivers/block
Sergey Senozhatsky bb02e8a7b9 UPSTREAM: zram: rework reset and destroy path
(cherry-pick from commit a096cafc31862c54da0b56c8441dc14023437008)

We need to return set_capacity(disk, 0) from reset_store() back to
zram_reset_device(), a catch by Ganesh Mahendran.  Potentially, we can
race set_capacity() calls from init and reset paths.

The problem is that zram_reset_device() is also getting called from
zram_exit(), which performs operations in misleading reversed order -- we
first create_device() and then init it, while zram_exit() perform
destroy_device() first and then does zram_reset_device().  This is done to
remove sysfs group before we reset device, so we can continue with device
reset/destruction not being raced by sysfs attr write (f.e.  disksize).

Apart from that, destroy_device() releases zram->disk (but we still have
->disk pointer), so we cannot acces zram->disk in later
zram_reset_device() call, which may cause additional errors in the future.

So, this patch rework and cleanup destroy path.

1) remove several unneeded goto labels in zram_init()

2) factor out zram_init() error path and zram_exit() into
   destroy_devices() function, which takes the number of devices to
   destroy as its argument.

3) remove sysfs group in destroy_devices() first, so we can reorder
   operations -- reset device (as expected) goes before disk destroy and
   queue cleanup.  So we can always access ->disk in zram_reset_device().

4) and, finally, return set_capacity() back under ->init_lock.

Bug: 25951511

Change-Id: I35c6555b3812249ebe1f03b281055e82a15a6ae1
[akpm@linux-foundation.org: tweak comment]
Signed-off-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
Reported-by: Ganesh Mahendran <opensource.ganesh@gmail.com>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Jerome Marchand <jmarchan@redhat.com>
Cc: Nitin Gupta <ngupta@vflare.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2018-01-01 21:27:07 +03:00
..
aoe aoe: reserve enough headroom on skbs 2013-04-05 10:04:40 -07:00
drbd drbd: merge_bvec_fn: properly remap bvm->bi_bdev 2015-04-14 17:33:41 +08:00
mtip32xx
paride
xen-blkback xen-blkback: only read request operation from shared ring once 2016-10-26 23:15:39 +08:00
zram UPSTREAM: zram: rework reset and destroy path 2018-01-01 21:27:07 +03:00
amiflop.c
ataflop.c
brd.c block: fix a probe argument to blk_register_region 2013-11-29 10:50:36 -08:00
cciss.c cciss: fix info leak in cciss_ioctl32_passthru() 2013-10-13 15:42:47 -07:00
cciss.h
cciss_cmd.h
cciss_scsi.c
cciss_scsi.h
cpqarray.c cpqarray: fix info leak in ida_locked_ioctl() 2013-10-13 15:42:47 -07:00
cpqarray.h
cryptoloop.c
DAC960.c
DAC960.h
floppy.c floppy: properly handle failure on add_disk loop 2014-06-07 16:02:06 -07:00
hd.c
ida_cmd.h
ida_ioctl.h
Kconfig zram: promote zram from staging 2018-01-01 21:26:45 +03:00
loop.c loop: fix crash if blk_alloc_queue fails 2013-12-04 10:50:28 -08:00
Makefile zram: promote zram from staging 2018-01-01 21:26:45 +03:00
mg_disk.c
nbd.c nbd: fix possible memory leak 2015-06-19 11:40:28 +08:00
nvme.c NVMe: Fix uninitialized iod compiler warning 2012-12-03 11:46:36 -08:00
osdblk.c
pktcdvd.c
ps3disk.c
ps3vram.c
rbd.c rbd: do not allow remove of mounted-on image 2013-01-17 08:51:21 -08:00
rbd_types.h
smart1,2.h
sunvdc.c sunvdc: Fix off-by-one in generic_request(). 2013-02-28 06:59:02 -08:00
swim.c
swim3.c
swim_asm.S
sx8.c
ub.c
umem.c
umem.h
virtio_blk.c virtio-blk: Don't free ida when disk is in use 2014-06-11 12:04:18 -07:00
xd.c
xd.h
xen-blkfront.c xen-blkfront: check for null drvdata in blkback_changed (XenbusStateClosing) 2016-04-27 18:55:27 +08:00
xsysace.c
z2ram.c