lkml.org 
[lkml]   [2019]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.1 18/54] afs: Fix uninitialised spinlock afs_volume::cb_break_lock
    Date
    [ Upstream commit 90fa9b64523a645a97edc0bdcf2d74759957eeee ]

    Fix the cb_break_lock spinlock in afs_volume struct by initialising it when
    the volume record is allocated.

    Also rename the lock to cb_v_break_lock to distinguish it from the lock of
    the same name in the afs_server struct.

    Without this, the following trace may be observed when a volume-break
    callback is received:

    INFO: trying to register non-static key.
    the code is fine but needs lockdep annotation.
    turning off the locking correctness validator.
    CPU: 2 PID: 50 Comm: kworker/2:1 Not tainted 5.2.0-rc1-fscache+ #3045
    Hardware name: ASUS All Series/H97-PLUS, BIOS 2306 10/09/2014
    Workqueue: afs SRXAFSCB_CallBack
    Call Trace:
    dump_stack+0x67/0x8e
    register_lock_class+0x23b/0x421
    ? check_usage_forwards+0x13c/0x13c
    __lock_acquire+0x89/0xf73
    lock_acquire+0x13b/0x166
    ? afs_break_callbacks+0x1b2/0x3dd
    _raw_write_lock+0x2c/0x36
    ? afs_break_callbacks+0x1b2/0x3dd
    afs_break_callbacks+0x1b2/0x3dd
    ? trace_event_raw_event_afs_server+0x61/0xac
    SRXAFSCB_CallBack+0x11f/0x16c
    process_one_work+0x2c5/0x4ee
    ? worker_thread+0x234/0x2ac
    worker_thread+0x1d8/0x2ac
    ? cancel_delayed_work_sync+0xf/0xf
    kthread+0x11f/0x127
    ? kthread_park+0x76/0x76
    ret_from_fork+0x24/0x30

    Fixes: 68251f0a6818 ("afs: Fix whole-volume callback handling")
    Signed-off-by: David Howells <dhowells@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/afs/callback.c | 4 ++--
    fs/afs/internal.h | 2 +-
    fs/afs/volume.c | 1 +
    3 files changed, 4 insertions(+), 3 deletions(-)

    diff --git a/fs/afs/callback.c b/fs/afs/callback.c
    index 128f2dbe256a..fee6fde79e6b 100644
    --- a/fs/afs/callback.c
    +++ b/fs/afs/callback.c
    @@ -278,9 +278,9 @@ static void afs_break_one_callback(struct afs_server *server,
    struct afs_super_info *as = AFS_FS_S(cbi->sb);
    struct afs_volume *volume = as->volume;

    - write_lock(&volume->cb_break_lock);
    + write_lock(&volume->cb_v_break_lock);
    volume->cb_v_break++;
    - write_unlock(&volume->cb_break_lock);
    + write_unlock(&volume->cb_v_break_lock);
    } else {
    data.volume = NULL;
    data.fid = *fid;
    diff --git a/fs/afs/internal.h b/fs/afs/internal.h
    index 3904ab0b9563..fd0750fb96a5 100644
    --- a/fs/afs/internal.h
    +++ b/fs/afs/internal.h
    @@ -582,7 +582,7 @@ struct afs_volume {
    unsigned int servers_seq; /* Incremented each time ->servers changes */

    unsigned cb_v_break; /* Break-everything counter. */
    - rwlock_t cb_break_lock;
    + rwlock_t cb_v_break_lock;

    afs_voltype_t type; /* type of volume */
    short error;
    diff --git a/fs/afs/volume.c b/fs/afs/volume.c
    index f6eba2def0a1..3e8dbee09f87 100644
    --- a/fs/afs/volume.c
    +++ b/fs/afs/volume.c
    @@ -47,6 +47,7 @@ static struct afs_volume *afs_alloc_volume(struct afs_fs_context *params,
    atomic_set(&volume->usage, 1);
    INIT_LIST_HEAD(&volume->proc_link);
    rwlock_init(&volume->servers_lock);
    + rwlock_init(&volume->cb_v_break_lock);
    memcpy(volume->name, vldb->name, vldb->name_len + 1);

    slist = afs_alloc_server_list(params->cell, params->key, vldb, type_mask);
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-07-18 05:05    [W:3.902 / U:0.032 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site