afs: Make record checking use TASK_UNINTERRUPTIBLE when appropriate
commit c4bfda16d1b40d1c5941c61b5aa336bdd2d9904a upstream.
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: d2ddc776a4
("afs: Overhaul volume and server record caching and fileserver rotation")
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9dcb1844f8
commit
c2bdc86ec8
@ -1329,7 +1329,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
|
||||
|
@ -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 @@ bool afs_select_fileserver(struct afs_fs_cursor *fc)
|
||||
/* 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;
|
||||
|
||||
|
@ -595,12 +595,9 @@ bool afs_check_server_record(struct afs_fs_cursor *fc, struct afs_server *server
|
||||
}
|
||||
|
||||
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;
|
||||
|
@ -281,7 +281,7 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key)
|
||||
/*
|
||||
* 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 @@ int afs_check_volume_status(struct afs_volume *volume, struct key *key)
|
||||
}
|
||||
|
||||
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 @@ int afs_check_volume_status(struct afs_volume *volume, struct key *key)
|
||||
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;
|
||||
|
Loading…
Reference in New Issue
Block a user