lkml.org 
[lkml]   [2014]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.15 16/37] zram: avoid lockdep splat by revalidate_disk
    Date
    3.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Minchan Kim <minchan@kernel.org>

    commit b4c5c60920e3b0c4598f43e7317559f6aec51531 upstream.

    Sasha reported lockdep warning [1] introduced by [2].

    It could be fixed by doing disk revalidation out of the init_lock. It's
    okay because disk capacity change is protected by init_lock so that
    revalidate_disk always sees up-to-date value so there is no race.

    [1] https://lkml.org/lkml/2014/7/3/735
    [2] zram: revalidate disk after capacity change

    Fixes 2e32baea46ce ("zram: revalidate disk after capacity change").

    Signed-off-by: Minchan Kim <minchan@kernel.org>
    Reported-by: Sasha Levin <sasha.levin@oracle.com>
    Cc: "Alexander E. Patrakov" <patrakov@gmail.com>
    Cc: Nitin Gupta <ngupta@vflare.org>
    Cc: Jerome Marchand <jmarchan@redhat.com>
    Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
    Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/block/zram/zram_drv.c | 22 ++++++++++++++++++----
    1 file changed, 18 insertions(+), 4 deletions(-)

    --- a/drivers/block/zram/zram_drv.c
    +++ b/drivers/block/zram/zram_drv.c
    @@ -622,11 +622,18 @@ static void zram_reset_device(struct zra
    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 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:



    \
     
     \ /
      Last update: 2014-07-30 05:21    [W:4.924 / U:0.444 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site