Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6849 → Rev 6848

/kernel/trunk/fs/ext.inc
1018,34 → 1018,28
extfsExtendFile:
; in:
; [ebp+EXTFS.inodeBuffer] = inode
; ecx = inode number
; edx:eax = new size
push ebx esi edi ecx
; eax = inode number
; ecx = new size
push ebx ecx edx esi edi eax
lea esi, [ebp+EXTFS.inodeBuffer]
mov ebx, [esi+INODE.fileSize]
mov ecx, [esi+INODE.fileSizeHigh]
cmp ebx, eax
sbb ecx, edx
mov eax, ecx
mov edx, [esi+INODE.fileSize]
cmp edx, eax
jnc .ret
mov ecx, [esi+INODE.fileSizeHigh]
mov [esi+INODE.fileSize], eax
mov [esi+INODE.fileSizeHigh], edx
sub eax, 1
sbb edx, 0
div [ebp+EXTFS.bytesPerBlock]
mov ecx, [ebp+EXTFS.sectorsPerBlockLog]
add ecx, 9
dec eax
shr eax, cl
inc eax
xchg eax, ebx
mov edx, ecx
sub eax, 1
sbb edx, 0
sub edx, 1
jc @f
div [ebp+EXTFS.bytesPerBlock]
shr edx, cl
@@:
inc eax
sub ebx, eax
inc edx
sub eax, edx
jz .ret
push ebx
mov edx, eax
push eax
@@:
mov ecx, [esp]
mov eax, [esp+4]
1190,7 → 1184,7
xor eax, eax
pop edi
.ret:
pop edi edi esi ebx
pop edi edi esi edx ecx ebx
ret
 
.errSave:
1314,21 → 1308,19
ret
 
extfsTruncateFile:
; in: edx:eax = new size, [ebp+EXTFS.inodeBuffer] = inode
; in: ecx = new size, [ebp+EXTFS.inodeBuffer] = inode
push ebx ecx edx esi edi
lea esi, [ebp+EXTFS.inodeBuffer]
mov ecx, edx
cmp eax, [esi+INODE.fileSize]
sbb ecx, [esi+INODE.fileSizeHigh]
cmp ecx, [esi+INODE.fileSize]
jnc .ret
mov [esi+INODE.fileSize], eax
mov [esi+INODE.fileSizeHigh], edx
sub eax, 1
sbb edx, 0
jc @f
div [ebp+EXTFS.bytesPerBlock]
@@:
inc eax
mov edx, eax
mov [esi+INODE.fileSize], ecx
mov edx, ecx
jecxz .directBlocks
dec edx
mov ecx, [ebp+EXTFS.sectorsPerBlockLog]
add ecx, 9
shr edx, cl
inc edx
cmp edx, 12
jc .directBlocks
sub edx, 12
1407,6 → 1399,7
.done:
call kernel_free
.ret:
pop edi esi edx ecx ebx
ret
 
linkInode:
1492,10 → 1485,9
push ecx
jnz @f
.alloc_block:
mov eax, [esi+INODE.fileSize]
add eax, [ebp+EXTFS.bytesPerBlock]
xor edx, edx
mov ecx, [esp+24]
mov ecx, [esi+INODE.fileSize]
add ecx, [ebp+EXTFS.bytesPerBlock]
mov eax, [esp+24]
call extfsExtendFile
jc .error_get_inode_block
mov eax, [esp+24]
1641,7 → 1633,7
mov edx, esi
rep movsb
pop esi
pushd ebx 0 ROOT_INODE
pushd 0 ROOT_INODE
mov edi, esi
cmp [edx+INODE.fileSize], 0
jz .not_found
1648,13 → 1640,13
cmp byte [esi], 0
jnz .next_path_part
xor eax, eax
pop esi ecx ebx
pop esi ecx
ret
 
@@:
pop esi esi
.error:
pop esi ecx ebx
pop esi ecx
xor edi, edi
stc
ret
1737,7 → 1729,7
movi eax, ERROR_FILE_NOT_FOUND
stc
.ret:
pop esi ecx ebx
pop esi ecx
ret
 
