code:link - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • link的系统调用函数
  • 将 文件的别名 加入文件系统
  • 使用2个隐式参数: name1 , name2
    • name1 : 文件的当前路径,保存在u.u_arg[0]
    • name2 : 文件的别名路径,保存在u.u_arg[1]

5905

5906

5907 /* link system call

5908  */

5909 link()

5910 {

5911     register *ip, *xp;

5912     extern uchar;

5913

5914     ip = namei(&uchar, 0);

  • ip ← name1 对应的 INODE
5915     if(ip == NULL)

5916          return;

5917     if(ip->i_nlink >= 127) {

5918          u.u_error = EMLINK;

5919          goto out;

5920     }

5921     if((ip->i_mode&IFMT)==IFDIR && !suser())

5922          goto out;

  • 只有 超级用户 才可以给目录起别名
5923     /*

5924      * ulock to avoid possible hanging in namei

5925      */

5926     ip->i_flag =& ~ILOCK;

  • 解锁ip (在5914 namei置锁)
5927     u.u_dirp = u.u_arg[1];

5928     xp = namei(&uchar, 1);

  • xp ← 查找 name2 对应的 INODE
5929     if(xp != NULL) {

5930          u.u_error = EEXIST;

5931          iput(xp);

5932     }

  • xp 若已存在,则抛出错误,释放xp
5933     if(u.u_error)

5934          goto out;

5935     if(u.u_pdir->i_dev != ip->i_dev) {

5936          iput(u.u_pdir);

5937          u.u_error = EXDEV;

5938          goto out;

5939     }

  • 若name1 和 name2 INODE不在同一设备,抛出错误
5940     wdir(ip);
  • 将 ip (再次) 链入目录结构 (新文件名name2为参数)
5941     ip->i_nlink++;

5942     ip->i_flag =| IUPD;

  • 修正ip参数
5943

5944 out:

5945     iput(ip);

5946 }

5947 /* ------------------------- */

Ref

Param

(link = 9.)
sys link; name1; name2
⚠️ **GitHub.com Fallback** ⚠️