首页 > 编程知识 正文

hadoop编辑文件命令,数据结构严蔚敏

时间:2023-05-06 04:34:59 阅读:153701 作者:1077

F2FS源代码分析系列文章主目录一、文件系统配置和元数据结构二、文件数据保存和读写三、文件和目录的创建和删除(未完成)四、垃圾回收机构五、数据恢复机构六、 重要数据结构或函数分析f2fs_summary的作用f2fs_journal的作用f2fs_map_block的作用get_dnode_of_data的作用get_node_page的作用(未完成) 在F2FS的rename过程rename过程中,sys_rename函数do_renameat2函数vfs_rename函数f2fs_rename函数sys_rename函数sys_rename函数返回

syscall_define2(rename,constchar_user*,Oldname,constchar_user*,newname ) AT_FDCWD表示用相对路径的方法寻找old 这里考虑sys_rename函数rename是一个文件的情况,即flag=0,简化函数。

staticintdo _ rename at2 (intolddfd,const char __user *oldname,int newdfd,const char __user *newname,unsignedined struct path old_path,new_path; struct qstr old_last,new_last; int old_type,new_type; struct inode * delegated _ inode=null; 结构文件名称* from; struct filename *to; unsigned int lookup_flags=0,target _ flags=lookup _ rename _ target; bool should_retry=false; 输入错误; retry: //以下两个函数的最重要作用是根据oldname和newname找到父目录的dentry结构//将这两个dentry结构保存在old_path和new_path中。 (注意是父目录中的dentry ) from=filename getname(oldname )、lookup_flags、old_path、old_last、old_type; to=filename_parentat(newDFD,getname ) newname )、lookup_flags、new_path、new_last、new_type ); retry_deleg: //此函数启动全局rename独占锁,并调用两个父目录的inode结构trap=lock _ rename (new _ path.dentry, 锁定old_path.dentry。从old path的父目录中,选择要重命名的文件的dentry old _ dentry=_ _ lookup _ hash (old _ last,old lookup_flags ) )的new path的父目录中输入dentry new _ dentry=_ _ lookup _ hash (new _ last,new_path.dentry, lookup_flags|Target )或调用要创建的新vfs_rename函数重命名//传递的是新旧两个目录的inode和需要重命名的两个dentry dput(old_dentry; //全局rename解除互斥锁,并使用两个inode锁unlock_rename(new_path.dentry,old_path.dentry ); path_put(new_path; putname(to ); path_put(old_path; 来自; exit :返回错误; } vfs_rename函数vfs_rename函数也将被简化。 简化的情况是将文件a重命名为文件b(b可能已经存在或不存在),并使flags=0。

int VFS _ rename (struct inode * old _ dir,struct dentry

*old_dentry, struct inode *new_dir, struct dentry *new_dentry, struct inode **delegated_inode, unsigned int flags){int error;bool is_dir = d_is_dir(old_dentry);struct inode *source = old_dentry->d_inode; // 旧文件inodestruct inode *target = new_dentry->d_inode; // 新文件inodebool new_is_dir = false;unsigned max_links = new_dir->i_sb->s_max_links;struct name_snapshot old_name;dget(new_dentry); // 对新文件的引用计数+1if (target)inode_lock(target); // 如果新文件已经存在,则上锁error = old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry, flags);out:if (target)inode_unlock(target); // 如果新文件已经存在,则解锁dput(new_dentry); // 对新文件的引用计数-1return error;} f2fs_rename函数

f2fs_rename函数也会做简化,简化的情形是将文件A重命名到文件B (B可能已经存在,或者不存在),flags=0。

static int f2fs_rename(struct inode *old_dir, struct dentry *old_dentry,struct inode *new_dir, struct dentry *new_dentry,unsigned int flags){struct f2fs_sb_info *sbi = F2FS_I_SB(old_dir);struct inode *old_inode = d_inode(old_dentry);struct inode *new_inode = d_inode(new_dentry);struct inode *whiteout = NULL;struct page *old_dir_page;struct page *old_page, *new_page = NULL;struct f2fs_dir_entry *old_dir_entry = NULL;struct f2fs_dir_entry *old_entry;struct f2fs_dir_entry *new_entry;bool is_old_inline = f2fs_has_inline_dentry(old_dir);int err;// 输入显然是 // 旧的父目录old_dir,旧的文件old_dentry // 新的父目录new_dir,新的文件new_dentry // 根据旧文件的名字找到对应的f2fs_dir_entry,old_page保存的是磁盘上的dir_entry数据old_entry = f2fs_find_entry(old_dir, &old_dentry->d_name, &old_page);if (new_inode) { // 如果新文件已经存在 // 根据新文件的名字找到对应的f2fs_dir_entry,new_page保存的是磁盘上的数据new_entry = f2fs_find_entry(new_dir, &new_dentry->d_name,&new_page); // F2FS获取一个全局读信号量f2fs_lock_op(sbi); // 在管理orphan inode的全局结构中,将orphan inode的数目+1。err = f2fs_acquire_orphan_inode(sbi); // 这里进行新旧inode的link的变化: // 将new_dentry所属的inode指向old_inode // 因为rename的时候新inode是已经存在了,因此rename的操作就是将 // 新路径原来的inode无效掉,然后替换为旧路径的inodef2fs_set_link(new_dir, new_entry, new_page, old_inode);new_inode->i_ctime = current_time(new_inode); down_write(&F2FS_I(new_inode)->i_sem); // 拿写信号量// 减少新inode一个引用计数,因为被rename了f2fs_i_links_write(new_inode, false);up_write(&F2FS_I(new_inode)->i_sem); // 释放写信号量 // 如果引用计数下降到0,则添加到orphan inode中,在checkpoint管理if (!new_inode->i_nlink)f2fs_add_orphan_inode(new_inode);elsef2fs_release_orphan_inode(sbi); // 否则管理结构将orphan inode的数目-1。} else { // 这个情况是新路径的Inode不存在// F2FS获取一个全局读信号量f2fs_lock_op(sbi); // 由于新inode是不存在的,因此直接将旧inode添加到新的f2fs_dir_entry中err = f2fs_add_link(new_dentry, old_inode);} down_write(&F2FS_I(old_inode)->i_sem);if (!old_dir_entry || whiteout)file_lost_pino(old_inode); // 这个操作要保留着用于数据恢复elseF2FS_I(old_inode)->i_pino = new_dir->i_ino;up_write(&F2FS_I(old_inode)->i_sem);old_inode->i_ctime = current_time(old_inode);f2fs_mark_inode_dirty_sync(old_inode, false); // 新的数据已经加入到新的f2fs_dir_entry,因此旧entry就去去除掉f2fs_delete_entry(old_entry, old_page, old_dir, NULL);// F2FS释放全局读信号量f2fs_unlock_op(sbi);f2fs_update_time(sbi, REQ_TIME);return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。