mkdir
2022-01-02 10:57:33 0 举报
AI智能生成
mkdir ceph client侧的处理
作者其他创作
大纲/内容
Client::ll_mkdir
may_create
_getattr_for_perm父目录的inode的caps是否有As的权限
inode_permission 操作的用户uid、gid是否有权限
_mkdir
1.is_quota_files_exceeded 检查配额
2.填充MetaRequest请求
3.get_or_create
1.给inode->dir赋值
2.获取需要的Dentry结构
存在,从inode->dir->dentries中获取
不存在,调用link创建一个,并放入Client::lru缓存
4.make_request
1.choose_target_mds 选择一个mds
2._get_or_open_mds_session 打开或者创建一个与mds的session
3.send_request 发送请求
1.生成MClientRequest请求
2.Client::encode_cap_releases 去掉父目录caps中的Fs权限,并新建ceph_mds_request_release添加到MClientRequest的release中
3.session->requests.push_back(&request->item); 添加请求到队列
4.session->con->send_message(r) 发送请求
4.等待回复
5.发送回复:MClientReply
5.trim_cache
fill_stat
Client::handle_client_replay
1.insert_trace
1.Client::add_update_inode 分配新创建的目录的inode
2.Client::add_update_inode 更新父目录的inode
3.Client::update_dir_dist 更新父目录inode中的fragmap
4.Inode::open_dir 获取父目录的inode的dir
5.Client::insert_dentry_inode 给Dentry中inode赋值,并将Dentry加入自己的inode链表
2.唤醒阻塞的请求
Server::handle_client_request
mds->locker->process_request_cap_release
mdcache->get_inode(ino) 获取父目录的CInode
in->get_client_cap(client) 获取CInode中对应client的cap
cap->confirm_receipt(seq, caps) 将CInode caps中的_issued和_pending设置为与传过来的caps相同
adjust_cap_wanted(cap, wanted, issue_seq) 设置caps中的wanted
eval(in, CEPH_CAP_LOCKS)
Server::dispatch_client_request
Server::handle_client_mkdir
rdlock_path_xlock_dentry
mds->locker->acquire_locks
prepare_new_inode 创建CInodeb并填充信息
newi->get_or_open_dirfrag 目录分片
mdcache->predirty_journal_parents
mds->locker->issue_new_caps
journal_and_reply
early_reply 回复客户端
submit_mdlog_entry
MDLog::_submit_entry 提交日志
submit_cond.Signal() 触发刷盘
mds->locker->drop_rdlocks_for_early_reply
mds->balancer->maybe_fragment
收藏
0 条评论
下一页