| vfs_link#(PATH, PATH', USER; ERR, DIRS, FILES, ASYNCED) {choose OLD_DENT, NEW_DENT, INODE, NEW_INODE, C_INODE with true in if PATH = ε ∨ PATH' = ε then ERR := EISDIR else {let INO = ROOT_INO, DENT = negdentry(PATH.last), PATH = parent(PATH) in {vfs_walk#(PATH, USER, DIRS, FILES, ASYNCED; INO, ERR); if ERR = ESUCCESS then vfs_may_link#(INO, USER, DIRS, FILES, ASYNCED; INODE, DENT, ERR); C_INODE := INODE; OLD_DENT := DENT}; if ERR = ESUCCESS then let INO = ROOT_INO, DENT = negdentry(PATH'.last), PATH = parent(PATH') in {vfs_walk#(PATH, USER, DIRS, FILES, ASYNCED; INO, ERR); if ERR = ESUCCESS then vfs_may_create#(INO, DENT, USER, DIRS, FILES, ASYNCED; INODE, ERR); NEW_INODE := INODE, NEW_DENT := DENT}; if ERR = ESUCCESS then afs_check_commit#(DIRS, FILES; ERR; ASYNCED); if ERR = ESUCCESS then afs_link#(OLD_DENT; NEW_INODE, C_INODE, NEW_DENT, ERR, DIRS, FILES; ASYNCED)} } |