[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 02/29] block/file-posix: File locking during creation
From: |
Max Reitz |
Subject: |
[Qemu-block] [PULL 02/29] block/file-posix: File locking during creation |
Date: |
Mon, 11 Jun 2018 16:25:44 +0200 |
When creating a file, we should take the WRITE and RESIZE permissions.
We do not need either for the creation itself, but we do need them for
clearing and resizing it. So we can take the proper permissions by
replacing O_TRUNC with an explicit truncation to 0, and by taking the
appropriate file locks between those two steps.
Signed-off-by: Max Reitz <address@hidden>
Message-id: address@hidden
Reviewed-by: Fam Zheng <address@hidden>
Signed-off-by: Max Reitz <address@hidden>
---
block/file-posix.c | 37 +++++++++++++++++++++++++++++++++++--
1 file changed, 35 insertions(+), 2 deletions(-)
diff --git a/block/file-posix.c b/block/file-posix.c
index 7583bbfbb3..07bb061fe4 100644
--- a/block/file-posix.c
+++ b/block/file-posix.c
@@ -2076,6 +2076,7 @@ static int raw_co_create(BlockdevCreateOptions *options,
Error **errp)
{
BlockdevCreateOptionsFile *file_opts;
int fd;
+ int perm, shared;
int result = 0;
/* Validate options and set default values */
@@ -2090,14 +2091,44 @@ static int raw_co_create(BlockdevCreateOptions
*options, Error **errp)
}
/* Create file */
- fd = qemu_open(file_opts->filename, O_RDWR | O_CREAT | O_TRUNC | O_BINARY,
- 0644);
+ fd = qemu_open(file_opts->filename, O_RDWR | O_CREAT | O_BINARY, 0644);
if (fd < 0) {
result = -errno;
error_setg_errno(errp, -result, "Could not create file");
goto out;
}
+ /* Take permissions: We want to discard everything, so we need
+ * BLK_PERM_WRITE; and truncation to the desired size requires
+ * BLK_PERM_RESIZE.
+ * On the other hand, we cannot share the RESIZE permission
+ * because we promise that after this function, the file has the
+ * size given in the options. If someone else were to resize it
+ * concurrently, we could not guarantee that.
+ * Note that after this function, we can no longer guarantee that
+ * the file is not touched by a third party, so it may be resized
+ * then. */
+ perm = BLK_PERM_WRITE | BLK_PERM_RESIZE;
+ shared = BLK_PERM_ALL & ~BLK_PERM_RESIZE;
+
+ /* Step one: Take locks */
+ result = raw_apply_lock_bytes(fd, perm, shared, false, errp);
+ if (result < 0) {
+ goto out_close;
+ }
+
+ /* Step two: Check that nobody else has taken conflicting locks */
+ result = raw_check_lock_bytes(fd, perm, shared, errp);
+ if (result < 0) {
+ goto out_close;
+ }
+
+ /* Clear the file by truncating it to 0 */
+ result = raw_regular_truncate(fd, 0, PREALLOC_MODE_OFF, errp);
+ if (result < 0) {
+ goto out_close;
+ }
+
if (file_opts->nocow) {
#ifdef __linux__
/* Set NOCOW flag to solve performance issue on fs like btrfs.
@@ -2113,6 +2144,8 @@ static int raw_co_create(BlockdevCreateOptions *options,
Error **errp)
#endif
}
+ /* Resize and potentially preallocate the file to the desired
+ * final size */
result = raw_regular_truncate(fd, file_opts->size,
file_opts->preallocation,
errp);
if (result < 0) {
--
2.17.1
- [Qemu-block] [PULL 00/29] Block patches, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 01/29] block/file-posix: Pass FD to locking helpers, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 02/29] block/file-posix: File locking during creation,
Max Reitz <=
- [Qemu-block] [PULL 04/29] qemu-img: Amendment support implies create_opts, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 03/29] iotests: Add creation test to 153, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 07/29] qemu-img: Add print_amend_option_help(), Max Reitz, 2018/06/11
- [Qemu-block] [PULL 05/29] block: Add Error parameter to bdrv_amend_options, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 06/29] qemu-option: Pull out "Supported options" print, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 09/29] iotests: Test help option for unsupporting formats, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 10/29] iotests: Rework 113, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 11/29] qcow2: Repair OFLAG_COPIED when fixing leaks, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 08/29] qemu-img: Recognize no creation support in -o help, Max Reitz, 2018/06/11
- [Qemu-block] [PULL 12/29] iotests: Repairing error during snapshot deletion, Max Reitz, 2018/06/11