Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

NFSv4: Avoid unnecessary scans of filesystems for expired delegations

The amount of looping through the list of delegations is occasionally
leading to soft lockups. If the state manager was asked to reap the
expired delegations, it should scan only those filesystems that hold
delegations that need to be reaped.

Fixes: 7f156ef0bf45 ("NFSv4: Clean up nfs_delegation_reap_expired()")
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

+8
+7
fs/nfs/delegation.c
··· 1284 1284 return; 1285 1285 clear_bit(NFS_DELEGATION_NEED_RECLAIM, &delegation->flags); 1286 1286 set_bit(NFS_DELEGATION_TEST_EXPIRED, &delegation->flags); 1287 + set_bit(NFS4SERV_DELEGATION_EXPIRED, &server->delegation_flags); 1287 1288 set_bit(NFS4CLNT_DELEGATION_EXPIRED, &server->nfs_client->cl_state); 1288 1289 } 1289 1290 ··· 1363 1362 nfs4_stateid stateid; 1364 1363 unsigned long gen = ++server->delegation_gen; 1365 1364 1365 + if (!test_and_clear_bit(NFS4SERV_DELEGATION_EXPIRED, 1366 + &server->delegation_flags)) 1367 + return 0; 1366 1368 restart: 1367 1369 rcu_read_lock(); 1368 1370 list_for_each_entry_rcu(delegation, &server->delegations, super_list) { ··· 1395 1391 goto restart; 1396 1392 } 1397 1393 nfs_inode_mark_test_expired_delegation(server,inode); 1394 + set_bit(NFS4SERV_DELEGATION_EXPIRED, &server->delegation_flags); 1395 + set_bit(NFS4CLNT_DELEGATION_EXPIRED, 1396 + &server->nfs_client->cl_state); 1398 1397 iput(inode); 1399 1398 return -EAGAIN; 1400 1399 }
+1
include/linux/nfs_fs_sb.h
··· 252 252 253 253 unsigned long delegation_flags; 254 254 #define NFS4SERV_DELEGRETURN (1) 255 + #define NFS4SERV_DELEGATION_EXPIRED (2) 255 256 unsigned long delegation_gen; 256 257 unsigned long mig_gen; 257 258 unsigned long mig_status;