This should finally nail #5415:
* Since the same block can be in up to two transactions, it's very well possible that one shouldn't write all transactions in a single run. * Forgot to pass on the iterator from BlockWriter::Add(transaction) to Add(block). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@35565 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
57c418cdd6
commit
9d071e27f1
33
src/system/kernel/cache/block_cache.cpp
vendored
33
src/system/kernel/cache/block_cache.cpp
vendored
@ -189,7 +189,8 @@ public:
|
|||||||
bool Add(cached_block* block,
|
bool Add(cached_block* block,
|
||||||
hash_iterator* iterator = NULL);
|
hash_iterator* iterator = NULL);
|
||||||
bool Add(cache_transaction* transaction,
|
bool Add(cache_transaction* transaction,
|
||||||
hash_iterator* iterator);
|
hash_iterator* iterator,
|
||||||
|
bool& hasLeftOvers);
|
||||||
|
|
||||||
status_t Write(hash_iterator* iterator = NULL,
|
status_t Write(hash_iterator* iterator = NULL,
|
||||||
bool canUnlock = true);
|
bool canUnlock = true);
|
||||||
@ -1083,16 +1084,27 @@ BlockWriter::Add(cached_block* block, hash_iterator* iterator)
|
|||||||
If no more blocks can be added, false is returned, otherwise true.
|
If no more blocks can be added, false is returned, otherwise true.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
BlockWriter::Add(cache_transaction* transaction, hash_iterator* iterator)
|
BlockWriter::Add(cache_transaction* transaction, hash_iterator* iterator,
|
||||||
|
bool& hasLeftOvers)
|
||||||
{
|
{
|
||||||
ASSERT(!transaction->open);
|
ASSERT(!transaction->open);
|
||||||
|
|
||||||
if (transaction->busy_writing_count != 0)
|
if (transaction->busy_writing_count != 0) {
|
||||||
|
hasLeftOvers = true;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
hasLeftOvers = false;
|
||||||
|
|
||||||
block_list::Iterator blockIterator = transaction->blocks.GetIterator();
|
block_list::Iterator blockIterator = transaction->blocks.GetIterator();
|
||||||
while (cached_block* block = blockIterator.Next()) {
|
while (cached_block* block = blockIterator.Next()) {
|
||||||
if (!Add(block))
|
if (!block->CanBeWritten()) {
|
||||||
|
// This block was already part of a previous transaction within this
|
||||||
|
// writer
|
||||||
|
hasLeftOvers = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!Add(block, iterator))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (DeletedTransaction())
|
if (DeletedTransaction())
|
||||||
@ -2491,7 +2503,9 @@ block_notifier_and_writer(void* /*data*/)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!writer.Add(transaction, &iterator))
|
bool hasLeftOvers;
|
||||||
|
// we ignore this one
|
||||||
|
if (!writer.Add(transaction, &iterator, hasLeftOvers))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2689,7 +2703,14 @@ cache_sync_transaction(void* _cache, int32 id)
|
|||||||
// write back all of their remaining dirty blocks
|
// write back all of their remaining dirty blocks
|
||||||
T(Action("sync", cache, transaction));
|
T(Action("sync", cache, transaction));
|
||||||
|
|
||||||
writer.Add(transaction, &iterator);
|
bool hasLeftOvers;
|
||||||
|
writer.Add(transaction, &iterator, hasLeftOvers);
|
||||||
|
|
||||||
|
if (hasLeftOvers) {
|
||||||
|
// This transaction contains blocks that a previous
|
||||||
|
// transaction is trying to write back in this write run
|
||||||
|
hadBusy = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user