Now has a special case if the length read or written is 0 - because in this
case, the read/write must not fail, even if there is no block_run at the specified position. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@9520 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -362,17 +362,16 @@ template<class Cache>
|
|||||||
status_t
|
status_t
|
||||||
Stream<Cache>::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
Stream<Cache>::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
||||||
{
|
{
|
||||||
// set/check boundaries for pos/length
|
size_t length = *_length;
|
||||||
|
|
||||||
|
// set/check boundaries for pos/length
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
if (pos >= Node()->data.Size()) {
|
if (pos >= Node()->data.Size() || length == 0) {
|
||||||
*_length = 0;
|
*_length = 0;
|
||||||
return B_NO_ERROR;
|
return B_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t length = *_length;
|
|
||||||
|
|
||||||
if (pos + length > Node()->data.Size())
|
if (pos + length > Node()->data.Size())
|
||||||
length = Node()->data.Size() - pos;
|
length = Node()->data.Size() - pos;
|
||||||
|
|
||||||
@@ -477,7 +476,7 @@ Stream<Cache>::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
*_length = bytesRead;
|
*_length = bytesRead;
|
||||||
return B_NO_ERROR;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -490,6 +489,7 @@ Stream<Cache>::WriteAt(Transaction *transaction, off_t pos, const uint8 *buffer,
|
|||||||
// set/check boundaries for pos/length
|
// set/check boundaries for pos/length
|
||||||
if (pos < 0)
|
if (pos < 0)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
if (pos + length > Size()) {
|
if (pos + length > Size()) {
|
||||||
off_t oldSize = Size();
|
off_t oldSize = Size();
|
||||||
|
|
||||||
@@ -517,6 +517,11 @@ Stream<Cache>::WriteAt(Transaction *transaction, off_t pos, const uint8 *buffer,
|
|||||||
FillGapWithZeros(oldSize, pos);
|
FillGapWithZeros(oldSize, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If we don't want to write anything, we can now return (we may
|
||||||
|
// just have changed the file size using the position parameter)
|
||||||
|
if (length == 0)
|
||||||
|
return B_OK;
|
||||||
|
|
||||||
block_run run;
|
block_run run;
|
||||||
off_t offset;
|
off_t offset;
|
||||||
if (FindBlockRun(pos, run, offset) < B_OK) {
|
if (FindBlockRun(pos, run, offset) < B_OK) {
|
||||||
@@ -626,6 +631,6 @@ Stream<Cache>::WriteAt(Transaction *transaction, off_t pos, const uint8 *buffer,
|
|||||||
|
|
||||||
*_length = bytesWritten;
|
*_length = bytesWritten;
|
||||||
|
|
||||||
return B_NO_ERROR;
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user