| aubifs_unlink#(FI, FO; P_INODE, C_INODE, DENT, ERR, RI, RO, FS, LOG, CSYNCED) {if pre-unlink(P_INODE, C_INODE, DENT, FS, RI, RO) then choose INO, ADR1, ADR2, ADR3, KEY1, KEY2, KEY3, ND1, ND2, ND3 with INO = C_INODE.ino in {KEY1 := inodekey(P_INODE.ino); KEY2 := dentrykey(P_INODE.ino, DENT.name); KEY3 := inodekey(C_INODE.ino); ND1 := inodenode(KEY1, P_INODE.meta, P_INODE.directory, P_INODE.nlink, P_INODE.nsubdirs, P_INODE.size - 1); ND2 := dentrynode(KEY2, 0); ND3 := inodenode(KEY3, C_INODE.meta, C_INODE.directory, C_INODE.nlink - 1, C_INODE.nsubdirs, C_INODE.size); aubifs_core_journal_add3#(ND1, ND2, ND3, RI, FI, RO, FO; ADR1, ADR2, ADR3, FS, LOG; CSYNCED, ERR); if ERR = ESUCCESS then {aubifs_core_index_store#(KEY1, ADR1, FI, RO, FO, FS, LOG, CSYNCED; RI); aubifs_core_index_remove#(KEY2, FI, RO, FO, FS, LOG, CSYNCED; RI); aubifs_core_index_store#(KEY3, ADR3, FI, RO, FO, FS, LOG, CSYNCED; RI); if C_INODE.nlink = 1 then aubifs_core_orphans_insert#(KEY3, RI, FI, FO, FS, LOG, CSYNCED; RO); DENT := negdentry(DENT.name); P_INODE := mkinode(P_INODE.ino, ND1.meta, ND1.directory, ND1.nlink, ND1.nsubdirs, ND1.size); C_INODE := mkinode(INO, ND3.meta, ND3.directory, ND3.nlink, ND3.nsubdirs, ND3.size)}} else abort } |