diff options
-rw-r--r-- | fs/afs/internal.h | 1 | ||||
-rw-r--r-- | fs/afs/rxrpc.c | 6 | ||||
-rw-r--r-- | fs/afs/server.c | 8 |
3 files changed, 11 insertions, 4 deletions
diff --git a/fs/afs/internal.h b/fs/afs/internal.h index 468be1e0dffb..8de04b29bec1 100644 --- a/fs/afs/internal.h +++ b/fs/afs/internal.h | |||
@@ -396,6 +396,7 @@ struct afs_server { | |||
396 | #define AFS_SERVER_FL_PROBED 5 /* The fileserver has been probed */ | 396 | #define AFS_SERVER_FL_PROBED 5 /* The fileserver has been probed */ |
397 | #define AFS_SERVER_FL_PROBING 6 /* Fileserver is being probed */ | 397 | #define AFS_SERVER_FL_PROBING 6 /* Fileserver is being probed */ |
398 | #define AFS_SERVER_FL_NO_IBULK 7 /* Fileserver doesn't support FS.InlineBulkStatus */ | 398 | #define AFS_SERVER_FL_NO_IBULK 7 /* Fileserver doesn't support FS.InlineBulkStatus */ |
399 | #define AFS_SERVER_FL_MAY_HAVE_CB 8 /* May have callbacks on this fileserver */ | ||
399 | atomic_t usage; | 400 | atomic_t usage; |
400 | u32 addr_version; /* Address list version */ | 401 | u32 addr_version; /* Address list version */ |
401 | 402 | ||
diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c index 5c6263972ec9..1f6235a6e9ae 100644 --- a/fs/afs/rxrpc.c +++ b/fs/afs/rxrpc.c | |||
@@ -482,8 +482,12 @@ static void afs_deliver_to_call(struct afs_call *call) | |||
482 | state = READ_ONCE(call->state); | 482 | state = READ_ONCE(call->state); |
483 | switch (ret) { | 483 | switch (ret) { |
484 | case 0: | 484 | case 0: |
485 | if (state == AFS_CALL_CL_PROC_REPLY) | 485 | if (state == AFS_CALL_CL_PROC_REPLY) { |
486 | if (call->cbi) | ||
487 | set_bit(AFS_SERVER_FL_MAY_HAVE_CB, | ||
488 | &call->cbi->server->flags); | ||
486 | goto call_complete; | 489 | goto call_complete; |
490 | } | ||
487 | ASSERTCMP(state, >, AFS_CALL_CL_PROC_REPLY); | 491 | ASSERTCMP(state, >, AFS_CALL_CL_PROC_REPLY); |
488 | goto done; | 492 | goto done; |
489 | case -EINPROGRESS: | 493 | case -EINPROGRESS: |
diff --git a/fs/afs/server.c b/fs/afs/server.c index 629c74986cff..2c5cff60e34d 100644 --- a/fs/afs/server.c +++ b/fs/afs/server.c | |||
@@ -395,14 +395,16 @@ static void afs_destroy_server(struct afs_net *net, struct afs_server *server) | |||
395 | struct afs_addr_list *alist = rcu_access_pointer(server->addresses); | 395 | struct afs_addr_list *alist = rcu_access_pointer(server->addresses); |
396 | struct afs_addr_cursor ac = { | 396 | struct afs_addr_cursor ac = { |
397 | .alist = alist, | 397 | .alist = alist, |
398 | .addr = &alist->addrs[0], | ||
399 | .start = alist->index, | 398 | .start = alist->index, |
400 | .index = alist->index, | 399 | .index = 0, |
400 | .addr = &alist->addrs[alist->index], | ||
401 | .error = 0, | 401 | .error = 0, |
402 | }; | 402 | }; |
403 | _enter("%p", server); | 403 | _enter("%p", server); |
404 | 404 | ||
405 | afs_fs_give_up_all_callbacks(net, server, &ac, NULL); | 405 | if (test_bit(AFS_SERVER_FL_MAY_HAVE_CB, &server->flags)) |
406 | afs_fs_give_up_all_callbacks(net, server, &ac, NULL); | ||
407 | |||
406 | call_rcu(&server->rcu, afs_server_rcu); | 408 | call_rcu(&server->rcu, afs_server_rcu); |
407 | afs_dec_servers_outstanding(net); | 409 | afs_dec_servers_outstanding(net); |
408 | } | 410 | } |