Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 6852 → Rev 6853

/kernel/trunk/fs/ext.inc
1544,15 → 1544,14
jmp @b
 
unlinkInode:
; in: eax = inode from which to unlink, ebx = inode to unlink
; out: eax = current number of links to inode, -1 = error
push edx ebx
; in: eax = directory inode number, esi = inode to unlink
push edi
lea ebx, [ebp+EXTFS.inodeBuffer]
call readInode
jc .fail
push eax
jc .ret
xor ecx, ecx
.loop:
mov ecx, [esp]
push ecx
call extfsGetExtent
jc .fail_loop
mov edi, eax
1560,64 → 1559,48
call extfsReadBlock
jc .fail_loop
.first_dir_entry: ; edi -> block
mov eax, [esp+4]
cmp [ebx+DIRENTRY.inodeNumber], eax
cmp [ebx+DIRENTRY.inodeNumber], esi
jne @f
mov [ebx+DIRENTRY.inodeNumber], 0
mov word [ebx+DIRENTRY.nameLength], 0 ; fileType = 0
jmp .write_block
 
.fail:
pop edi
movi eax, ERROR_FS_FAIL
stc
.fail_loop:
pop edi
jmp .ret
 
.next:
pop ecx ecx
inc ecx
jmp .loop
 
@@:
mov edx, ebx
add edx, [ebp+EXTFS.bytesPerBlock]
push edx
@@:
movzx ecx, [ebx+DIRENTRY.entryLength]
jecxz .fail
mov edx, ebx
movzx ecx, [ebx+DIRENTRY.entryLength]
add ebx, ecx
.dir_entry:
cmp [ebx+DIRENTRY.inodeNumber], eax
jne @f
cmp ebx, [esp]
jnc .next
cmp [ebx+DIRENTRY.inodeNumber], esi
jnz @b
mov cx, [ebx+DIRENTRY.entryLength]
add [edx+DIRENTRY.entryLength], cx
pop eax
jmp .write_block
 
@@:
mov edx, ebx
movzx ecx, [ebx+DIRENTRY.entryLength]
test ecx, ecx
jz .fail_inode
add ebx, ecx
cmp ebx, [esp]
jb .dir_entry
pop ecx
inc dword[esp]
jmp .loop
 
.fail_inode:
pop eax
.fail_loop:
pop eax
.fail:
or eax, -1
jmp @f
 
.write_block:
pop eax
mov eax, edi
mov ebx, [ebp+EXTFS.tempBlockBuffer]
call extfsWriteBlock
mov eax, [esp]
lea ebx, [ebp+EXTFS.inodeBuffer]
call readInode
jc .fail
dec word [ebx+INODE.linksCount]
mov eax, [esp]
call writeInode
jc .fail
movzx eax, word [ebx+INODE.linksCount]
@@:
pop ebx edx
.ret:
pop edi
ret
 
findInode:
2161,16 → 2144,12
ext_Delete:
call extfsWritingInit
call findInode
mov ebx, esi
push eax
jc .ret
pop eax
lea edx, [ebp+EXTFS.inodeBuffer]
movzx edx, [edx+INODE.accessMode]
and edx, TYPE_MASK
cmp edx, DIRECTORY
jc .error
push ecx
movzx edi, [ebp+EXTFS.inodeBuffer.accessMode]
and edi, TYPE_MASK
cmp edi, DIRECTORY
jne .file
push ebx ecx edx
xor ecx, ecx
.checkDirectory:
push ecx
2178,25 → 2157,28
jc .empty
mov ebx, [ebp+EXTFS.tempBlockBuffer]
call extfsReadBlock
jc .not_empty_eax
jc .error8
mov edx, ebx
add edx, [ebp+EXTFS.bytesPerBlock]
movzx ecx, [ebx+DIRENTRY.entryLength]
add ebx, ecx
.dir_entry:
cmp byte [ebx+DIRENTRY.nameLength], 1
jne @f
cmp byte [ebx+DIRENTRY.name], '.'
jne .not_empty
movzx ecx, [ebx+DIRENTRY.nameLength]
mov ax, word [ebx+DIRENTRY.name]
jecxz @f
cmp al, '.'
jnz .not_empty
dec ecx
jz @f
cmp al, ah
jnz .not_empty
dec ecx
jnz .not_empty
@@:
cmp byte [ebx+DIRENTRY.nameLength], 2
jne .not_empty
cmp word [ebx+DIRENTRY.name], '..'
jne .not_empty
movzx ecx, [ebx+DIRENTRY.entryLength]
mov cx, [ebx+DIRENTRY.entryLength]
jecxz @f
add ebx, ecx
cmp ebx, edx
jb .dir_entry
@@:
pop ecx
inc ecx
jmp .checkDirectory
2203,35 → 2185,42
 
