真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

cephfskernelclient針對打開文件的操作代碼

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

10多年專注成都網(wǎng)站制作,企業(yè)網(wǎng)站設(shè)計(jì),個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于企業(yè)網(wǎng)站設(shè)計(jì),高端網(wǎng)頁制作,對建筑動(dòng)畫等多個(gè)領(lǐng)域,擁有豐富的網(wǎng)站運(yùn)維經(jīng)驗(yàn)。

針對打開文件的操作主要體現(xiàn)在struct file_operations數(shù)據(jù)結(jié)構(gòu)中。在cephfs kernel client中具體實(shí)現(xiàn)如下:

const struct file_operations ceph_file_fops = {

    .open = ceph_open,

    .release = ceph_release,

    .llseek = ceph_llseek,

    .read_iter = ceph_read_iter,

    .write_iter = ceph_write_iter,

    .mmap = ceph_mmap,

    .fsync = ceph_fsync,

    .lock = ceph_lock,

    .flock = ceph_flock,

    .splice_read = generic_file_splice_read,

    .splice_write = iter_file_splice_write,

    .unlocked_ioctl = ceph_ioctl,

    .compat_ioctl    = ceph_ioctl,

    .fallocate    = ceph_fallocate,

};

ceph_open(struct inode *inode, struct file *file)    該函數(shù)在打開文件時(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進(jìn)程

|__調(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)閉文件時(shí)被調(diào)用

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

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

|__若whence是SEEK_END|SEEK_DATA|SEEK_HOLE

  |__調(diào)用ceph_do_getattr()函數(shù)從mds集群中獲取指定inode的attrs屬性

|__調(diào)用i_size_read()函數(shù)得到當(dāng)前inode的實(shí)際大小

|__根據(jù)whence的值調(diào)整offset的值

|__調(diào)用vfs_setpos()函數(shù)設(shè)置文件的當(dāng)前位置為offset

ceph_read_iter(struct kiocb *iocb, struct iov_iter *to)    該函數(shù)在讀取文件內(nèi)容的時(shí)候被調(diào)用

|__調(diào)用ceph_get_caps()函數(shù)得到caps

|__對于同步讀數(shù)據(jù)操作來說

  |__若iocb->ki_flags&IOCB_DIRECT

    |__調(diào)用ceph_direct_read_write()函數(shù)從osds集群中讀取數(shù)據(jù)

  |__若!iocb->ki_flags&IOCB_DIRECT

    |__調(diào)用ceph_sync_read()函數(shù)從osds集群中讀取數(shù)據(jù)

|__對于非同步讀取數(shù)據(jù)操作來說

  |__調(diào)用generic_file_read_iter()函數(shù)實(shí)現(xiàn)異步數(shù)據(jù)的讀取操作

ceph_write_iter(structd kiocb *iocb, struct iov_iter *from)    執(zhí)行寫操作時(shí)調(diào)用該函數(shù)執(zhí)行

|__調(diào)用 generic_write_check()函數(shù)在實(shí)際寫之前進(jìn)行必要的檢查

|__調(diào)用ceph_get_caps()得到寫權(quán)限

|__對于同步寫操作

    |__對于iocb->ki_flags & IOCB_DIRECT

        |__調(diào)用ceph_direct_read_write()函數(shù)向osds集群中寫入數(shù)據(jù)

    |__對于! iocb->ki_flags & IOCB_DIRECT

        |__調(diào)用ceph_sync_write()函數(shù)向osds集群中紅寫入數(shù)據(jù)

|__對于非同步寫操作

    |__調(diào)用generic_perform_write()函數(shù)執(zhí)行寫操作

ceph_mmap(struct file *file, struct vm_area_struct *vma)        將文件內(nèi)容影射到內(nèi)存的操作時(shí)調(diào)用該函數(shù)執(zhí)行

|__設(shè)置vma的vm_ops=ceph_vmops

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í)行完畢

ceph_lock(struct file *file, int cmd, struct file_lock *fl)            當(dāng)用戶態(tài)程序執(zhí)行fcntl lock時(shí)調(diào)用該函數(shù)執(zhí)行

|__調(diào)用ceph_lock_message()函數(shù)創(chuàng)建文件鎖命令請求后,將該請求發(fā)送給mds集群

ceph_flock(struct file *file, int cmd, struct file_lock *fl)

|__調(diào)用ceph_lock_message()函數(shù)創(chuàng)建文件鎖命令請求后,將該請求發(fā)送給mds集群

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                計(jì)算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ù)計(jì)算ceph_ioctl_dataloc信息中指定文件所在的oid等信息

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

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

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

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

        |__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)識(shí)

                |__更新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_fallocate(struct file *file, int mode, loff_t offset, loff_t length)

|__若mode==FALLOC_FL_PUNCH_HOLE

    |__調(diào)用ceph_zero_object()函數(shù)在文件的指定offset開始到offset+length結(jié)束的地方設(shè)置文件內(nèi)容為0

|__若offset+length>size

    |__調(diào)用ceph_inode_set_size()將文件的大小設(shè)置為offset+length

    |__調(diào)用ceph_check_caps()函數(shù)校驗(yàn)文件caps的認(rèn)證是否有效

針對文件映射到內(nèi)存的相關(guān)操作主要體現(xiàn)在struct vm_operations_struct數(shù)據(jù)結(jié)構(gòu)中,具體內(nèi)容如下:

static const struct vm_operations_struct ceph_vmops = {

        .fault          = ceph_filemap_fault,

        .page_mkwrite   = ceph_page_mkwrite,

};

ceph_filemap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)    該函數(shù)在讀取內(nèi)存中的數(shù)據(jù)時(shí)發(fā)生內(nèi)存缺頁的時(shí)候被調(diào)用

|__調(diào)用find_or_create_page()函數(shù)從物理內(nèi)存中獲取到物理內(nèi)存頁

|__調(diào)用__ceph_do_getattr(CEPH_STAT_CAP_INLINE_DATA)函數(shù)從mds集群中讀取到數(shù)據(jù)

|__調(diào)用flush_dcache_page()函數(shù)將讀取到的數(shù)據(jù)寫入到物理內(nèi)存頁

|__調(diào)用SetPageUptodate()函數(shù)設(shè)置該物理內(nèi)存頁已經(jīng)被更新

|__設(shè)置vmf->page=page,即:將物理內(nèi)存頁添加到虛擬內(nèi)存中

ceph_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)    當(dāng)頁面從readonly狀態(tài)變遷到writeable狀態(tài)時(shí)該函數(shù)被調(diào)用

|__調(diào)用ceph_update_writeable_page()函數(shù)來設(shè)置vmf->page頁為writeable 

|__調(diào)用set_page_diry()函數(shù)設(shè)置該物理內(nèi)存頁為dirty的

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


新聞名稱:cephfskernelclient針對打開文件的操作代碼
URL鏈接:http://weahome.cn/article/gshpjo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部