這篇文章給大家分享的是有關(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ò),可以把它分享出去讓更多的人看到吧!