Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 298fe8e6 authored by Paul Lawrence's avatar Paul Lawrence Committed by Alistair Delva
Browse files

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: default avatarPaul Lawrence <paullawrence@google.com>
(cherry picked from commit 4cc78c93ada6d0d8744c5b1ae12fddb50ea6a620)
parent 2ca600cb
Loading
Loading
Loading
Loading
+15 −30
Original line number Diff line number Diff line
@@ -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. */