• Sergey Senozhatsky's avatar
    zram: fix umount-reset_store-mount race condition · ba6b17d6
    Sergey Senozhatsky authored
    Ganesh Mahendran was the first one who proposed to use bdev->bd_mutex to
    avoid ->bd_holders race condition:
    
            CPU0                            CPU1
    umount /* zram->init_done is true */
    reset_store()
    bdev->bd_holders == 0                   mount
    ...                                     zram_make_request()
    zram_reset_device()
    
    However, his solution required some considerable amount of code movement,
    which we can avoid.
    
    Apart from using bdev->bd_mutex in reset_store(), this patch also
    simplifies zram_reset_device().
    
    zram_reset_device() has a bool parameter reset_capacity which tells it
    whether disk capacity and itself disk should be reset.  There are two
    zram_reset_device() callers:
    
    -- zram_exit() passes reset_capacity=false
    -- reset_store() passes reset_capacity=true
    
    So we can move reset_capacity-sensitive work out of zram_reset_device()
    and perform it unconditionally in reset_store().  This also lets us drop
    reset_capacity parameter from zram_reset_device() and pass zram pointer
    only.
    Signed-off-by: default avatarSergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Reported-by: default avatarGanesh Mahendran <opensource.ganesh@gmail.com>
    Cc: Minchan Kim <minchan@kernel.org>
    Cc: Vlastimil Babka <vbabka@suse.cz>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ba6b17d6
zram_drv.c 27.8 KB