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:
parent
2ca600cbe0
commit
298fe8e641
1 changed files with 15 additions and 30 deletions
|
@ -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. */
|
||||||
|
|
Loading…
Reference in a new issue