mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-26 12:26:11 +00:00
afs: Fix offline and busy message emission
The current code assumes that offline and busy volume states apply to all instances of a volume, not just the one on the server that returned VOFFLINE or VBUSY and will emit a notice to dmesg suggesting that the entire volume is unavailable. Fix that by moving the flags recording this to the afs_server_entry struct that is used to represent a particular instance of a volume on a specific server. The notice is altered to include the server UUID also. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org
This commit is contained in:
parent
495f2ae9e3
commit
28f4c58045
2 changed files with 25 additions and 14 deletions
|
@ -612,6 +612,8 @@ struct afs_server_entry {
|
||||||
time64_t cb_expires_at; /* Time at which volume-level callback expires */
|
time64_t cb_expires_at; /* Time at which volume-level callback expires */
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
#define AFS_SE_EXCLUDED 0 /* Set if server is to be excluded in rotation */
|
#define AFS_SE_EXCLUDED 0 /* Set if server is to be excluded in rotation */
|
||||||
|
#define AFS_SE_VOLUME_OFFLINE 1 /* Set if volume offline notice given */
|
||||||
|
#define AFS_SE_VOLUME_BUSY 2 /* Set if volume busy notice given */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct afs_server_list {
|
struct afs_server_list {
|
||||||
|
@ -645,10 +647,8 @@ struct afs_volume {
|
||||||
#define AFS_VOLUME_UPDATING 1 /* - T if an update is in progress */
|
#define AFS_VOLUME_UPDATING 1 /* - T if an update is in progress */
|
||||||
#define AFS_VOLUME_WAIT 2 /* - T if users must wait for update */
|
#define AFS_VOLUME_WAIT 2 /* - T if users must wait for update */
|
||||||
#define AFS_VOLUME_DELETED 3 /* - T if volume appears deleted */
|
#define AFS_VOLUME_DELETED 3 /* - T if volume appears deleted */
|
||||||
#define AFS_VOLUME_OFFLINE 4 /* - T if volume offline notice given */
|
#define AFS_VOLUME_MAYBE_NO_IBULK 4 /* - T if some servers don't have InlineBulkStatus */
|
||||||
#define AFS_VOLUME_BUSY 5 /* - T if volume busy notice given */
|
#define AFS_VOLUME_RM_TREE 5 /* - Set if volume removed from cell->volumes */
|
||||||
#define AFS_VOLUME_MAYBE_NO_IBULK 6 /* - T if some servers don't have InlineBulkStatus */
|
|
||||||
#define AFS_VOLUME_RM_TREE 7 /* - Set if volume removed from cell->volumes */
|
|
||||||
#ifdef CONFIG_AFS_FSCACHE
|
#ifdef CONFIG_AFS_FSCACHE
|
||||||
struct fscache_volume *cache; /* Caching cookie */
|
struct fscache_volume *cache; /* Caching cookie */
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -111,7 +111,7 @@ static bool afs_start_fs_iteration(struct afs_operation *op,
|
||||||
/*
|
/*
|
||||||
* Post volume busy note.
|
* Post volume busy note.
|
||||||
*/
|
*/
|
||||||
static void afs_busy(struct afs_volume *volume, u32 abort_code)
|
static void afs_busy(struct afs_operation *op, u32 abort_code)
|
||||||
{
|
{
|
||||||
const char *m;
|
const char *m;
|
||||||
|
|
||||||
|
@ -122,7 +122,8 @@ static void afs_busy(struct afs_volume *volume, u32 abort_code)
|
||||||
default: m = "busy"; break;
|
default: m = "busy"; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_notice("kAFS: Volume %llu '%s' is %s\n", volume->vid, volume->name, m);
|
pr_notice("kAFS: Volume %llu '%s' on server %pU is %s\n",
|
||||||
|
op->volume->vid, op->volume->name, &op->server->uuid, m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -181,6 +182,10 @@ bool afs_select_fileserver(struct afs_operation *op)
|
||||||
/* Evaluate the result of the previous operation, if there was one. */
|
/* Evaluate the result of the previous operation, if there was one. */
|
||||||
switch (op->call_error) {
|
switch (op->call_error) {
|
||||||
case 0:
|
case 0:
|
||||||
|
clear_bit(AFS_SE_VOLUME_OFFLINE,
|
||||||
|
&op->server_list->servers[op->server_index].flags);
|
||||||
|
clear_bit(AFS_SE_VOLUME_BUSY,
|
||||||
|
&op->server_list->servers[op->server_index].flags);
|
||||||
op->cumul_error.responded = true;
|
op->cumul_error.responded = true;
|
||||||
|
|
||||||
/* We succeeded, but we may need to redo the op from another
|
/* We succeeded, but we may need to redo the op from another
|
||||||
|
@ -314,9 +319,11 @@ bool afs_select_fileserver(struct afs_operation *op)
|
||||||
* expected to come back but it might take a long time (could be
|
* expected to come back but it might take a long time (could be
|
||||||
* days).
|
* days).
|
||||||
*/
|
*/
|
||||||
if (!test_and_set_bit(AFS_VOLUME_OFFLINE, &op->volume->flags)) {
|
if (!test_and_set_bit(AFS_SE_VOLUME_OFFLINE,
|
||||||
afs_busy(op->volume, abort_code);
|
&op->server_list->servers[op->server_index].flags)) {
|
||||||
clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
|
afs_busy(op, abort_code);
|
||||||
|
clear_bit(AFS_SE_VOLUME_BUSY,
|
||||||
|
&op->server_list->servers[op->server_index].flags);
|
||||||
}
|
}
|
||||||
if (op->flags & AFS_OPERATION_NO_VSLEEP) {
|
if (op->flags & AFS_OPERATION_NO_VSLEEP) {
|
||||||
afs_op_set_error(op, -EADV);
|
afs_op_set_error(op, -EADV);
|
||||||
|
@ -343,9 +350,11 @@ bool afs_select_fileserver(struct afs_operation *op)
|
||||||
afs_op_set_error(op, -EBUSY);
|
afs_op_set_error(op, -EBUSY);
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
if (!test_and_set_bit(AFS_VOLUME_BUSY, &op->volume->flags)) {
|
if (!test_and_set_bit(AFS_SE_VOLUME_BUSY,
|
||||||
afs_busy(op->volume, abort_code);
|
&op->server_list->servers[op->server_index].flags)) {
|
||||||
clear_bit(AFS_VOLUME_OFFLINE, &op->volume->flags);
|
afs_busy(op, abort_code);
|
||||||
|
clear_bit(AFS_SE_VOLUME_OFFLINE,
|
||||||
|
&op->server_list->servers[op->server_index].flags);
|
||||||
}
|
}
|
||||||
busy:
|
busy:
|
||||||
if (op->flags & AFS_OPERATION_CUR_ONLY) {
|
if (op->flags & AFS_OPERATION_CUR_ONLY) {
|
||||||
|
@ -426,8 +435,10 @@ bool afs_select_fileserver(struct afs_operation *op)
|
||||||
default:
|
default:
|
||||||
afs_op_accumulate_error(op, error, abort_code);
|
afs_op_accumulate_error(op, error, abort_code);
|
||||||
failed_but_online:
|
failed_but_online:
|
||||||
clear_bit(AFS_VOLUME_OFFLINE, &op->volume->flags);
|
clear_bit(AFS_SE_VOLUME_OFFLINE,
|
||||||
clear_bit(AFS_VOLUME_BUSY, &op->volume->flags);
|
&op->server_list->servers[op->server_index].flags);
|
||||||
|
clear_bit(AFS_SE_VOLUME_BUSY,
|
||||||
|
&op->server_list->servers[op->server_index].flags);
|
||||||
goto failed;
|
goto failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue