ANDROID: Incremental fs: Fix create_file performance

incfs only syncs at createfile time. This was making createfile take
a very long time. It also appears to offer little actual value -
whether we flush or no, if the device crashes the header will be
partial.

Bug: 15356649
Test: incfs_test passes, createfile takes less than half the time
Change-Id: I8f1fa138226868ebfb4a6a41254444af453070c8
Signed-off-by: Paul Lawrence <paullawrence@google.com>
(cherry picked from commit 4cc78c93ada6d0d8744c5b1ae12fddb50ea6a620)
This commit is contained in:
Paul Lawrence 2020-04-07 14:46:13 -07:00 committed by Alistair Delva
parent 2ca600cbe0
commit 298fe8e641

View file

@ -94,7 +94,6 @@ static int append_zeros(struct backing_file_context *bfc, size_t len)
{
loff_t file_size = 0;
loff_t new_last_byte_offset = 0;
int res = 0;
if (!bfc)
return -EFAULT;
@ -111,28 +110,18 @@ static int append_zeros(struct backing_file_context *bfc, size_t len)
*/
file_size = incfs_get_end_offset(bfc->bc_file);
new_last_byte_offset = file_size + len - 1;
res = vfs_fallocate(bfc->bc_file, 0, new_last_byte_offset, 1);
if (res)
return res;
res = vfs_fsync_range(bfc->bc_file, file_size, file_size + len, 1);
return res;
return vfs_fallocate(bfc->bc_file, 0, new_last_byte_offset, 1);
}
static int write_to_bf(struct backing_file_context *bfc, const void *buf,
size_t count, loff_t pos, bool sync)
size_t count, loff_t pos)
{
ssize_t res = 0;
ssize_t res = incfs_kwrite(bfc->bc_file, buf, count, pos);
res = incfs_kwrite(bfc->bc_file, buf, count, pos);
if (res < 0)
return res;
if (res != count)
return -EIO;
if (sync)
return vfs_fsync_range(bfc->bc_file, pos, pos + count, 1);
return 0;
}
@ -186,7 +175,7 @@ static int append_md_to_backing_file(struct backing_file_context *bfc,
/* Write the metadata record to the end of the backing file */
record_offset = file_pos;
new_md_offset = cpu_to_le64(record_offset);
result = write_to_bf(bfc, record, record_size, file_pos, true);
result = write_to_bf(bfc, record, record_size, file_pos);
if (result)
return result;
@ -207,7 +196,7 @@ static int append_md_to_backing_file(struct backing_file_context *bfc,
fh_first_md_offset);
}
result = write_to_bf(bfc, &new_md_offset, sizeof(new_md_offset),
file_pos, true);
file_pos);
if (result)
return result;
@ -222,8 +211,7 @@ int incfs_write_file_header_flags(struct backing_file_context *bfc, u32 flags)
return write_to_bf(bfc, &flags, sizeof(flags),
offsetof(struct incfs_file_header,
fh_file_header_flags),
false);
fh_file_header_flags));
}
/*
@ -292,7 +280,7 @@ int incfs_write_file_attr_to_backing_file(struct backing_file_context *bfc,
file_attr.fa_offset = cpu_to_le64(value_offset);
file_attr.fa_crc = cpu_to_le32(crc);
result = write_to_bf(bfc, value.data, value.len, value_offset, true);
result = write_to_bf(bfc, value.data, value.len, value_offset);
if (result)
return result;
@ -332,7 +320,7 @@ int incfs_write_signature_to_backing_file(struct backing_file_context *bfc,
sg.sg_sig_size = cpu_to_le32(sig.len);
sg.sg_sig_offset = cpu_to_le64(pos);
result = write_to_bf(bfc, sig.data, sig.len, pos, false);
result = write_to_bf(bfc, sig.data, sig.len, pos);
if (result)
goto err;
}
@ -365,10 +353,9 @@ int incfs_write_signature_to_backing_file(struct backing_file_context *bfc,
/* Write a hash tree metadata record pointing to the hash tree above. */
result = append_md_to_backing_file(bfc, &sg.sg_header);
err:
if (result) {
if (result)
/* Error, rollback file changes */
truncate_backing_file(bfc, rollback_pos);
}
return result;
}
@ -402,7 +389,7 @@ int incfs_write_fh_to_backing_file(struct backing_file_context *bfc,
if (file_pos != 0)
return -EEXIST;
return write_to_bf(bfc, &fh, sizeof(fh), file_pos, true);
return write_to_bf(bfc, &fh, sizeof(fh), file_pos);
}
/* Write a given data block and update file's blockmap to point it. */
@ -431,7 +418,7 @@ int incfs_write_data_block_to_backing_file(struct backing_file_context *bfc,
}
/* Write the block data at the end of the backing file. */
result = write_to_bf(bfc, block.data, block.len, data_offset, false);
result = write_to_bf(bfc, block.data, block.len, data_offset);
if (result)
return result;
@ -441,9 +428,8 @@ int incfs_write_data_block_to_backing_file(struct backing_file_context *bfc,
bm_entry.me_data_size = cpu_to_le16((u16)block.len);
bm_entry.me_flags = cpu_to_le16(flags);
result = write_to_bf(bfc, &bm_entry, sizeof(bm_entry),
bm_entry_off, false);
return result;
return write_to_bf(bfc, &bm_entry, sizeof(bm_entry),
bm_entry_off);
}
int incfs_write_hash_block_to_backing_file(struct backing_file_context *bfc,
@ -474,7 +460,7 @@ int incfs_write_hash_block_to_backing_file(struct backing_file_context *bfc,
return -EINVAL;
}
result = write_to_bf(bfc, block.data, block.len, data_offset, false);
result = write_to_bf(bfc, block.data, block.len, data_offset);
if (result)
return result;
@ -483,8 +469,7 @@ int incfs_write_hash_block_to_backing_file(struct backing_file_context *bfc,
bm_entry.me_data_size = cpu_to_le16(INCFS_DATA_FILE_BLOCK_SIZE);
bm_entry.me_flags = cpu_to_le16(INCFS_BLOCK_HASH);
return write_to_bf(bfc, &bm_entry, sizeof(bm_entry), bm_entry_off,
false);
return write_to_bf(bfc, &bm_entry, sizeof(bm_entry), bm_entry_off);
}
/* Initialize a new image in a given backing file. */