lkml.org 
[lkml]   [2018]   [Jul]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.17 152/220] ubi: fastmap: Cancel work upon detach
    Date
    4.17-stable review patch.  If anyone has any objections, please let me know.

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

    From: Richard Weinberger <richard@nod.at>

    commit 6e7d80161066c99d12580d1b985cb1408bb58cf1 upstream.

    Ben Hutchings pointed out that 29b7a6fa1ec0 ("ubi: fastmap: Don't flush
    fastmap work on detach") does not really fix the problem, it just
    reduces the risk to hit the race window where fastmap work races against
    free()'ing ubi->volumes[].

    The correct approach is making sure that no more fastmap work is in
    progress before we free ubi data structures.
    So we cancel fastmap work right after the ubi background thread is
    stopped.
    By setting ubi->thread_enabled to zero we make sure that no further work
    tries to wake the thread.

    Fixes: 29b7a6fa1ec0 ("ubi: fastmap: Don't flush fastmap work on detach")
    Fixes: 74cdaf24004a ("UBI: Fastmap: Fix memory leaks while closing the WL sub-system")
    Cc: stable@vger.kernel.org
    Cc: Ben Hutchings <ben.hutchings@codethink.co.uk>
    Cc: Martin Townsend <mtownsend1973@gmail.com>

    Signed-off-by: Richard Weinberger <richard@nod.at>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/mtd/ubi/build.c | 3 +++
    drivers/mtd/ubi/wl.c | 4 +---
    2 files changed, 4 insertions(+), 3 deletions(-)

    --- a/drivers/mtd/ubi/build.c
    +++ b/drivers/mtd/ubi/build.c
    @@ -1091,6 +1091,9 @@ int ubi_detach_mtd_dev(int ubi_num, int
    if (ubi->bgt_thread)
    kthread_stop(ubi->bgt_thread);

    +#ifdef CONFIG_MTD_UBI_FASTMAP
    + cancel_work_sync(&ubi->fm_work);
    +#endif
    ubi_debugfs_exit_dev(ubi);
    uif_close(ubi);

    --- a/drivers/mtd/ubi/wl.c
    +++ b/drivers/mtd/ubi/wl.c
    @@ -1505,6 +1505,7 @@ int ubi_thread(void *u)
    }

    dbg_wl("background thread \"%s\" is killed", ubi->bgt_name);
    + ubi->thread_enabled = 0;
    return 0;
    }

    @@ -1514,9 +1515,6 @@ int ubi_thread(void *u)
    */
    static void shutdown_work(struct ubi_device *ubi)
    {
    -#ifdef CONFIG_MTD_UBI_FASTMAP
    - flush_work(&ubi->fm_work);
    -#endif
    while (!list_empty(&ubi->works)) {
    struct ubi_work *wrk;


    \
     
     \ /
      Last update: 2018-07-01 18:57    [W:5.426 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site