cephfskernelclient針對dir的file_operations操作代碼

這篇文章給大家分享的是有關(guān)cephfs kernel client針對dir的file_operations操作代碼的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

疏附網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

cephfs kernel client針對dir的file_operations操作

const struct file_operations ceph_dir_fops = {

        .read = ceph_read_dir,

        .iterate = ceph_readdir,

        .llseek = ceph_dir_llseek,

        .open = ceph_open,

        .release = ceph_release,

        .unlocked_ioctl = ceph_ioctl,

        .fsync = ceph_fsync,

};

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

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

|__若struct ceph_file_info中的dir_info為空

    |__調(diào)用kmalloc()函數(shù)為dir_info分配空間

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

|__調(diào)用copy_to_user()函數(shù)將dir_info中的內(nèi)容復(fù)制到用戶態(tài)空間buf中

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

|__調(diào)用dir_emit()函數(shù)向外發(fā)布”.”和”..”信息

|__若mount options中包含DCACHE則說明應(yīng)該盡可能的從dcache中讀取dir的信息

    |__調(diào)用__dcache_readdir()函數(shù)從dcache中讀取dir

    |__返回值不等于EAGAIN

        |__直接返回

|__調(diào)用need_send_readdir()函數(shù)檢查是否應(yīng)該從集群中讀取dir的內(nèi)容

    |__得到操作碼op=CEPH_MDS_OP_LSSNAP或者CEPH_MDS_OP_READDIR

    |__調(diào)用ceph_mdsc_create_request()函數(shù)創(chuàng)建mds請求

    |__調(diào)用ceph_alloc_readdir_reply_buffer()函數(shù)為從集群中讀取到的dir內(nèi)容分配內(nèi)存空間

    |__調(diào)用ceph_mdsc_do_request()函數(shù)將請求同步發(fā)送給mds進程

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

    |__調(diào)用dir_emit()函數(shù)向外發(fā)布dir信息

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

|__根據(jù)whence的不同值更新offset的值

|__若offset>=0

    |__調(diào)用need_reset_readdir()函數(shù)檢查是否需要reset readdir

        |__調(diào)用reset_readdir()函數(shù)

    |__調(diào)整file->f_pos值為offset值

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

|__調(diào)用prepare_open_request()函數(shù)來創(chuàng)建ceph_mds_request請求

|__調(diào)用ceph_mdsc_do_request()函數(shù)將ceph_mds_request請求同步的發(fā)送給mds進程

|__調(diào)用ceph_init_file()函數(shù)創(chuàng)建ceph_file_info數(shù)據(jù)結(jié)構(gòu)且將該數(shù)據(jù)結(jié)構(gòu)放入到file->private_data中

ceph_release(struct inode *inode, struct file *file)    該函數(shù)在關(guān)閉文件時被調(diào)用

|__調(diào)用ceph_put_fmode()函數(shù)減少打開文件的引用次數(shù),若引用次數(shù)為0,則從本地cache中刪除該文件

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

|__根據(jù)cmd的值做不同的處理

    |__cmd==CEPH_IOC_GET_LAYOUT

        |__ceph_ioctl_get_layout()

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

            |__將i_layout信息寫入到struct ceph_ioctl_layout數(shù)據(jù)結(jié)構(gòu)中且通過copy_to_user()函數(shù)將數(shù)據(jù)返回給用戶態(tài)

    |__cmd==CEPH_IOC_SET_LAYOUT

        |__ceph_ioctl_set_layout()

            |__調(diào)用copy_from_user()函數(shù)將新的layout信息從用戶態(tài)復(fù)制到內(nèi)核態(tài)

            |__調(diào)用ceph_do_getattr()函數(shù)從mds集群中讀取當(dāng)前的layout信息

            |__調(diào)用__validate_layout()函數(shù)檢查新設(shè)置的layout是否有效

            |__調(diào)用ceph_mdsc_create_request()函數(shù)創(chuàng)建request請求

            |__調(diào)用ceph_mdsc_do_request()函數(shù)同步的發(fā)送request請求到mds集群

    |__cmd==CEPH_IOC_SET_LAYOUT_POLICY

        |__ceph_ioctl_set_layout_policy()

            |__調(diào)用copy_from_user()函數(shù)將新的layout信息從用戶態(tài)復(fù)制到內(nèi)核態(tài)

            |__調(diào)用__validate_layout()函數(shù)檢查新設(shè)置的layout是否有效

            |__調(diào)用ceph_mdsc_create_request()函數(shù)創(chuàng)建request請求

            |__調(diào)用ceph_mdsc_do_request()函數(shù)同步的發(fā)送request請求到mds集群

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

        |__ceph_ioctl_get_dataloc()

            |__調(diào)用copy_from_user()函數(shù)將ceph_ioctl_dataloc信息復(fù)制到內(nèi)核態(tài)

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

            |__調(diào)用ceph_object_locator_to_pg()函數(shù)計算出oid所在的pg信息

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

            |__調(diào)用copy_to_user()函數(shù)將計算出來的信息發(fā)送回給用戶態(tài)

    |__cmd==CEPH_IOC_LAZYIO                        設(shè)置LAZYIO標(biāo)識

        |__ceph_ioctl_lazyio()

            |__ 判斷struct ceph_file_info中的fmode是否未設(shè)置CEPH_FILE_MODE_LAZY

                |__設(shè)置struct ceph_file_info中的fmode擁有CEPH_FILE_MODE_LAZY標(biāo)識

                |__更新ceph_inode_info中的i_nr_by_mode數(shù)組

                |__調(diào)用ceph_check_caps()函數(shù)更新caps

    |__cmd==CEPH_IOC_SYNCIO

        |__ceph_ioctl_syncio()

            |__設(shè)置struct ceph_file_info結(jié)構(gòu)中的flags的CEPH_F_SYNC位

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

|__調(diào)用ceph_sync_write_wait()函數(shù)等待inode上所有未完成的osd請求執(zhí)行完畢

|__調(diào)用try_flush_caps()函數(shù)將所有dirty的caps刷回到mds

|__調(diào)用unsafe_request_wait()函數(shù)等待inode上所有針對mds請求執(zhí)行完畢

感謝各位的閱讀!關(guān)于“cephfs kernel client針對dir的file_operations操作代碼”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

網(wǎng)站欄目:cephfskernelclient針對dir的file_operations操作代碼
標(biāo)題來源:http://bm7419.com/article12/ijppgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、建站公司自適應(yīng)網(wǎng)站、網(wǎng)站排名云服務(wù)器、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作