客戶端如何設置delegation

    上一篇文章中我們講解了服務器沒有分發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中的數據已經無效了,需要更新其中的數據。

發佈了70 篇原創文章 · 獲贊 4 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章