.not_empty:
pop eax eax
.error_stack8:
pop eax eax
push ERROR_ACCESS_DENIED
jmp .ret
 
.error8:
pop ebx
.error4:
pop ebx
.error:
push eax
jmp .ret
 
.empty:
pop ecx ecx
cmp eax, ERROR_END_OF_FILE
jnz .not_empty_eax
pop edx edx ecx ebx
jnz .error
push ecx
.file:
mov eax, ecx
push ebx ecx
call unlinkInode
cmp eax, -1
je .error_stack8
pop ebx
test eax, eax
jc .error4
pop eax
lea ebx, [ebp+EXTFS.inodeBuffer]
cmp edi, DIRECTORY
jnz @f
dec [ebx+INODE.linksCount]
call writeInode
@@:
mov eax, esi
call readInode
jc .error
dec [ebx+INODE.linksCount]
jz @f
xor eax, eax
cmp edx, DIRECTORY
jnz .error_stack4_eax ; hardlinks
mov eax, [esp]
call unlinkInode
cmp edi, DIRECTORY
jnz .hardlinks
@@:
mov eax, [esp]
lea ebx, [ebp+EXTFS.inodeBuffer]
call readInode
jc .error_stack4_eax
push edx
push esi edi
xor eax, eax
xor edx, edx
call extfsTruncateFile ; free file's data
2241,13 → 2230,10
push edi
rep stosb
call fsGetTime
pop ebx ecx
pop ebx edi esi
add eax, 978307200
mov [ebx+INODE.deletedTime], eax
mov eax, [esp]
call writeInode
jc .error_stack4_eax
pop eax
mov eax, esi
dec eax
xor edx, edx
div [ebp+EXTFS.superblock.inodesPerGroup]
2255,7 → 2241,7
mov ebx, [ebp+EXTFS.descriptorTable]
shl eax, 5
add ebx, eax
cmp ecx, DIRECTORY
cmp edi, DIRECTORY
jnz @f
dec [ebx+BGDESCR.directoriesCount]
@@:
2266,9 → 2252,9
mov ebx, [ebp+EXTFS.tempBlockBuffer]
mov ecx, eax
call extfsReadBlock
jc .error_stack4_eax
pop eax
mov edx, eax
pop edx
jc .error
mov eax, edx
and edx, 31
shr eax, 5
shl eax, 2
2277,8 → 2263,11
mov eax, ecx
call extfsWriteBlock
inc [ebp+EXTFS.superblock.inodesFree]
.hardlinks:
mov eax, esi
lea ebx, [ebp+EXTFS.inodeBuffer]
call writeInode
push eax
.disk_sync:
call writeSuperblock
mov esi, [ebp+PARTITION.Disk]
call disk_sync
2288,13 → 2277,6
pop eax
ret
 
.not_empty_eax:
add esp, 12
.error_stack4_eax:
pop ebx
push eax
jmp .disk_sync
 
;----------------------------------------------------------------
ext_CreateFolder:
call extfsWritingInit