Nice if an experienced problem matches a bug in the implementation that
closely: Inode::WriteAt() didn't call Inode::WriteBack() in case the file size was enlarged - it was only written in case the file was closed which a) could have not happened because of a crash, and b) would move the change into the wrong transaction, and could therefore result in an incorrect update, as seen. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@15094 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
2b028fcaa0
commit
7df07b24d3
@ -1190,8 +1190,6 @@ Inode::ReadAt(off_t pos, uint8 *buffer, size_t *_length)
|
|||||||
status_t
|
status_t
|
||||||
Inode::WriteAt(Transaction &transaction, off_t pos, const uint8 *buffer, size_t *_length)
|
Inode::WriteAt(Transaction &transaction, off_t pos, const uint8 *buffer, size_t *_length)
|
||||||
{
|
{
|
||||||
// call the right WriteAt() method, depending on the inode flags
|
|
||||||
|
|
||||||
// update the last modification time in memory, it will be written
|
// update the last modification time in memory, it will be written
|
||||||
// back to the inode, and the index when the file is closed
|
// back to the inode, and the index when the file is closed
|
||||||
// ToDo: should update the internal last modified time only at this point!
|
// ToDo: should update the internal last modified time only at this point!
|
||||||
@ -1229,6 +1227,13 @@ Inode::WriteAt(Transaction &transaction, off_t pos, const uint8 *buffer, size_t
|
|||||||
// have to fill the gap between that position and the old file
|
// have to fill the gap between that position and the old file
|
||||||
// size with zeros.
|
// size with zeros.
|
||||||
FillGapWithZeros(oldSize, pos);
|
FillGapWithZeros(oldSize, pos);
|
||||||
|
|
||||||
|
// we need to write back the inode here because it has to
|
||||||
|
// go into this transaction (we cannot wait until the file
|
||||||
|
// is closed)
|
||||||
|
status = WriteBack(transaction);
|
||||||
|
if (status < B_OK)
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If we don't want to write anything, we can now return (we may
|
// If we don't want to write anything, we can now return (we may
|
||||||
@ -1837,8 +1842,7 @@ Inode::SetFileSize(Transaction &transaction, off_t size)
|
|||||||
// fails, so we should shrink the stream to its former size
|
// fails, so we should shrink the stream to its former size
|
||||||
ShrinkStream(transaction, oldSize);
|
ShrinkStream(transaction, oldSize);
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
status = ShrinkStream(transaction, size);
|
status = ShrinkStream(transaction, size);
|
||||||
|
|
||||||
if (status < B_OK)
|
if (status < B_OK)
|
||||||
|
Loading…
Reference in New Issue
Block a user