rename系統調用的實現淺析


     rename系統調用用於在同一個文件系統中做文件的rename操作。如果源和目的在不同mount點上,rename會返回錯誤EXDEV。

     rename系統調用的實現入口在./fs/namei.c中:

SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname)
{
        return sys_renameat(AT_FDCWD, oldname, AT_FDCWD, newname);
}

  可以看到,它實際上是轉調用了renameat系統調用。renameat系統調用的實現也在./fs/namei.c中,它的函數定義是:

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                int, newdfd, const char __user *, newname);

下面是它的具體實現:

1,對oldname和newname分別做目錄查找,得到它們對應的nameidata數據結構oldnd和newnd。這個過程會涉及到查找目錄項緩存,如果目錄不在目錄項緩存中,需要將目錄從磁盤讀取到目錄項緩存中,具體細節見這里:http://www.cnblogs.com/cobbliu/p/4888751.html。

2,查看oldnd和newnd的mount點是否一樣,不一樣則返回EXDEV

3,做一堆其他的驗證和准備工作,這個過程中會找到oldname的old_dir的inode和old_dentry,newname的new_dir的inode和new_dentry

4,調用VFS層的error = vfs_rename(old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry);

 

int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry)的實現:

1,如果目的和源的inode一樣,則返回0

2,查看是否需要刪除old_dentry和是否需要新建new_dentry

3,如果old_dentry是個目錄則調用vfs_rename_dir,否則調用vfs_rename_other

 

static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,struct inode *new_dir, struct dentry *new_dentry)的實現:

1,調用dget(new_dentry)

2,調用old_dir->i_op->rename(old_dir, old_dentry, new_dir, new_dentry);做真正的rename操作

3,調用dput(new_dentry)

 

ext4_rename函數真正實現了rename過程,ext4_rename實際上是講舊目錄文件中的文件項的refcount遞減,然后在新目錄文件中加入新文件名的目錄項,並不會移動實際的數據文件,也不會修改數據文件的inode號。

 

/proc/sys/fs/dentry_state顯示目錄項高速緩存的一些信息:

  • nr_dentry - number of dentries currently allocated
  • nr_unused - nuber of unused dentries
  • age_limit - seconds after the entry may be reclaimed, when memory is short
  • remaining - reserved.

通常linux文件系統中目錄項高速緩存的age_limit是45s,也就是說該目錄項在目錄項高速緩存中停留45s還無訪問,就將它換出。

http://www.linuxinsight.com/proc_sys_fs_dentry_state.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM