Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6856 → Rev 6853

/kernel/trunk/fs/ext.inc
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