lkml.org 
[lkml]   [2020]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.6 71/79] afs: Make record checking use TASK_UNINTERRUPTIBLE when appropriate
    Date
    From: David Howells <dhowells@redhat.com>

    [ Upstream commit c4bfda16d1b40d1c5941c61b5aa336bdd2d9904a ]

    When an operation is meant to be done uninterruptibly (such as
    FS.StoreData), we should not be allowing volume and server record checking
    to be interrupted.

    Fixes: d2ddc776a458 ("afs: Overhaul volume and server record caching and fileserver rotation")
    Signed-off-by: David Howells <dhowells@redhat.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/afs/internal.h | 2 +-
    fs/afs/rotate.c | 6 +++---
    fs/afs/server.c | 7 ++-----
    fs/afs/volume.c | 8 +++++---
    4 files changed, 11 insertions(+), 12 deletions(-)

    diff --git a/fs/afs/internal.h b/fs/afs/internal.h
    index ef732dd4e7ef5..15ae9c7f9c00a 100644
    --- a/fs/afs/internal.h
    +++ b/fs/afs/internal.h
    @@ -1335,7 +1335,7 @@ extern struct afs_volume *afs_create_volume(struct afs_fs_context *);
    extern void afs_activate_volume(struct afs_volume *);
    extern void afs_deactivate_volume(struct afs_volume *);
    extern void afs_put_volume(struct afs_cell *, struct afs_volume *);
    -extern int afs_check_volume_status(struct afs_volume *, struct key *);
    +extern int afs_check_volume_status(struct afs_volume *, struct afs_fs_cursor *);

    /*
    * write.c
    diff --git a/fs/afs/rotate.c b/fs/afs/rotate.c
    index 172ba569cd602..2a3305e42b145 100644
    --- a/fs/afs/rotate.c
    +++ b/fs/afs/rotate.c
    @@ -192,7 +192,7 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
    write_unlock(&vnode->volume->servers_lock);

    set_bit(AFS_VOLUME_NEEDS_UPDATE, &vnode->volume->flags);
    - error = afs_check_volume_status(vnode->volume, fc->key);
    + error = afs_check_volume_status(vnode->volume, fc);
    if (error < 0)
    goto failed_set_error;

    @@ -281,7 +281,7 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)

    set_bit(AFS_VOLUME_WAIT, &vnode->volume->flags);
    set_bit(AFS_VOLUME_NEEDS_UPDATE, &vnode->volume->flags);
    - error = afs_check_volume_status(vnode->volume, fc->key);
    + error = afs_check_volume_status(vnode->volume, fc);
    if (error < 0)
    goto failed_set_error;

    @@ -341,7 +341,7 @@ start:
    /* See if we need to do an update of the volume record. Note that the
    * volume may have moved or even have been deleted.
    */
    - error = afs_check_volume_status(vnode->volume, fc->key);
    + error = afs_check_volume_status(vnode->volume, fc);
    if (error < 0)
    goto failed_set_error;

    diff --git a/fs/afs/server.c b/fs/afs/server.c
    index b7f3cb2130cae..11b90ac7ea30f 100644
    --- a/fs/afs/server.c
    +++ b/fs/afs/server.c
    @@ -594,12 +594,9 @@ retry:
    }

    ret = wait_on_bit(&server->flags, AFS_SERVER_FL_UPDATING,
    - TASK_INTERRUPTIBLE);
    + (fc->flags & AFS_FS_CURSOR_INTR) ?
    + TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
    if (ret == -ERESTARTSYS) {
    - if (!(fc->flags & AFS_FS_CURSOR_INTR) && server->addresses) {
    - _leave(" = t [intr]");
    - return true;
    - }
    fc->error = ret;
    _leave(" = f [intr]");
    return false;
    diff --git a/fs/afs/volume.c b/fs/afs/volume.c
    index 92ca5e27573b7..4310336b9bb8c 100644
    --- a/fs/afs/volume.c
    +++ b/fs/afs/volume.c
    @@ -281,7 +281,7 @@ error:
    /*
    * Make sure the volume record is up to date.
    */
    -int afs_check_volume_status(struct afs_volume *volume, struct key *key)
    +int afs_check_volume_status(struct afs_volume *volume, struct afs_fs_cursor *fc)
    {
    time64_t now = ktime_get_real_seconds();
    int ret, retries = 0;
    @@ -299,7 +299,7 @@ retry:
    }

    if (!test_and_set_bit_lock(AFS_VOLUME_UPDATING, &volume->flags)) {
    - ret = afs_update_volume_status(volume, key);
    + ret = afs_update_volume_status(volume, fc->key);
    clear_bit_unlock(AFS_VOLUME_WAIT, &volume->flags);
    clear_bit_unlock(AFS_VOLUME_UPDATING, &volume->flags);
    wake_up_bit(&volume->flags, AFS_VOLUME_WAIT);
    @@ -312,7 +312,9 @@ retry:
    return 0;
    }

    - ret = wait_on_bit(&volume->flags, AFS_VOLUME_WAIT, TASK_INTERRUPTIBLE);
    + ret = wait_on_bit(&volume->flags, AFS_VOLUME_WAIT,
    + (fc->flags & AFS_FS_CURSOR_INTR) ?
    + TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
    if (ret == -ERESTARTSYS) {
    _leave(" = %d", ret);
    return ret;
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-04-30 15:52    [W:4.171 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site