| afs_link#(OLD_DENT; P_INODE, C_INODE, NEW_DENT, ERR, DIRS, FILES; ASYNCED) {if pre-link(P_INODE, C_INODE, OLD_DENT, NEW_DENT, DIRS, FILES) then { let P_INO = P_INODE.ino in {DIRS[P_INO].entries[NEW_DENT.name] := OLD_DENT.ino; DIRS[P_INO].size := DIRS[P_INO].size + 1; let INO = OLD_DENT.ino in afs_inc_nlink#(INO; DIRS, FILES); NEW_DENT := mkdentry(NEW_DENT.name, OLD_DENT.ino); afs_inode_sync#(P_INODE; DIRS, FILES); afs_inode_sync#(C_INODE; DIRS, FILES); P_INODE := getinode(P_INODE.ino, DIRS, FILES); C_INODE := getinode(OLD_DENT.ino, DIRS, FILES); ERR := ESUCCESS} or fail#(; ; ERR); ASYNCED := ?} else abort } |