}
}
+/*
+ * Helper to update the tracked file size. If the offset begins beyond current
+ * EOF, zero the range from EOF to offset in the good buffer.
+ */
+void
+update_file_size(unsigned offset, unsigned size)
+{
+ if (offset > file_size)
+ memset(good_buf + file_size, '\0', offset - file_size);
+ file_size = offset + size;
+}
void
dowrite(unsigned offset, unsigned size)
log4(OP_WRITE, offset, size, FL_NONE);
gendata(original_buf, good_buf, offset, size);
- if (file_size < offset + size) {
- if (file_size < offset)
- memset(good_buf + file_size, '\0', offset - file_size);
- file_size = offset + size;
+ if (offset + size > file_size) {
+ update_file_size(offset, size);
if (lite) {
warn("Lite file size bug in fsx!");
report_failure(149);
log4(OP_MAPWRITE, offset, size, FL_NONE);
gendata(original_buf, good_buf, offset, size);
- if (file_size < offset + size) {
- if (file_size < offset)
- memset(good_buf + file_size, '\0', offset - file_size);
- file_size = offset + size;
+ if (offset + size > file_size) {
+ update_file_size(offset, size);
if (lite) {
warn("Lite file size bug in fsx!");
report_failure(200);
log4(OP_TRUNCATE, 0, size, FL_NONE);
- if (size > file_size)
- memset(good_buf + file_size, '\0', size - file_size);
- file_size = size;
+ update_file_size(size, 0);
if (testcalls <= simulatedopcount)
return;
log4(OP_ZERO_RANGE, offset, length,
keep_size ? FL_KEEP_SIZE : FL_NONE);
- if (!keep_size && end_offset > file_size) {
- /*
- * If there's a gap between the old file size and the offset of
- * the zero range operation, fill the gap with zeroes.
- */
- if (offset > file_size)
- memset(good_buf + file_size, '\0', offset - file_size);
-
- file_size = end_offset;
- }
+ if (!keep_size && end_offset > file_size)
+ update_file_size(offset, length);
if (testcalls <= simulatedopcount)
return;
log5(OP_CLONE_RANGE, offset, length, dest, FL_NONE);
- if (dest > file_size)
- memset(good_buf + file_size, '\0', dest - file_size);
if (dest + length > file_size)
- file_size = dest + length;
+ update_file_size(dest, length);
if (testcalls <= simulatedopcount)
return;
log5(OP_COPY_RANGE, offset, length, dest, FL_NONE);
- if (dest > file_size)
- memset(good_buf + file_size, '\0', dest - file_size);
if (dest + length > file_size)
- file_size = dest + length;
+ update_file_size(dest, length);
if (testcalls <= simulatedopcount)
return;
if (end_offset > file_size) {
memset(good_buf + file_size, '\0', end_offset - file_size);
- file_size = end_offset;
+ update_file_size(offset, length);
}
if (testcalls <= simulatedopcount)