上一篇文章中我們講解了服務器沒有分發delegation的情況下,OPEN操作結束之後客戶端的設置過程,這篇文章中我們接着講講如果服務器分發了delegation客戶端的設置過程。首先講講客戶端表示delegation的數據結構,客戶端delegation用struct nfs_delegation表示。
struct nfs_delegation {
// nfs_server表示客戶端一個NFS文件系統,可能包含了多個delegation,
// 這些delegation構成了一個鏈表,鏈表頭是nfs_server結構中的delegations.
struct list_head super_list;
// 這是用戶信息 如果用戶A執行OPEN操作時服務器分發了delegation,這裏就是用戶A的信息.
struct rpc_cred *cred;
struct inode *inode; // 這個delegation關聯的文件
// 這是delegation的stateid,表示這個delegation,這裏的值跟nfs4_state結構中stateid的值相同.
nfs4_stateid stateid;
fmode_t type; // 這是delegation的類型,FMODE_READ or FMODE_WRITE
loff_t maxsize; // 長度 如果是寫類型的delegation,需要使用這個長度。
__u64 change_attr; // 這個值跟文件索引節點中的i_version值相同.
unsigned long flags; // 這裏保存了一些標誌位
spinlock_t lock; // 保護這個數據結構的自旋鎖
struct rcu_head rcu; // rcu同步機制
};
nfs_delegation包含下面三個標誌位:
enum {
NFS_DELEGATION_NEED_RECLAIM = 0,// 這個delegation中的信息無效了,需要更新.
NFS_DELEGATION_RETURN, // 這個客戶端需要回收.
NFS_DELEGATION_REFERENCED, // 引用標誌位,這是一個有效的delegation.
};
delegation是與文件索引節點關聯的結構,每個索引節點或者沒有關聯delegation,或者只能關聯一個delegation。如果索引節點中關聯了delegation,客戶端所有的用戶都可以通過這個delegation讀寫文件中的數據(需要保證用戶的訪問權限和delegation中的訪問權限相同)。delegation中定義了三個標誌位:NFS_DELEGATION_REFERENCED表示這是一個有效的delegation,客戶端用戶可以使用這個delegation。delegation具有一定的期限,如果常時間沒有用戶使用delegation(也就幾分鐘),客戶端就認爲這個delegation已經沒有用了,會自動清除這個標誌位,這樣做的目的是減輕服務器端資源管理的壓力,防止服務器端維護一大堆沒有用的delegation。NFS_DELEGATION_RETURN明確表示這個delegation已經沒有用了,需要返還給服務器。兩種情況下會設置這個標誌位:(1)服務器發起了RECALL請求,明確要求客戶端交換這個delegation;(2)客戶端每隔一段時間會掃描系統中所有的delegation,如果沒有設置標誌位NFS_DELEGATION_REFERENCED,就設置標誌位NFS_DELEGATION_RETURN,主動交還delegation。如果delegation設置了標誌位NFS_DELEGATION_RETURN,客戶端就會發起DELEGRETURN請求將delegation交還給服務器。標誌位NFS_DELEGATION_NEED_RECLAIM表示用戶還想使用這個delegation,但是delegation中的數據已經無效了,需要更新其中的數據。