cephfs kernel client針對dir的file_operations操做

cephfs kernel client針對dir的file_operations操做node

const struct file_operations ceph_dir_fops = {數組

        .read = ceph_read_dir,數據結構

        .iterate = ceph_readdir,app

        .llseek = ceph_dir_llseek,async

        .open = ceph_open,函數

        .release = ceph_release,進程

        .unlocked_ioctl = ceph_ioctl,內存

        .fsync = ceph_fsync,ci

};get

 

ceph_read_dir(struct file *file, char __user *buf, size_t size, loff_t *ppos)    只有在mount時帶有參數-o dirstat時該函數纔有效

|__調用ceph_test_mount_opt()函數檢查mount options中是否包含DIRSTAT,若不包含則直接返回

|__若struct ceph_file_info中的dir_info爲空

    |__調用kmalloc()函數爲dir_info分配空間

    |__使用snprintf()函數向dir_info的內存空間進行格式化輸出

|__調用copy_to_user()函數將dir_info中的內容複製到用戶態空間buf中

 

ceph_readdir(struct file *file, struct dir_context *ctx)

|__調用dir_emit()函數向外發佈」.」和」..」信息

|__若mount options中包含DCACHE則說明應該儘量的從dcache中讀取dir的信息

    |__調用__dcache_readdir()函數從dcache中讀取dir

    |__返回值不等於EAGAIN

        |__直接返回

|__調用need_send_readdir()函數檢查是否應該從集羣中讀取dir的內容

    |__獲得操做碼op=CEPH_MDS_OP_LSSNAP或者CEPH_MDS_OP_READDIR

    |__調用ceph_mdsc_create_request()函數建立mds請求

    |__調用ceph_alloc_readdir_reply_buffer()函數爲從集羣中讀取到的dir內容分配內存空間

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

|__遍歷struct ceph_file_info->last_readdir->r_reply_info->dir_nr

    |__調用dir_emit()函數向外發佈dir信息

 

ceph_dir_llseek(struct file *file, loff_t offset, int whence)

|__根據whence的不一樣值更新offset的值

|__若offset>=0

    |__調用need_reset_readdir()函數檢查是否須要reset readdir

        |__調用reset_readdir()函數

    |__調整file->f_pos值爲offset值

 

ceph_open(struct inode *inode, struct file *file)    該函數在打開文件時被調用

|__調用prepare_open_request()函數來建立ceph_mds_request請求

|__調用ceph_mdsc_do_request()函數將ceph_mds_request請求同步的發送給mds進程

|__調用ceph_init_file()函數建立ceph_file_info數據結構且將該數據結構放入到file->private_data中

 

ceph_release(struct inode *inode, struct file *file)    該函數在關閉文件時被調用

|__調用ceph_put_fmode()函數減小打開文件的引用次數,若引用次數爲0,則從本地cache中刪除該文件

 

ceph_ioctl(struct file *file, unsigned int cmd, unsigned long arg)

|__根據cmd的值作不一樣的處理

    |__cmd==CEPH_IOC_GET_LAYOUT

        |__ceph_ioctl_get_layout()

            |__ceph_do_getattr(CEPH_STAT_CAP_LAYOUT)從mds集羣中讀取file對應的inode的layout信息到ceph_inode_info的i_layout中

            |__將i_layout信息寫入到struct ceph_ioctl_layout數據結構中且經過copy_to_user()函數將數據返回給用戶態

    |__cmd==CEPH_IOC_SET_LAYOUT

        |__ceph_ioctl_set_layout()

            |__調用copy_from_user()函數將新的layout信息從用戶態複製到內核態

            |__調用ceph_do_getattr()函數從mds集羣中讀取當前的layout信息

            |__調用__validate_layout()函數檢查新設置的layout是否有效

            |__調用ceph_mdsc_create_request()函數建立request請求

            |__調用ceph_mdsc_do_request()函數同步的發送request請求到mds集羣

    |__cmd==CEPH_IOC_SET_LAYOUT_POLICY

        |__ceph_ioctl_set_layout_policy()

            |__調用copy_from_user()函數將新的layout信息從用戶態複製到內核態

            |__調用__validate_layout()函數檢查新設置的layout是否有效

            |__調用ceph_mdsc_create_request()函數建立request請求

            |__調用ceph_mdsc_do_request()函數同步的發送request請求到mds集羣

    |__cmd==CEPH_IOC_GET_DATALOC                計算data所在的ceph集羣中的位置信息

        |__ceph_ioctl_get_dataloc()

            |__調用copy_from_user()函數將ceph_ioctl_dataloc信息複製到內核態

            |__調用ceph_calc_file_object_mapping()函數計算ceph_ioctl_dataloc信息中指定文件所在的oid等信息

            |__調用ceph_object_locator_to_pg()函數計算出oid所在的pg信息

            |__調用ceph_pg_to_acting_primary()函數計算出pg所在的主osd信息

            |__調用copy_to_user()函數將計算出來的信息發送回給用戶態

    |__cmd==CEPH_IOC_LAZYIO                        設置LAZYIO標識

        |__ceph_ioctl_lazyio()

            |__ 判斷struct ceph_file_info中的fmode是否未設置CEPH_FILE_MODE_LAZY

                |__設置struct ceph_file_info中的fmode擁有CEPH_FILE_MODE_LAZY標識

                |__更新ceph_inode_info中的i_nr_by_mode數組

                |__調用ceph_check_caps()函數更新caps

    |__cmd==CEPH_IOC_SYNCIO

        |__ceph_ioctl_syncio()

            |__設置struct ceph_file_info結構中的flags的CEPH_F_SYNC位

 

ceph_fsync(struct file *file, loff_t start , loff_t end, int datasync)

|__調用ceph_sync_write_wait()函數等待inode上全部未完成的osd請求執行完畢

|__調用try_flush_caps()函數將全部dirty的caps刷回到mds

|__調用unsafe_request_wait()函數等待inode上全部針對mds請求執行完畢

相關文章
相關標籤/搜索