ext fs fixing

git-svn-id: svn://kolibrios.org@6856 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
pathoswithin 2017-02-06 09:55:55 +00:00
parent b08e3b7796
commit d248870812

View File

@ -1196,23 +1196,12 @@ extfsExtendFile:
pop eax
jmp .errFree
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:
freeBlockList:
; in: edi -> list of blocks, edx = amount of blocks
; out: ebx=0 -> end of list
mov ebx, [edi]
test ebx, ebx
jz .end
jz .ret
xor eax, eax
xor ecx, ecx
@@:
@ -1228,9 +1217,28 @@ freeIndirectBlock:
mov eax, ebx
call extfsExtentFree
test edx, edx
jnz .freeExtent
dec dword[esp+8]
.end:
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]
@@:
pop edx edi
mov eax, [edi]
test edx, edx
@ -1339,16 +1347,9 @@ extfsTruncateFile:
lea edi, [esi+INODE.blockNumbers+edx*4]
neg edx
add edx, 12
xor ecx, ecx
inc ecx
@@:
mov eax, [edi]
test eax, eax
call freeBlockList
test ebx, ebx
jz .ret
call extfsExtentFree
stosd
dec edx
jnz @b
.indirectBlocks:
lea edi, [esi+INODE.addressBlock]
call freeIndirectBlock
@ -1412,9 +1413,7 @@ linkInode:
; 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
@ -1435,6 +1434,7 @@ linkInode:
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,27 +1464,24 @@ linkInode:
add edi, eax
cmp edi, edx
jb .searchSpace
pop ecx ecx eax
pop ecx
@@:
pop 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
pop ecx
inc ecx
cmp ecx, [esp]
push ecx
jnz @f
jmp @b
.alloc_block:
mov eax, [esi+INODE.fileSize]
add eax, [ebp+EXTFS.bytesPerBlock]
@ -1497,7 +1494,6 @@ linkInode:
call writeInode
jc .error_get_inode_block
mov ecx, [esp]
@@:
call extfsGetExtent
jc .error_get_inode_block
push eax
@ -1506,15 +1502,17 @@ linkInode:
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
cmp [ebp+EXTFS.superblock.dynamicVersionFlag], 0
je .name
mov eax, [esp+4]
sub eax, 8
cmp ecx, eax
adc ecx, 0
test [ebp+EXTFS.superblock.incompatibleFlags], 2
jz @f
mov eax, [esp]
mov [edi+DIRENTRY.fileType], al
.name:
@@:
push ebx
add edi, 8
rep movsb
mov eax, edx
@ -1660,12 +1658,12 @@ findInode:
@@: ; doesn't match
pop esi
.next_rec:
movzx eax, [ebx+DIRENTRY.entryLength]
add ebx, eax
movzx ecx, [ebx+DIRENTRY.entryLength]
jecxz .stop
add ebx, ecx
cmp ebx, edx
jb .start_rec
push eax
jmp @f
jmp .stop
.test_find:
cmp byte [esi], 0
@ -1674,7 +1672,9 @@ findInode:
jne @b
inc esi
@@:
pop edx edx edi ecx eax
pop edx
.stop:
pop edx edi ecx eax
; ebx -> matched directory entry, esi -> name without parent, or not changed
cmp edi, esi
jnz @f