cephfs linux kernel client針對export的操做

const struct export_operations ceph_export_ops = {node

        .encode_fh = ceph_encode_fh,數據結構

        .fh_to_dentry = ceph_fh_to_dentry,函數

        .fh_to_parent = ceph_fh_to_parent,code

        .get_parent = ceph_get_parent,對象

        .get_name = ceph_get_name,get

};同步

 

ceph_encode_fh(struct inode *inode, u32 *rawfh, int *max_len, struct inode *parent_inode)it

|__調用ceph_snap(inode)函數檢查inode是否包含snap信息,若包含snap則直接返回io

|__輸入參數校驗集羣

    |__若parent_inode不爲空且max_len小於sizeof(struct ceph_nfs_confh)/4

        |__設置max_len=sizeof(struct ceph_nfs_confh)/4

        |__直接返回

    |__若parent_inode爲空且max_len小於sizeof(struct ceph_nfs_fh)/4

        |__設置max_len=sizeof(struct ceph_nfs_fh)/4

        |__直接返回

|__若parent_inode不爲空

    |__設置struct ceph_nfs_confh的ino爲inode的ino

    |__設置struct ceph_nfs_confh的parent_ino爲parent_inode的ino

    |__設置max_len爲sizeof(struct ceph_nfs_confh)/4

    |__返回FILEID_INO32_GEN_PARENT

|__若parent_inode爲空

    |__設置struct ceph_nfs_fh的ino爲inode的ino

    |__設置max_len爲sizeof(struct ceph_nfs_fh)/4

    |__返回FILEID_INO32_GEN

 

ceph_fs_to_dentry(struct super_block *sb, struct fid *fid, int fh_len, int fh_type)

|__經過fid獲得struct ceph_nfs_fh對象

|__檢查fh_type是不是FILEID_INO32_GEN或FILEID_INO32_GEN_PARENT,若不是則直接返回

|__調用__fh_to_dentry(sb, fh->ino)函數找到fh->ino對應的dentry結構

 

__fh_to_dentry(struct super_block *sb, u64 ino)

|__經過sb獲得struct ceph_mds_client結構

|__調用ceph_find_inode()函數獲得ino指定的struct inode結構

|__若struct inode結構爲空

    |__調用ceph_mdsc_create_request(CEPH_MDS_OP_LOOKUPINO)函數建立查找指定inode的請求

    |__調用ceph_mdsc_do_reqeust()函數將請求發送給mds集羣獲得指定inode number對應的inode結構

|__調用d_obtain_alias(inode)函數獲得inode對應的dentry信息

|__調用ceph_init_dentry()函數來初始化dentry數據結構

 

ceph_fh_to_parent(struct super_block *sb, struct fid *fid, int fh_len, int fh_type)

|__經過sb獲得struct ceph_mds_client結構

|__調用__get_parent()函數獲取cfh->ino對應的parent的dentry結構

|__若獲取parent的dentry結構失敗

    |__調用__fh_to_dentry(sb, cfh->parent_ino)函數獲取parent_ino對應的dentry結構

 

__get_parent(struct super_block *sb, struct dentry *child, u64 ino)

|__經過sb獲得struct ceph_mds_client結構

|__調用ceph_mdsc_create_request(CEPH_MDS_OP_LOOKUPPARENT)函數建立查找parent inode的請求

|__調用ceph_mdsc_do_request()函數將請求發送給mds集羣

|__從請求的r_target_inode字段獲得parent inode信息

|__調用d_obtain_alias(inode)函數獲得inode對應的dentry

|__調用ceph_init_dentry(dentry)函數初始化dentry數據結構

 

ceph_get_parent(struct dentry *child)

|__調用ceph_snap()函數檢查child是否包含snap,若包含snap則直接返回

|__調用__get_parent()函數獲取child對應parent的dentry結構

 

ceph_get_name(struct dentry *parent, char *name, struct dentry *child)

|__從child獲得struct ceph_mds_client數據結構

|__調用ceph_mdsc_create_request(CEPH_MDS_OP_LOOKUPNAME)函數建立查找inode name的請求

|__調用ceph_mdsc_do_request()函數將請求同步發送給mds集羣

|__調用memcpy()函數將請求的返回信息中的dname複製到name中

相關文章
相關標籤/搜索