forked from KolibriOS/kolibrios
small fix
git-svn-id: svn://kolibrios.org@4465 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
5fd1f58066
commit
01f77003a9
@ -258,7 +258,25 @@ end virtual
|
|||||||
call cache_lookup_write
|
call cache_lookup_write
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jnz .cache_error
|
jnz .cache_error
|
||||||
; 12d. For each sector, copy data, mark the item as not-modified copy of the disk,
|
; 12d. If the sector was already present in the cache as modified,
|
||||||
|
; data that were read at step 10 for this sector are obsolete,
|
||||||
|
; so rewrite data for the caller from the cache.
|
||||||
|
cmp [esi+CACHE_ITEM.Status], CACHE_ITEM_MODIFIED
|
||||||
|
jnz .not_modified
|
||||||
|
mov esi, ecx
|
||||||
|
shl esi, 9
|
||||||
|
add esi, [ebx+DISKCACHE.data]
|
||||||
|
mov edi, [esp+4]
|
||||||
|
mov ecx, [esp]
|
||||||
|
shl ecx, 9-2
|
||||||
|
sub edi, ecx
|
||||||
|
mov ecx, 512/4
|
||||||
|
rep movsd
|
||||||
|
add [.current_buffer+8], 512
|
||||||
|
jmp .sector_done
|
||||||
|
.not_modified:
|
||||||
|
; 12e. For each not-modified sector,
|
||||||
|
; copy data, mark the item as not-modified copy of the disk,
|
||||||
; advance .current_buffer and .sector_hi:.sector_lo to the next sector.
|
; advance .current_buffer and .sector_hi:.sector_lo to the next sector.
|
||||||
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_COPY
|
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_COPY
|
||||||
mov esi, [.current_buffer+8]
|
mov esi, [.current_buffer+8]
|
||||||
@ -268,16 +286,17 @@ end virtual
|
|||||||
mov ecx, 512/4
|
mov ecx, 512/4
|
||||||
rep movsd
|
rep movsd
|
||||||
mov [.current_buffer+8], esi
|
mov [.current_buffer+8], esi
|
||||||
|
.sector_done:
|
||||||
add [.sector_lo+.local_vars2_size+8], 1
|
add [.sector_lo+.local_vars2_size+8], 1
|
||||||
adc [.sector_hi+.local_vars2_size+8], 0
|
adc [.sector_hi+.local_vars2_size+8], 0
|
||||||
; 12e. Continue the loop 12c-12d until all sectors are read.
|
; 12f. Continue the loop 12c-12e until all sectors are read.
|
||||||
dec dword [esp]
|
dec dword [esp]
|
||||||
jnz .store_to_cache
|
jnz .store_to_cache
|
||||||
.cache_error:
|
.cache_error:
|
||||||
; 12f. Restore after the loop: pop the local variable and restore edi.
|
; 12g. Restore after the loop: pop the local variable and restore edi.
|
||||||
pop ecx
|
pop ecx
|
||||||
pop edi
|
pop edi
|
||||||
; 12g. Release the lock.
|
; 12h. Release the lock.
|
||||||
mov ecx, [ebp+PARTITION.Disk]
|
mov ecx, [ebp+PARTITION.Disk]
|
||||||
add ecx, DISK.CacheLock
|
add ecx, DISK.CacheLock
|
||||||
call mutex_unlock
|
call mutex_unlock
|
||||||
@ -651,7 +670,13 @@ end virtual
|
|||||||
call cache_lookup_write
|
call cache_lookup_write
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jnz .cache_error
|
jnz .cache_error
|
||||||
; 11c. For each sector, copy data, mark the item as not-modified copy of the disk,
|
; 11c. Ignore sectors marked as modified: for them the cache is more recent that disk data.
|
||||||
|
cmp [esi+CACHE_ITEM.Status], CACHE_ITEM_MODIFIED
|
||||||
|
jnz .not_modified
|
||||||
|
add [.current_buffer], 512
|
||||||
|
jmp .sector_done
|
||||||
|
.not_modified:
|
||||||
|
; 11d. For each sector, copy data, mark the item as not-modified copy of the disk,
|
||||||
; advance .current_buffer and .sector_hi:.sector_lo to the next sector.
|
; advance .current_buffer and .sector_hi:.sector_lo to the next sector.
|
||||||
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_COPY
|
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_COPY
|
||||||
mov esi, [.current_buffer]
|
mov esi, [.current_buffer]
|
||||||
@ -661,13 +686,14 @@ end virtual
|
|||||||
mov ecx, 512/4
|
mov ecx, 512/4
|
||||||
rep movsd
|
rep movsd
|
||||||
mov [.current_buffer], esi
|
mov [.current_buffer], esi
|
||||||
|
.sector_done:
|
||||||
add [.sector_lo+.local_vars2_size], 1
|
add [.sector_lo+.local_vars2_size], 1
|
||||||
adc [.sector_hi+.local_vars2_size], 0
|
adc [.sector_hi+.local_vars2_size], 0
|
||||||
; 11d. Continue the loop at 11b-11c until all sectors are processed.
|
; 11e. Continue the loop at 11b-11d until all sectors are processed.
|
||||||
dec [.num_sectors]
|
dec [.num_sectors]
|
||||||
jnz .store_to_cache
|
jnz .store_to_cache
|
||||||
.cache_error:
|
.cache_error:
|
||||||
; 11e. Release the lock.
|
; 11f. Release the lock.
|
||||||
mov ecx, [ebp+PARTITION.Disk]
|
mov ecx, [ebp+PARTITION.Disk]
|
||||||
add ecx, DISK.CacheLock
|
add ecx, DISK.CacheLock
|
||||||
call mutex_unlock
|
call mutex_unlock
|
||||||
@ -695,11 +721,9 @@ end virtual
|
|||||||
call cache_lookup_write
|
call cache_lookup_write
|
||||||
test eax, eax
|
test eax, eax
|
||||||
jnz .floppy_cache_error
|
jnz .floppy_cache_error
|
||||||
; 14. Mark the item as empty for the case of read error.
|
|
||||||
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_EMPTY
|
|
||||||
push ecx
|
push ecx
|
||||||
|
|
||||||
; 15. Call the driver to read one sector.
|
; 14. Call the driver to read one sector.
|
||||||
push 1
|
push 1
|
||||||
push esp
|
push esp
|
||||||
push edx
|
push edx
|
||||||
@ -713,7 +737,7 @@ end virtual
|
|||||||
pop ecx
|
pop ecx
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz .floppy_read_error
|
jnz .floppy_read_error
|
||||||
; 16. Get the slot and pointer to the cache item,
|
; 15. Get the slot and pointer to the cache item,
|
||||||
; change the status to not-modified copy of the disk
|
; change the status to not-modified copy of the disk
|
||||||
; and go to 4c.
|
; and go to 4c.
|
||||||
pop ecx
|
pop ecx
|
||||||
@ -723,7 +747,7 @@ end virtual
|
|||||||
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_COPY
|
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_COPY
|
||||||
jmp .found_in_cache
|
jmp .found_in_cache
|
||||||
|
|
||||||
; On error at steps 13-15, release the lock
|
; On error at steps 13-14, release the lock
|
||||||
; and pass the error to the caller.
|
; and pass the error to the caller.
|
||||||
.floppy_read_error:
|
.floppy_read_error:
|
||||||
pop ecx
|
pop ecx
|
||||||
@ -849,6 +873,7 @@ proc cache_lookup_write
|
|||||||
mov [ebx+DISKCACHE.search_start], ecx
|
mov [ebx+DISKCACHE.search_start], ecx
|
||||||
popd [esi+CACHE_ITEM.SectorLo]
|
popd [esi+CACHE_ITEM.SectorLo]
|
||||||
popd [esi+CACHE_ITEM.SectorHi]
|
popd [esi+CACHE_ITEM.SectorHi]
|
||||||
|
mov [esi+CACHE_ITEM.Status], CACHE_ITEM_EMPTY
|
||||||
.return0:
|
.return0:
|
||||||
xor eax, eax ; success
|
xor eax, eax ; success
|
||||||
ret
|
ret
|
||||||
|
Loading…
Reference in New Issue
Block a user