這篇文章給大家分享的是有關(guān)cephfs kernel client針對(duì)dir的file_operations操作代碼的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
疏附網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)從2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
cephfs kernel client針對(duì)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í)帶有參數(shù)-o dirstat時(shí)該函數(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)存空間進(jìn)行格式化輸出
|__調(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請(qǐng)求
|__調(diào)用ceph_alloc_readdir_reply_buffer()函數(shù)為從集群中讀取到的dir內(nèi)容分配內(nèi)存空間
|__調(diào)用ceph_mdsc_do_request()函數(shù)將請(qǐng)求同步發(fā)送給mds進(jìn)程
|__遍歷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ù)在打開文件時(shí)被調(diào)用
|__調(diào)用prepare_open_request()函數(shù)來創(chuàng)建ceph_mds_request請(qǐng)求
|__調(diào)用ceph_mdsc_do_request()函數(shù)將ceph_mds_request請(qǐng)求同步的發(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_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對(duì)應(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請(qǐng)求
|__調(diào)用ceph_mdsc_do_request()函數(shù)同步的發(fā)送request請(qǐng)求到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請(qǐng)求
|__調(diào)用ceph_mdsc_do_request()函數(shù)同步的發(fā)送request請(qǐng)求到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_fsync(struct file *file, loff_t start , loff_t end, int datasync)
|__調(diào)用ceph_sync_write_wait()函數(shù)等待inode上所有未完成的osd請(qǐng)求執(zhí)行完畢
|__調(diào)用try_flush_caps()函數(shù)將所有dirty的caps刷回到mds
|__調(diào)用unsafe_request_wait()函數(shù)等待inode上所有針對(duì)mds請(qǐng)求執(zhí)行完畢
感謝各位的閱讀!關(guān)于“cephfs kernel client針對(duì)dir的file_operations操作代碼”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
網(wǎng)站欄目:cephfskernelclient針對(duì)dir的file_operations操作代碼
標(biāo)題來源:http://aaarwkj.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)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)