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 file_size = 0;
loff_t new_last_byte_offset = 0; loff_t new_last_byte_offset = 0;
int res = 0;
if (!bfc) if (!bfc)
return -EFAULT; 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); file_size = incfs_get_end_offset(bfc->bc_file);
new_last_byte_offset = file_size + len - 1; new_last_byte_offset = file_size + len - 1;
res = vfs_fallocate(bfc->bc_file, 0, new_last_byte_offset, 1); return 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;
} }
static int write_to_bf(struct backing_file_context *bfc, const void *buf, 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) if (res < 0)
return res; return res;
if (res != count) if (res != count)
return -EIO; return -EIO;
if (sync)
return vfs_fsync_range(bfc->bc_file, pos, pos + count, 1);
return 0; 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 */ /* Write the metadata record to the end of the backing file */
record_offset = file_pos; record_offset = file_pos;
new_md_offset = cpu_to_le64(record_offset); 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) if (result)
return result; return result;
@ -207,7 +196,7 @@ static int append_md_to_backing_file(struct backing_file_context *bfc,
fh_first_md_offset); fh_first_md_offset);
} }
result = write_to_bf(bfc, &new_md_offset, sizeof(new_md_offset), result = write_to_bf(bfc, &new_md_offset, sizeof(new_md_offset),
file_pos, true); file_pos);
if (result) if (result)
return 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), return write_to_bf(bfc, &flags, sizeof(flags),
offsetof(struct incfs_file_header, offsetof(struct incfs_file_header,
fh_file_header_flags), fh_file_header_flags));
false);
} }
/* /*
@ -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_offset = cpu_to_le64(value_offset);
file_attr.fa_crc = cpu_to_le32(crc); 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) if (result)
return 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_size = cpu_to_le32(sig.len);
sg.sg_sig_offset = cpu_to_le64(pos); 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) if (result)
goto err; 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. */ /* Write a hash tree metadata record pointing to the hash tree above. */
result = append_md_to_backing_file(bfc, &sg.sg_header); result = append_md_to_backing_file(bfc, &sg.sg_header);
err: err:
if (result) { if (result)
/* Error, rollback file changes */ /* Error, rollback file changes */
truncate_backing_file(bfc, rollback_pos); truncate_backing_file(bfc, rollback_pos);
}
return result; return result;
} }
@ -402,7 +389,7 @@ int incfs_write_fh_to_backing_file(struct backing_file_context *bfc,
if (file_pos != 0) if (file_pos != 0)
return -EEXIST; 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. */ /* 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. */ /* 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) if (result)
return 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_data_size = cpu_to_le16((u16)block.len);
bm_entry.me_flags = cpu_to_le16(flags); bm_entry.me_flags = cpu_to_le16(flags);
result = write_to_bf(bfc, &bm_entry, sizeof(bm_entry), return write_to_bf(bfc, &bm_entry, sizeof(bm_entry),
bm_entry_off, false); bm_entry_off);
return result;
} }
int incfs_write_hash_block_to_backing_file(struct backing_file_context *bfc, 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; 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) if (result)
return 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_data_size = cpu_to_le16(INCFS_DATA_FILE_BLOCK_SIZE);
bm_entry.me_flags = cpu_to_le16(INCFS_BLOCK_HASH); bm_entry.me_flags = cpu_to_le16(INCFS_BLOCK_HASH);
return write_to_bf(bfc, &bm_entry, sizeof(bm_entry), bm_entry_off, return write_to_bf(bfc, &bm_entry, sizeof(bm_entry), bm_entry_off);
false);
} }
/* Initialize a new image in a given backing file. */ /* Initialize a new image in a given backing file. */