1196,12 → 1196,23 |
pop eax |
jmp .errFree |
|
freeBlockList: |
; in: edi -> list of blocks, edx = amount of blocks |
; out: ebx=0 -> end of list |
freeIndirectBlock: |
; in: edi -> indirect block number, edx = starting block |
; out: edi = edi+4, eax=-1 -> done, eax=0 -> end |
pushd ecx 0 edi edx |
mov eax, [edi] |
test eax, eax |
jz .ret |
mov ebx, [ebp+EXTFS.mainBlockBuffer] |
call extfsReadBlock |
jc .ret |
lea edi, [ebx+edx*4] |
neg edx |
add edx, [ebp+EXTFS.dwordsPerBlock] |
.freeExtent: |
mov ebx, [edi] |
test ebx, ebx |
jz .ret |
jz .end |
xor eax, eax |
xor ecx, ecx |
@@: |
1217,28 → 1228,9 |
mov eax, ebx |
call extfsExtentFree |
test edx, edx |
jnz freeBlockList |
.ret: |
ret |
|
freeIndirectBlock: |
; in: edi -> indirect block number, edx = starting block |
; out: edi = edi+4, eax=0 -> end |
pushd ecx 0 edi edx |
mov eax, [edi] |
test eax, eax |
jz .ret |
mov ebx, [ebp+EXTFS.mainBlockBuffer] |
call extfsReadBlock |
jc .ret |
lea edi, [ebx+edx*4] |
neg edx |
add edx, [ebp+EXTFS.dwordsPerBlock] |
call freeBlockList |
test ebx, ebx |
jz @f |
inc dword[esp+8] |
@@: |
jnz .freeExtent |
dec dword[esp+8] |
.end: |
pop edx edi |
mov eax, [edi] |
test edx, edx |
1347,9 → 1339,16 |
lea edi, [esi+INODE.blockNumbers+edx*4] |
neg edx |
add edx, 12 |
call freeBlockList |
test ebx, ebx |
xor ecx, ecx |
inc ecx |
@@: |
mov eax, [edi] |
test eax, eax |
jz .ret |
call extfsExtentFree |
stosd |
dec edx |
jnz @b |
.indirectBlocks: |
lea edi, [esi+INODE.addressBlock] |
call freeIndirectBlock |
1413,7 → 1412,9 |
; dl = file type |
push esi edi ebx ecx eax edx |
call strlen |
add ecx, 8 ; directory entry size |
push esi ebx ecx |
xor ecx, ecx |
lea esi, [ebp+EXTFS.inodeBuffer] |
mov ebx, esi |
call readInode |
1434,7 → 1435,6 |
call extfsReadBlock |
jc .error_block_read |
mov ecx, [esp+12] |
add ecx, 8 ; directory entry size |
mov edi, [ebp+EXTFS.tempBlockBuffer] |
mov edx, edi |
add edx, [ebp+EXTFS.bytesPerBlock] |
1464,24 → 1464,27 |
add edi, eax |
cmp edi, edx |
jb .searchSpace |
pop ecx |
@@: |
pop ecx eax |
pop ecx ecx eax |
inc ecx |
jmp .searchBlock |
|
.zeroLength: |
mov [edi+DIRENTRY.entryLength], cx |
mov eax, edx |
sub eax, edi |
mov [edi+DIRENTRY.entryLength], ax |
cmp eax, ecx |
jge .found |
mov [edi+DIRENTRY.inodeNumber], 0 |
mov [edi+DIRENTRY.entryLength], ax |
; this block wasn't linking to the next one, so write it, and use the next block |
pop eax |
mov ebx, [ebp+EXTFS.tempBlockBuffer] |
call extfsWriteBlock |
jmp @b |
|
pop ecx |
inc ecx |
cmp ecx, [esp] |
push ecx |
jnz @f |
.alloc_block: |
mov eax, [esi+INODE.fileSize] |
add eax, [ebp+EXTFS.bytesPerBlock] |
1494,6 → 1497,7 |
call writeInode |
jc .error_get_inode_block |
mov ecx, [esp] |
@@: |
call extfsGetExtent |
jc .error_get_inode_block |
push eax |
1502,17 → 1506,15 |
mov [edi+DIRENTRY.entryLength], ax |
.found: |
pop edx ecx ecx ecx ebx esi |
push ebx |
mov [edi+DIRENTRY.inodeNumber], ebx |
sub ecx, 8 |
mov word [edi+DIRENTRY.nameLength], cx |
sub eax, 8 |
cmp ecx, eax |
adc ecx, 0 |
test [ebp+EXTFS.superblock.incompatibleFlags], 2 |
jz @f |
mov eax, [esp] |
cmp [ebp+EXTFS.superblock.dynamicVersionFlag], 0 |
je .name |
mov eax, [esp+4] |
mov [edi+DIRENTRY.fileType], al |
@@: |
push ebx |
.name: |
add edi, 8 |
rep movsb |
mov eax, edx |
1658,12 → 1660,12 |
@@: ; doesn't match |
pop esi |
.next_rec: |
movzx ecx, [ebx+DIRENTRY.entryLength] |
jecxz .stop |
add ebx, ecx |
movzx eax, [ebx+DIRENTRY.entryLength] |
add ebx, eax |
cmp ebx, edx |
jb .start_rec |
jmp .stop |
push eax |
jmp @f |
|
.test_find: |
cmp byte [esi], 0 |
1672,9 → 1674,7 |
jne @b |
inc esi |
@@: |
pop edx |
.stop: |
pop edx edi ecx eax |
pop edx edx edi ecx eax |
; ebx -> matched directory entry, esi -> name without parent, or not changed |
cmp edi, esi |
jnz @f |