writeSuperblock:
1770,7 → 1762,9
call ext_lock
cmp byte [esi], 0
jz .root_folder
push ebx
call findInode
pop ebx
jc .error_ret
lea esi, [ebp+EXTFS.inodeBuffer]
test [esi+INODE.accessMode], FLAG_FILE
1978,8 → 1972,10
;----------------------------------------------------------------
ext_ReadFile:
call ext_lock
pushd 0 ebx
call findInode
pushd 0 eax
pop ebx
push eax
jc .ret
lea esi, [ebp+EXTFS.inodeBuffer]
mov byte [esp], ERROR_ACCESS_DENIED
2083,9 → 2079,12
;----------------------------------------------------------------
ext_GetFileInfo:
call ext_lock
mov edx, [ebx+16]
cmp byte [esi], 0
jz .is_root
push edx
call findInode
pop edx
lea esi, [ebp+EXTFS.inodeBuffer]
jnc @f
push eax
2097,7 → 2096,6
mov edi, esi
lea esi, [ebp+EXTFS.rootInodeBuffer]
@@:
mov edx, [ebx+16]
mov bl, [edi]
xor eax, eax
mov edi, edx
2135,11 → 2133,12
;----------------------------------------------------------------
ext_SetFileInfo:
call extfsWritingInit
pushd [ebx+16]
call findInode
pop edx
jc @f
push esi
mov esi, [ebx+16]
add esi, 16
push esi ; inode number
lea esi, [edx+16]
lea edi, [ebp+EXTFS.inodeBuffer]
call fsCalculateTime
add eax, 978307200 ; 01.01.1970-01.01.2001 = (365*31+8)*24*60*60
2237,14 → 2236,12
lea ebx, [ebp+EXTFS.inodeBuffer]
call readInode
jc .error_stack4_eax
push edx
xor eax, eax
xor edx, edx
xor ecx, ecx
call extfsTruncateFile ; free file's data
movzx ecx, [ebp+EXTFS.superblock.inodeSize]
lea edi, [ebp+EXTFS.inodeBuffer]
xor eax, eax
push edi
push edx edi
rep stosb
call fsGetTime
pop ebx ecx
2411,8 → 2408,7
call linkInode
jc .error2
pop esi ebx
mov eax, [ebx+12]
xor edx, edx
mov ecx, [ebx+12]
jmp ext_WriteFile.start
 
.exist:
2420,11 → 2416,8
test [ebp+EXTFS.inodeBuffer.accessMode], FLAG_FILE
jz .error ; not a file
pop ebx
mov eax, [ebx+12]
xor edx, edx
push eax edx ebx esi
mov ecx, [ebx+12]
call extfsTruncateFile
pop esi ebx edx eax
jmp ext_WriteFile.start
 
.error2:
2438,27 → 2431,26
;----------------------------------------------------------------
ext_WriteFile:
call extfsWritingInit
push ebx
call findInode
pop ebx
pushd 0 eax
jc .ret
mov byte [esp], ERROR_ACCESS_DENIED
test [ebp+EXTFS.inodeBuffer.accessMode], FLAG_FILE
jz .ret ; not a file
mov byte [esp], 0
mov eax, [ebx+4]
mov edx, [ebx+8]
add eax, [ebx+12]
adc edx, 0
mov ecx, [ebx+4]
add ecx, [ebx+12]
.start:
push esi
mov ecx, esi
mov eax, esi
call extfsExtendFile
jc .errorExtend
mov eax, [ebx+4]
mov edx, [ebx+8]
mov ecx, [ebx+12]
mov esi, [ebx+16]
.write:
xor edx, edx
div [ebp+EXTFS.bytesPerBlock]
test edx, edx
jz .aligned
2555,7 → 2547,7
ret
 
.erase:
push eax eax edi
push eax eax edx
mov eax, ebx
jmp .write
 
2562,33 → 2554,26
;----------------------------------------------------------------
ext_SetFileEnd:
call extfsWritingInit
pushd [ebx+4]
call findInode
pop ecx
jc .error2
lea edi, [ebp+EXTFS.inodeBuffer]
movi eax, ERROR_ACCESS_DENIED
test [edi+INODE.accessMode], FLAG_FILE
jz .error2 ; not a file
mov eax, [ebx+4]
mov edx, [ebx+8]
push esi
mov ebx, [edi+INODE.fileSize]
mov ecx, [edi+INODE.fileSizeHigh]
push esi ecx
cmp ebx, eax
sbb ecx, edx
mov ecx, esi
mov eax, esi
cmp ebx, ecx
jnc @f
call extfsExtendFile
pop esi
jc .error
mov eax, [edi+INODE.fileSize]
mov edx, [edi+INODE.fileSizeHigh]
sub eax, ebx
sbb edx, esi
jnz .done
cmp eax, 1000001h
sub ecx, ebx
cmp ecx, 1000001h
jnc .done
push eax
stdcall kernel_alloc, eax
push ecx
stdcall kernel_alloc, ecx
pop ecx
test eax, eax
jz .error
2595,12 → 2580,11
push ecx
add ecx, 3
shr ecx, 2
mov edx, esi
mov esi, eax
mov edi, eax
xor eax, eax
rep stosd
pop ecx edi
pop ecx edx
push esi
call ext_WriteFile.erase
call kernel_free
2609,7 → 2593,6
 
@@:
call extfsTruncateFile
pop eax
.done:
xor eax, eax
.error: