Lines Matching refs:clp

70 static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp);
94 static int nfs4_setup_state_renewal(struct nfs_client *clp) in nfs4_setup_state_renewal() argument
99 if (!test_bit(NFS_CS_CHECK_LEASE_TIME, &clp->cl_res_state)) { in nfs4_setup_state_renewal()
100 nfs4_schedule_state_renewal(clp); in nfs4_setup_state_renewal()
104 status = nfs4_proc_get_lease_time(clp, &fsinfo); in nfs4_setup_state_renewal()
106 nfs4_set_lease_period(clp, fsinfo.lease_time * HZ); in nfs4_setup_state_renewal()
107 nfs4_schedule_state_renewal(clp); in nfs4_setup_state_renewal()
113 int nfs4_init_clientid(struct nfs_client *clp, const struct cred *cred) in nfs4_init_clientid() argument
116 .clientid = clp->cl_clientid, in nfs4_init_clientid()
117 .confirm = clp->cl_confirm, in nfs4_init_clientid()
121 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id); in nfs4_init_clientid()
123 if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) in nfs4_init_clientid()
126 if (clp->cl_addr.ss_family == AF_INET6) in nfs4_init_clientid()
129 status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid); in nfs4_init_clientid()
132 clp->cl_clientid = clid.clientid; in nfs4_init_clientid()
133 clp->cl_confirm = clid.confirm; in nfs4_init_clientid()
134 set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs4_init_clientid()
136 status = nfs4_proc_setclientid_confirm(clp, &clid, cred); in nfs4_init_clientid()
139 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs4_init_clientid()
140 nfs4_setup_state_renewal(clp); in nfs4_init_clientid()
158 int nfs40_discover_server_trunking(struct nfs_client *clp, in nfs40_discover_server_trunking() argument
163 .clientid = clp->cl_clientid, in nfs40_discover_server_trunking()
164 .confirm = clp->cl_confirm, in nfs40_discover_server_trunking()
166 struct nfs_net *nn = net_generic(clp->cl_net, nfs_net_id); in nfs40_discover_server_trunking()
171 if (clp->cl_addr.ss_family == AF_INET6) in nfs40_discover_server_trunking()
174 status = nfs4_proc_setclientid(clp, NFS4_CALLBACK, port, cred, &clid); in nfs40_discover_server_trunking()
177 clp->cl_clientid = clid.clientid; in nfs40_discover_server_trunking()
178 clp->cl_confirm = clid.confirm; in nfs40_discover_server_trunking()
180 status = nfs40_walk_client_list(clp, result, cred); in nfs40_discover_server_trunking()
187 if (clp->cl_state) in nfs40_discover_server_trunking()
188 nfs4_schedule_state_manager(clp); in nfs40_discover_server_trunking()
194 const struct cred *nfs4_get_machine_cred(struct nfs_client *clp) in nfs4_get_machine_cred() argument
199 static void nfs4_root_machine_cred(struct nfs_client *clp) in nfs4_root_machine_cred() argument
203 clp->cl_principal = NULL; in nfs4_root_machine_cred()
204 clp->cl_rpcclient->cl_principal = NULL; in nfs4_root_machine_cred()
233 const struct cred *nfs4_get_renew_cred(struct nfs_client *clp) in nfs4_get_renew_cred() argument
239 cred = nfs4_get_machine_cred(clp); in nfs4_get_renew_cred()
243 spin_lock(&clp->cl_lock); in nfs4_get_renew_cred()
245 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { in nfs4_get_renew_cred()
251 spin_unlock(&clp->cl_lock); in nfs4_get_renew_cred()
266 static void nfs4_end_drain_session(struct nfs_client *clp) in nfs4_end_drain_session() argument
268 struct nfs4_session *ses = clp->cl_session; in nfs4_end_drain_session()
270 if (clp->cl_slot_tbl) { in nfs4_end_drain_session()
271 nfs4_end_drain_slot_table(clp->cl_slot_tbl); in nfs4_end_drain_session()
294 static int nfs4_begin_drain_session(struct nfs_client *clp) in nfs4_begin_drain_session() argument
296 struct nfs4_session *ses = clp->cl_session; in nfs4_begin_drain_session()
299 if (clp->cl_slot_tbl) in nfs4_begin_drain_session()
300 return nfs4_drain_slot_tbl(clp->cl_slot_tbl); in nfs4_begin_drain_session()
312 static void nfs41_finish_session_reset(struct nfs_client *clp) in nfs41_finish_session_reset() argument
314 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs41_finish_session_reset()
315 clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); in nfs41_finish_session_reset()
317 clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state); in nfs41_finish_session_reset()
318 nfs4_setup_state_renewal(clp); in nfs41_finish_session_reset()
321 int nfs41_init_clientid(struct nfs_client *clp, const struct cred *cred) in nfs41_init_clientid() argument
325 if (test_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state)) in nfs41_init_clientid()
327 status = nfs4_proc_exchange_id(clp, cred); in nfs41_init_clientid()
330 set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs41_init_clientid()
332 status = nfs4_proc_create_session(clp, cred); in nfs41_init_clientid()
335 if (!(clp->cl_exchange_flags & EXCHGID4_FLAG_CONFIRMED_R)) in nfs41_init_clientid()
336 nfs4_state_start_reclaim_reboot(clp); in nfs41_init_clientid()
337 nfs41_finish_session_reset(clp); in nfs41_init_clientid()
338 nfs_mark_client_ready(clp, NFS_CS_READY); in nfs41_init_clientid()
356 int nfs41_discover_server_trunking(struct nfs_client *clp, in nfs41_discover_server_trunking() argument
362 status = nfs4_proc_exchange_id(clp, cred); in nfs41_discover_server_trunking()
366 status = nfs41_walk_client_list(clp, result, cred); in nfs41_discover_server_trunking()
369 if (clp != *result) in nfs41_discover_server_trunking()
377 if (clp->cl_exchange_flags & EXCHGID4_FLAG_CONFIRMED_R) { in nfs41_discover_server_trunking()
378 if (!test_bit(NFS_CS_TSM_POSSIBLE, &clp->cl_flags)) in nfs41_discover_server_trunking()
379 set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state); in nfs41_discover_server_trunking()
381 set_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs41_discover_server_trunking()
383 nfs4_schedule_state_manager(clp); in nfs41_discover_server_trunking()
384 status = nfs_wait_client_init_complete(clp); in nfs41_discover_server_trunking()
386 nfs_put_client(clp); in nfs41_discover_server_trunking()
398 const struct cred *nfs4_get_clid_cred(struct nfs_client *clp) in nfs4_get_clid_cred() argument
402 cred = nfs4_get_machine_cred(clp); in nfs4_get_clid_cred()
546 struct nfs_client *clp = server->nfs_client; in nfs4_gc_state_owners() local
551 spin_lock(&clp->cl_lock); in nfs4_gc_state_owners()
553 time_min = (long)time_max - (long)clp->cl_lease_time; in nfs4_gc_state_owners()
561 spin_unlock(&clp->cl_lock); in nfs4_gc_state_owners()
581 struct nfs_client *clp = server->nfs_client; in nfs4_get_state_owner() local
584 spin_lock(&clp->cl_lock); in nfs4_get_state_owner()
586 spin_unlock(&clp->cl_lock); in nfs4_get_state_owner()
592 spin_lock(&clp->cl_lock); in nfs4_get_state_owner()
594 spin_unlock(&clp->cl_lock); in nfs4_get_state_owner()
617 struct nfs_client *clp = server->nfs_client; in nfs4_put_state_owner() local
619 if (!atomic_dec_and_lock(&sp->so_count, &clp->cl_lock)) in nfs4_put_state_owner()
624 spin_unlock(&clp->cl_lock); in nfs4_put_state_owner()
640 struct nfs_client *clp = server->nfs_client; in nfs4_purge_state_owners() local
643 spin_lock(&clp->cl_lock); in nfs4_purge_state_owners()
648 spin_unlock(&clp->cl_lock); in nfs4_purge_state_owners()
952 struct nfs_client *clp = server->nfs_client; in nfs4_put_lock_state() local
954 clp->cl_mvops->free_lock_state(server, lsp); in nfs4_put_lock_state()
1199 static void nfs4_clear_state_manager_bit(struct nfs_client *clp) in nfs4_clear_state_manager_bit() argument
1201 clear_and_wake_up_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state); in nfs4_clear_state_manager_bit()
1202 rpc_wake_up(&clp->cl_rpcwaitq); in nfs4_clear_state_manager_bit()
1208 void nfs4_schedule_state_manager(struct nfs_client *clp) in nfs4_schedule_state_manager() argument
1212 struct rpc_clnt *clnt = clp->cl_rpcclient; in nfs4_schedule_state_manager()
1218 set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); in nfs4_schedule_state_manager()
1222 &clp->cl_state); in nfs4_schedule_state_manager()
1224 wake_up_var(&clp->cl_state); in nfs4_schedule_state_manager()
1229 if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) in nfs4_schedule_state_manager()
1233 refcount_inc(&clp->cl_count); in nfs4_schedule_state_manager()
1240 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_ADDR)); in nfs4_schedule_state_manager()
1242 task = kthread_run(nfs4_run_state_manager, clp, "%s", buf); in nfs4_schedule_state_manager()
1246 if (!nfs_client_init_is_complete(clp)) in nfs4_schedule_state_manager()
1247 nfs_mark_client_ready(clp, PTR_ERR(task)); in nfs4_schedule_state_manager()
1249 clear_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state); in nfs4_schedule_state_manager()
1250 nfs4_clear_state_manager_bit(clp); in nfs4_schedule_state_manager()
1251 nfs_put_client(clp); in nfs4_schedule_state_manager()
1259 void nfs4_schedule_lease_recovery(struct nfs_client *clp) in nfs4_schedule_lease_recovery() argument
1261 if (!clp) in nfs4_schedule_lease_recovery()
1263 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) in nfs4_schedule_lease_recovery()
1264 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state); in nfs4_schedule_lease_recovery()
1266 clp->cl_hostname); in nfs4_schedule_lease_recovery()
1267 nfs4_schedule_state_manager(clp); in nfs4_schedule_lease_recovery()
1281 struct nfs_client *clp = server->nfs_client; in nfs4_schedule_migration_recovery() local
1285 clp->cl_hostname); in nfs4_schedule_migration_recovery()
1296 clp->cl_hostname); in nfs4_schedule_migration_recovery()
1300 set_bit(NFS4CLNT_MOVED, &clp->cl_state); in nfs4_schedule_migration_recovery()
1302 nfs4_schedule_state_manager(clp); in nfs4_schedule_migration_recovery()
1313 void nfs4_schedule_lease_moved_recovery(struct nfs_client *clp) in nfs4_schedule_lease_moved_recovery() argument
1316 __func__, clp->cl_clientid, clp->cl_hostname); in nfs4_schedule_lease_moved_recovery()
1318 set_bit(NFS4CLNT_LEASE_MOVED, &clp->cl_state); in nfs4_schedule_lease_moved_recovery()
1319 nfs4_schedule_state_manager(clp); in nfs4_schedule_lease_moved_recovery()
1323 int nfs4_wait_clnt_recover(struct nfs_client *clp) in nfs4_wait_clnt_recover() argument
1329 refcount_inc(&clp->cl_count); in nfs4_wait_clnt_recover()
1330 res = wait_on_bit_action(&clp->cl_state, NFS4CLNT_MANAGER_RUNNING, in nfs4_wait_clnt_recover()
1335 if (clp->cl_cons_state < 0) in nfs4_wait_clnt_recover()
1336 res = clp->cl_cons_state; in nfs4_wait_clnt_recover()
1338 nfs_put_client(clp); in nfs4_wait_clnt_recover()
1342 int nfs4_client_recover_expired_lease(struct nfs_client *clp) in nfs4_client_recover_expired_lease() argument
1348 ret = nfs4_wait_clnt_recover(clp); in nfs4_client_recover_expired_lease()
1351 if (!test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) && in nfs4_client_recover_expired_lease()
1352 !test_bit(NFS4CLNT_CHECK_LEASE,&clp->cl_state)) in nfs4_client_recover_expired_lease()
1354 nfs4_schedule_state_manager(clp); in nfs4_client_recover_expired_lease()
1368 static void nfs40_handle_cb_pathdown(struct nfs_client *clp) in nfs40_handle_cb_pathdown() argument
1370 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); in nfs40_handle_cb_pathdown()
1371 nfs_expire_all_delegations(clp); in nfs40_handle_cb_pathdown()
1373 clp->cl_hostname); in nfs40_handle_cb_pathdown()
1376 void nfs4_schedule_path_down_recovery(struct nfs_client *clp) in nfs4_schedule_path_down_recovery() argument
1378 nfs40_handle_cb_pathdown(clp); in nfs4_schedule_path_down_recovery()
1379 nfs4_schedule_state_manager(clp); in nfs4_schedule_path_down_recovery()
1382 static int nfs4_state_mark_reclaim_reboot(struct nfs_client *clp, struct nfs4_state *state) in nfs4_state_mark_reclaim_reboot() argument
1394 set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state); in nfs4_state_mark_reclaim_reboot()
1398 int nfs4_state_mark_reclaim_nograce(struct nfs_client *clp, struct nfs4_state *state) in nfs4_state_mark_reclaim_nograce() argument
1405 set_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state); in nfs4_state_mark_reclaim_nograce()
1411 struct nfs_client *clp = server->nfs_client; in nfs4_schedule_stateid_recovery() local
1413 if (!nfs4_state_mark_reclaim_nograce(clp, state)) in nfs4_schedule_stateid_recovery()
1418 clp->cl_hostname); in nfs4_schedule_stateid_recovery()
1419 nfs4_schedule_state_manager(clp); in nfs4_schedule_stateid_recovery()
1456 struct nfs_client *clp = NFS_SERVER(inode)->nfs_client; in nfs_inode_find_state_and_recover() local
1468 nfs4_state_mark_reclaim_nograce(clp, state)) { in nfs_inode_find_state_and_recover()
1474 nfs4_state_mark_reclaim_nograce(clp, state)) { in nfs_inode_find_state_and_recover()
1479 nfs4_state_mark_reclaim_nograce(clp, state)) in nfs_inode_find_state_and_recover()
1486 nfs4_schedule_state_manager(clp); in nfs_inode_find_state_and_recover()
1770 int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state)) in nfs4_reset_seqids() argument
1772 struct nfs_client *clp = server->nfs_client; in nfs4_reset_seqids() local
1777 spin_lock(&clp->cl_lock); in nfs4_reset_seqids()
1785 if (mark_reclaim(clp, state)) in nfs4_reset_seqids()
1790 spin_unlock(&clp->cl_lock); in nfs4_reset_seqids()
1793 static void nfs4_state_mark_reclaim_helper(struct nfs_client *clp, in nfs4_state_mark_reclaim_helper() argument
1794 int (*mark_reclaim)(struct nfs_client *clp, struct nfs4_state *state)) in nfs4_state_mark_reclaim_helper() argument
1799 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) in nfs4_state_mark_reclaim_helper()
1804 static void nfs4_state_start_reclaim_reboot(struct nfs_client *clp) in nfs4_state_start_reclaim_reboot() argument
1806 set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state); in nfs4_state_start_reclaim_reboot()
1808 nfs_delegation_mark_reclaim(clp); in nfs4_state_start_reclaim_reboot()
1809 nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_reboot); in nfs4_state_start_reclaim_reboot()
1812 static int nfs4_reclaim_complete(struct nfs_client *clp, in nfs4_reclaim_complete() argument
1818 return ops->reclaim_complete(clp, cred); in nfs4_reclaim_complete()
1824 struct nfs_client *clp = server->nfs_client; in nfs4_clear_reclaim_server() local
1829 spin_lock(&clp->cl_lock); in nfs4_clear_reclaim_server()
1839 nfs4_state_mark_reclaim_nograce(clp, state); in nfs4_clear_reclaim_server()
1843 spin_unlock(&clp->cl_lock); in nfs4_clear_reclaim_server()
1846 static int nfs4_state_clear_reclaim_reboot(struct nfs_client *clp) in nfs4_state_clear_reclaim_reboot() argument
1850 if (!test_and_clear_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) in nfs4_state_clear_reclaim_reboot()
1854 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) in nfs4_state_clear_reclaim_reboot()
1858 nfs_delegation_reap_unclaimed(clp); in nfs4_state_clear_reclaim_reboot()
1862 static void nfs4_state_end_reclaim_reboot(struct nfs_client *clp) in nfs4_state_end_reclaim_reboot() argument
1868 if (!nfs4_state_clear_reclaim_reboot(clp)) in nfs4_state_end_reclaim_reboot()
1870 ops = clp->cl_mvops->reboot_recovery_ops; in nfs4_state_end_reclaim_reboot()
1871 cred = nfs4_get_clid_cred(clp); in nfs4_state_end_reclaim_reboot()
1872 err = nfs4_reclaim_complete(clp, ops, cred); in nfs4_state_end_reclaim_reboot()
1875 set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state); in nfs4_state_end_reclaim_reboot()
1878 static void nfs4_state_start_reclaim_nograce(struct nfs_client *clp) in nfs4_state_start_reclaim_nograce() argument
1880 nfs_mark_test_expired_all_delegations(clp); in nfs4_state_start_reclaim_nograce()
1881 nfs4_state_mark_reclaim_helper(clp, nfs4_state_mark_reclaim_nograce); in nfs4_state_start_reclaim_nograce()
1884 static int nfs4_recovery_handle_error(struct nfs_client *clp, int error) in nfs4_recovery_handle_error() argument
1890 nfs40_handle_cb_pathdown(clp); in nfs4_recovery_handle_error()
1893 nfs4_state_end_reclaim_reboot(clp); in nfs4_recovery_handle_error()
1896 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); in nfs4_recovery_handle_error()
1897 nfs4_state_start_reclaim_reboot(clp); in nfs4_recovery_handle_error()
1900 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); in nfs4_recovery_handle_error()
1901 nfs4_state_start_reclaim_nograce(clp); in nfs4_recovery_handle_error()
1909 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); in nfs4_recovery_handle_error()
1913 set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state); in nfs4_recovery_handle_error()
1917 __func__, error, clp->cl_hostname); in nfs4_recovery_handle_error()
1921 clp->cl_hostname); in nfs4_recovery_handle_error()
1925 static int nfs4_do_reclaim(struct nfs_client *clp, const struct nfs4_state_recovery_ops *ops) in nfs4_do_reclaim() argument
1936 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { in nfs4_do_reclaim()
1938 spin_lock(&clp->cl_lock); in nfs4_do_reclaim()
1949 spin_unlock(&clp->cl_lock); in nfs4_do_reclaim()
1956 clp->cl_hostname, lost_locks); in nfs4_do_reclaim()
1959 status = nfs4_recovery_handle_error(clp, status); in nfs4_do_reclaim()
1966 spin_unlock(&clp->cl_lock); in nfs4_do_reclaim()
1972 clp->cl_hostname, lost_locks); in nfs4_do_reclaim()
1976 static int nfs4_check_lease(struct nfs_client *clp) in nfs4_check_lease() argument
1980 clp->cl_mvops->state_renewal_ops; in nfs4_check_lease()
1984 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) in nfs4_check_lease()
1986 cred = ops->get_state_renewal_cred(clp); in nfs4_check_lease()
1988 cred = nfs4_get_clid_cred(clp); in nfs4_check_lease()
1993 status = ops->renew_lease(clp, cred); in nfs4_check_lease()
1996 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state); in nfs4_check_lease()
2000 return nfs4_recovery_handle_error(clp, status); in nfs4_check_lease()
2006 static int nfs4_handle_reclaim_lease_error(struct nfs_client *clp, int status) in nfs4_handle_reclaim_lease_error() argument
2010 if (test_and_set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) in nfs4_handle_reclaim_lease_error()
2014 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs4_handle_reclaim_lease_error()
2017 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs4_handle_reclaim_lease_error()
2018 nfs4_state_start_reclaim_reboot(clp); in nfs4_handle_reclaim_lease_error()
2022 clp->cl_hostname); in nfs4_handle_reclaim_lease_error()
2023 nfs_mark_client_ready(clp, -EPERM); in nfs4_handle_reclaim_lease_error()
2024 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs4_handle_reclaim_lease_error()
2033 if (clp->cl_cons_state == NFS_CS_SESSION_INITING) in nfs4_handle_reclaim_lease_error()
2034 nfs_mark_client_ready(clp, -EPROTONOSUPPORT); in nfs4_handle_reclaim_lease_error()
2036 __func__, -EPROTONOSUPPORT, clp->cl_hostname); in nfs4_handle_reclaim_lease_error()
2039 if (clp->cl_cons_state == NFS_CS_SESSION_INITING) in nfs4_handle_reclaim_lease_error()
2040 nfs_mark_client_ready(clp, -EIO); in nfs4_handle_reclaim_lease_error()
2046 status, clp->cl_hostname); in nfs4_handle_reclaim_lease_error()
2049 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); in nfs4_handle_reclaim_lease_error()
2051 clp->cl_hostname); in nfs4_handle_reclaim_lease_error()
2055 static int nfs4_establish_lease(struct nfs_client *clp) in nfs4_establish_lease() argument
2059 clp->cl_mvops->reboot_recovery_ops; in nfs4_establish_lease()
2062 status = nfs4_begin_drain_session(clp); in nfs4_establish_lease()
2065 cred = nfs4_get_clid_cred(clp); in nfs4_establish_lease()
2068 status = ops->establish_clid(clp, cred); in nfs4_establish_lease()
2072 pnfs_destroy_all_layouts(clp); in nfs4_establish_lease()
2080 static int nfs4_reclaim_lease(struct nfs_client *clp) in nfs4_reclaim_lease() argument
2084 status = nfs4_establish_lease(clp); in nfs4_reclaim_lease()
2086 return nfs4_handle_reclaim_lease_error(clp, status); in nfs4_reclaim_lease()
2087 if (test_and_clear_bit(NFS4CLNT_SERVER_SCOPE_MISMATCH, &clp->cl_state)) in nfs4_reclaim_lease()
2088 nfs4_state_start_reclaim_nograce(clp); in nfs4_reclaim_lease()
2089 if (!test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) in nfs4_reclaim_lease()
2090 set_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state); in nfs4_reclaim_lease()
2091 clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state); in nfs4_reclaim_lease()
2092 clear_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); in nfs4_reclaim_lease()
2096 static int nfs4_purge_lease(struct nfs_client *clp) in nfs4_purge_lease() argument
2100 status = nfs4_establish_lease(clp); in nfs4_purge_lease()
2102 return nfs4_handle_reclaim_lease_error(clp, status); in nfs4_purge_lease()
2103 clear_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state); in nfs4_purge_lease()
2104 set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state); in nfs4_purge_lease()
2105 nfs4_state_start_reclaim_nograce(clp); in nfs4_purge_lease()
2118 struct nfs_client *clp = server->nfs_client; in nfs4_try_migration() local
2128 clp->cl_hostname); in nfs4_try_migration()
2159 status = nfs4_begin_drain_session(clp); in nfs4_try_migration()
2183 clp->cl_hostname); in nfs4_try_migration()
2192 static int nfs4_handle_migration(struct nfs_client *clp) in nfs4_handle_migration() argument
2195 clp->cl_mvops->state_renewal_ops; in nfs4_handle_migration()
2200 clp->cl_hostname); in nfs4_handle_migration()
2202 cred = ops->get_state_renewal_cred(clp); in nfs4_handle_migration()
2206 clp->cl_mig_gen++; in nfs4_handle_migration()
2209 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { in nfs4_handle_migration()
2212 if (server->mig_gen == clp->cl_mig_gen) in nfs4_handle_migration()
2214 server->mig_gen = clp->cl_mig_gen; in nfs4_handle_migration()
2238 static int nfs4_handle_lease_moved(struct nfs_client *clp) in nfs4_handle_lease_moved() argument
2241 clp->cl_mvops->state_renewal_ops; in nfs4_handle_lease_moved()
2246 clp->cl_hostname); in nfs4_handle_lease_moved()
2248 cred = ops->get_state_renewal_cred(clp); in nfs4_handle_lease_moved()
2252 clp->cl_mig_gen++; in nfs4_handle_lease_moved()
2255 list_for_each_entry_rcu(server, &clp->cl_superblocks, client_link) { in nfs4_handle_lease_moved()
2259 if (server->mig_gen == clp->cl_mig_gen) in nfs4_handle_lease_moved()
2261 server->mig_gen = clp->cl_mig_gen; in nfs4_handle_lease_moved()
2293 int nfs4_discover_server_trunking(struct nfs_client *clp, in nfs4_discover_server_trunking() argument
2297 clp->cl_mvops->reboot_recovery_ops; in nfs4_discover_server_trunking()
2302 dprintk("NFS: %s: testing '%s'\n", __func__, clp->cl_hostname); in nfs4_discover_server_trunking()
2304 clnt = clp->cl_rpcclient; in nfs4_discover_server_trunking()
2310 cred = nfs4_get_clid_cred(clp); in nfs4_discover_server_trunking()
2314 status = ops->detect_trunking(clp, result, cred); in nfs4_discover_server_trunking()
2335 nfs4_root_machine_cred(clp); in nfs4_discover_server_trunking()
2357 clnt = xchg(&clp->cl_rpcclient, clnt); in nfs4_discover_server_trunking()
2359 clnt = clp->cl_rpcclient; in nfs4_discover_server_trunking()
2386 struct nfs_client *clp = session->clp; in nfs4_schedule_session_recovery() local
2390 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); in nfs4_schedule_session_recovery()
2393 set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state); in nfs4_schedule_session_recovery()
2395 nfs4_schedule_state_manager(clp); in nfs4_schedule_session_recovery()
2399 void nfs41_notify_server(struct nfs_client *clp) in nfs41_notify_server() argument
2402 set_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state); in nfs41_notify_server()
2403 nfs4_schedule_state_manager(clp); in nfs41_notify_server()
2406 static void nfs4_reset_all_state(struct nfs_client *clp) in nfs4_reset_all_state() argument
2408 if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) { in nfs4_reset_all_state()
2409 set_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state); in nfs4_reset_all_state()
2410 clear_bit(NFS4CLNT_LEASE_CONFIRM, &clp->cl_state); in nfs4_reset_all_state()
2411 nfs4_state_start_reclaim_nograce(clp); in nfs4_reset_all_state()
2413 __func__, clp->cl_hostname); in nfs4_reset_all_state()
2414 nfs4_schedule_state_manager(clp); in nfs4_reset_all_state()
2418 static void nfs41_handle_server_reboot(struct nfs_client *clp) in nfs41_handle_server_reboot() argument
2420 if (test_and_set_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state) == 0) { in nfs41_handle_server_reboot()
2421 nfs4_state_start_reclaim_reboot(clp); in nfs41_handle_server_reboot()
2423 clp->cl_hostname); in nfs41_handle_server_reboot()
2424 nfs4_schedule_state_manager(clp); in nfs41_handle_server_reboot()
2428 static void nfs41_handle_all_state_revoked(struct nfs_client *clp) in nfs41_handle_all_state_revoked() argument
2430 nfs4_reset_all_state(clp); in nfs41_handle_all_state_revoked()
2431 dprintk("%s: state revoked on server %s\n", __func__, clp->cl_hostname); in nfs41_handle_all_state_revoked()
2434 static void nfs41_handle_some_state_revoked(struct nfs_client *clp) in nfs41_handle_some_state_revoked() argument
2436 nfs4_state_start_reclaim_nograce(clp); in nfs41_handle_some_state_revoked()
2437 nfs4_schedule_state_manager(clp); in nfs41_handle_some_state_revoked()
2439 dprintk("%s: state revoked on server %s\n", __func__, clp->cl_hostname); in nfs41_handle_some_state_revoked()
2442 static void nfs41_handle_recallable_state_revoked(struct nfs_client *clp) in nfs41_handle_recallable_state_revoked() argument
2445 pnfs_destroy_all_layouts(clp); in nfs41_handle_recallable_state_revoked()
2446 nfs_test_expired_all_delegations(clp); in nfs41_handle_recallable_state_revoked()
2448 clp->cl_hostname); in nfs41_handle_recallable_state_revoked()
2451 static void nfs41_handle_backchannel_fault(struct nfs_client *clp) in nfs41_handle_backchannel_fault() argument
2453 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); in nfs41_handle_backchannel_fault()
2454 nfs4_schedule_state_manager(clp); in nfs41_handle_backchannel_fault()
2457 clp->cl_hostname); in nfs41_handle_backchannel_fault()
2460 static void nfs41_handle_cb_path_down(struct nfs_client *clp) in nfs41_handle_cb_path_down() argument
2463 &clp->cl_state) == 0) in nfs41_handle_cb_path_down()
2464 nfs4_schedule_state_manager(clp); in nfs41_handle_cb_path_down()
2467 void nfs41_handle_sequence_flag_errors(struct nfs_client *clp, u32 flags, in nfs41_handle_sequence_flag_errors() argument
2474 __func__, clp->cl_hostname, clp->cl_clientid, flags); in nfs41_handle_sequence_flag_errors()
2485 nfs41_handle_server_reboot(clp); in nfs41_handle_sequence_flag_errors()
2487 nfs41_handle_all_state_revoked(clp); in nfs41_handle_sequence_flag_errors()
2490 nfs41_handle_some_state_revoked(clp); in nfs41_handle_sequence_flag_errors()
2492 nfs4_schedule_lease_moved_recovery(clp); in nfs41_handle_sequence_flag_errors()
2494 nfs41_handle_recallable_state_revoked(clp); in nfs41_handle_sequence_flag_errors()
2497 nfs41_handle_backchannel_fault(clp); in nfs41_handle_sequence_flag_errors()
2500 nfs41_handle_cb_path_down(clp); in nfs41_handle_sequence_flag_errors()
2503 static int nfs4_reset_session(struct nfs_client *clp) in nfs4_reset_session() argument
2508 if (!nfs4_has_session(clp)) in nfs4_reset_session()
2510 status = nfs4_begin_drain_session(clp); in nfs4_reset_session()
2513 cred = nfs4_get_clid_cred(clp); in nfs4_reset_session()
2514 status = nfs4_proc_destroy_session(clp->cl_session, cred); in nfs4_reset_session()
2522 set_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state); in nfs4_reset_session()
2527 status = nfs4_recovery_handle_error(clp, status); in nfs4_reset_session()
2531 memset(clp->cl_session->sess_id.data, 0, NFS4_MAX_SESSIONID_LEN); in nfs4_reset_session()
2532 status = nfs4_proc_create_session(clp, cred); in nfs4_reset_session()
2535 __func__, status, clp->cl_hostname); in nfs4_reset_session()
2536 status = nfs4_handle_reclaim_lease_error(clp, status); in nfs4_reset_session()
2539 nfs41_finish_session_reset(clp); in nfs4_reset_session()
2541 __func__, clp->cl_hostname); in nfs4_reset_session()
2547 static int nfs4_bind_conn_to_session(struct nfs_client *clp) in nfs4_bind_conn_to_session() argument
2552 if (!nfs4_has_session(clp)) in nfs4_bind_conn_to_session()
2554 ret = nfs4_begin_drain_session(clp); in nfs4_bind_conn_to_session()
2557 cred = nfs4_get_clid_cred(clp); in nfs4_bind_conn_to_session()
2558 ret = nfs4_proc_bind_conn_to_session(clp, cred); in nfs4_bind_conn_to_session()
2560 clear_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state); in nfs4_bind_conn_to_session()
2564 __func__, clp->cl_hostname); in nfs4_bind_conn_to_session()
2568 set_bit(NFS4CLNT_BIND_CONN_TO_SESSION, &clp->cl_state); in nfs4_bind_conn_to_session()
2571 return nfs4_recovery_handle_error(clp, ret); in nfs4_bind_conn_to_session()
2576 static void nfs4_layoutreturn_any_run(struct nfs_client *clp) in nfs4_layoutreturn_any_run() argument
2580 if (test_and_clear_bit(NFS4CLNT_RECALL_ANY_LAYOUT_READ, &clp->cl_state)) in nfs4_layoutreturn_any_run()
2582 if (test_and_clear_bit(NFS4CLNT_RECALL_ANY_LAYOUT_RW, &clp->cl_state)) in nfs4_layoutreturn_any_run()
2586 pnfs_layout_return_unused_byclid(clp, iomode); in nfs4_layoutreturn_any_run()
2587 set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); in nfs4_layoutreturn_any_run()
2591 static int nfs4_reset_session(struct nfs_client *clp) { return 0; } in nfs4_reset_session() argument
2593 static int nfs4_bind_conn_to_session(struct nfs_client *clp) in nfs4_bind_conn_to_session() argument
2598 static void nfs4_layoutreturn_any_run(struct nfs_client *clp) in nfs4_layoutreturn_any_run() argument
2603 static void nfs4_state_manager(struct nfs_client *clp) in nfs4_state_manager() argument
2618 trace_nfs4_state_mgr(clp); in nfs4_state_manager()
2619 clear_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); in nfs4_state_manager()
2620 if (test_bit(NFS4CLNT_PURGE_STATE, &clp->cl_state)) { in nfs4_state_manager()
2622 status = nfs4_purge_lease(clp); in nfs4_state_manager()
2628 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) { in nfs4_state_manager()
2631 status = nfs4_reclaim_lease(clp); in nfs4_state_manager()
2638 if (test_and_clear_bit(NFS4CLNT_SESSION_RESET, &clp->cl_state)) { in nfs4_state_manager()
2640 status = nfs4_reset_session(clp); in nfs4_state_manager()
2641 if (test_bit(NFS4CLNT_LEASE_EXPIRED, &clp->cl_state)) in nfs4_state_manager()
2649 &clp->cl_state)) { in nfs4_state_manager()
2651 status = nfs4_bind_conn_to_session(clp); in nfs4_state_manager()
2657 if (test_and_clear_bit(NFS4CLNT_CHECK_LEASE, &clp->cl_state)) { in nfs4_state_manager()
2659 status = nfs4_check_lease(clp); in nfs4_state_manager()
2665 if (test_and_clear_bit(NFS4CLNT_MOVED, &clp->cl_state)) { in nfs4_state_manager()
2667 status = nfs4_handle_migration(clp); in nfs4_state_manager()
2672 if (test_and_clear_bit(NFS4CLNT_LEASE_MOVED, &clp->cl_state)) { in nfs4_state_manager()
2674 status = nfs4_handle_lease_moved(clp); in nfs4_state_manager()
2680 if (test_bit(NFS4CLNT_RECLAIM_REBOOT, &clp->cl_state)) { in nfs4_state_manager()
2682 status = nfs4_do_reclaim(clp, in nfs4_state_manager()
2683 clp->cl_mvops->reboot_recovery_ops); in nfs4_state_manager()
2688 nfs4_state_end_reclaim_reboot(clp); in nfs4_state_manager()
2693 if (test_and_clear_bit(NFS4CLNT_DELEGATION_EXPIRED, &clp->cl_state)) { in nfs4_state_manager()
2695 nfs_reap_expired_delegations(clp); in nfs4_state_manager()
2700 if (test_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state)) { in nfs4_state_manager()
2702 status = nfs4_do_reclaim(clp, in nfs4_state_manager()
2703 clp->cl_mvops->nograce_recovery_ops); in nfs4_state_manager()
2708 clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state); in nfs4_state_manager()
2712 nfs4_end_drain_session(clp); in nfs4_state_manager()
2713 nfs4_clear_state_manager_bit(clp); in nfs4_state_manager()
2715 if (test_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state) && in nfs4_state_manager()
2717 &clp->cl_state)) { in nfs4_state_manager()
2722 if (!test_and_set_bit(NFS4CLNT_RECALL_RUNNING, &clp->cl_state)) { in nfs4_state_manager()
2723 if (test_and_clear_bit(NFS4CLNT_DELEGRETURN, &clp->cl_state)) { in nfs4_state_manager()
2724 nfs_client_return_marked_delegations(clp); in nfs4_state_manager()
2725 set_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state); in nfs4_state_manager()
2727 nfs4_layoutreturn_any_run(clp); in nfs4_state_manager()
2728 clear_bit(NFS4CLNT_RECALL_RUNNING, &clp->cl_state); in nfs4_state_manager()
2733 } while (refcount_read(&clp->cl_count) > 1 && !signalled()); in nfs4_state_manager()
2739 trace_nfs4_state_mgr_failed(clp, section, status); in nfs4_state_manager()
2742 clp->cl_hostname, -status); in nfs4_state_manager()
2746 nfs4_end_drain_session(clp); in nfs4_state_manager()
2747 nfs4_clear_state_manager_bit(clp); in nfs4_state_manager()
2752 struct nfs_client *clp = ptr; in nfs4_run_state_manager() local
2753 struct rpc_clnt *cl = clp->cl_rpcclient; in nfs4_run_state_manager()
2760 nfs4_state_manager(clp); in nfs4_run_state_manager()
2762 if (test_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state) && in nfs4_run_state_manager()
2763 !test_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state)) { in nfs4_run_state_manager()
2764 wait_var_event_interruptible(&clp->cl_state, in nfs4_run_state_manager()
2766 &clp->cl_state)); in nfs4_run_state_manager()
2768 clear_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state); in nfs4_run_state_manager()
2769 if (refcount_read(&clp->cl_count) > 1 && !signalled() && in nfs4_run_state_manager()
2770 !test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state)) in nfs4_run_state_manager()
2773 clear_bit(NFS4CLNT_MANAGER_AVAILABLE, &clp->cl_state); in nfs4_run_state_manager()
2776 if (refcount_read(&clp->cl_count) > 1 && !signalled() && in nfs4_run_state_manager()
2777 test_bit(NFS4CLNT_RUN_MANAGER, &clp->cl_state) && in nfs4_run_state_manager()
2778 !test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state)) in nfs4_run_state_manager()
2781 nfs_put_client(clp); in nfs4_run_state_manager()