aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/afs/internal.h1
-rw-r--r--fs/afs/rxrpc.c6
-rw-r--r--fs/afs/server.c8
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}