- NFS Client in Linux Kernel - Ses
- NFS Client in Linux Kernel - cre
- NFS Client in Linux Kernel - Rec
- NFS Client in Linux Kernel - Ope
- NFS Client in Linux Kernel - Loc
- NFS Client in Linux Kernel - Rea
- NFS Client in Linux Kernel - Mou
- NFS Client in Linux Kernel - RPC
- NFS Client in Linux Kernel - Rea
- nfs-ganesha - Lock
1. EXCHANGE_ID
在创建session之前,要先发这个operation。将client_owner4转换成64bit的clientid ,作为client_owner的shorthand。此逻辑封装在nfs4_proc_exchange_id
struct client_owner4 {
verifier4 co_verifier;//client重启后会变化
opaque co_ownerid<NFS4_OPAQUE_LIMIT>;//client重启后不会变化
};
- co_verifier从
nfs4_init_boot_verifier
中获得,重启后此值变化 - co_ownerid从
nfs4_init_uniform_client_string
中获得,重启后此值不变化
下面的内核log打印出co_ownerid
[77666.150517] NFS call exchange_id auth=UNIX, 'Linux NFSv4.1 ubuntu-xenial'
2. CREATE_SESSION
被封装在nfs4_proc_create_session
中。CREATE_SESSION是对EXCHANGE_ID的confirm,并同时获得session id。
3. SEQUENCE
在NFS4.1,每个compound RPC的第一个operation必须是SEQUENCE,其中带着seqid和session id。
以nfs41_proc_reclaim_complete
为例,其它的COMPOUND RPC类似。
- 它的rpc_call_prepare为
nfs4_reclaim_complete_prepare
,其中调用nfs41_setup_sequence。它主要工作是从session中分配slot和seqid。 - 它的编解码函数分别为
nfs4_xdr_enc_reclaim_complete
和nfs4_xdr_dec_reclaim_complete
。在编解码的时候,加入sequence的编解码,如encode_sequence
和decode_sequence
4. 获得Session
static inline struct nfs4_session *nfs4_get_session(const struct nfs_server *server)
{
return server->nfs_client->cl_session;
}
5. EOS - Exactly Once Semantics
Sever端通过session id + seq id判断是否处理过改结果,如果处理过则从cache中返回。对于Client端完全感知不到。
6. Session过期
当Session过期后,调用nfs4_schedule_state_manager
。此函数会触发nfs4_state_manager
,可以理解为一个简单的状态机,将EXCHANGE_ID、CREATE_SESSION、RECLAIM_COMPLETE等操作再做一遍。状态机运行完,session重新连接完毕。
7. Session Trunking
当Server和Client通过两个以上连接时候,使用同一个Session。代码逻辑发生在nfs41_discover_server_trunking
中
7.1 用第一个连接mount时
- 调用
nfs4_proc_exchange_id
,发送EXCHANGE_ID,Server返回client id。 - 调用
nfs41_walk_client_list
,查看是否以前有不同连接,但有相同session的Client对象。 - 因为是第一次,所以肯定没有。则发送CREATE_SESSION,建立session。
7.2用第二个连接mount时
- 调用
nfs4_proc_exchange_id
,发送EXCHANGE_ID,Server返回client id。 - 调用
nfs41_walk_client_list
,查看是否以前有不同连接,但有相同session的Client对象。 - 因为是第二次,所以有。这次不发CREATE_SESSION。
- 因为没有创建session,会触发
nfs4_reset_session
,先发送DESTROY_SESSION给Server。 - Server返回NFS4ERR_CONN_NOT_BOUND_TO_SESSION错误码。
- Client根据这个错误码,发送BIND_CONN_TO_SESSION给Server。至此,第一次连接的mount使用上一个连接的session。
(恢复session的逻辑类似这个,发送BIND_CONN_TO_SESSION,而非CREATE_SESSION)
网友评论