mirror of
https://gitlab.com/qemu-project/qemu
synced 2024-11-05 20:35:44 +00:00
file-posix: Unlock FD after creation
Closing the FD does not necessarily mean that it is unlocked. Fix this by relinquishing all permission locks before qemu_close(). Reported-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
d815efcaf0
commit
7c20c808a5
1 changed files with 14 additions and 3 deletions
|
@ -2111,6 +2111,7 @@ static int coroutine_fn
|
|||
raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||
{
|
||||
BlockdevCreateOptionsFile *file_opts;
|
||||
Error *local_err = NULL;
|
||||
int fd;
|
||||
uint64_t perm, shared;
|
||||
int result = 0;
|
||||
|
@ -2156,13 +2157,13 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|||
/* 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;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/* Clear the file by truncating it to 0 */
|
||||
result = raw_regular_truncate(NULL, fd, 0, PREALLOC_MODE_OFF, errp);
|
||||
if (result < 0) {
|
||||
goto out_close;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (file_opts->nocow) {
|
||||
|
@ -2185,7 +2186,17 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
|||
result = raw_regular_truncate(NULL, fd, file_opts->size,
|
||||
file_opts->preallocation, errp);
|
||||
if (result < 0) {
|
||||
goto out_close;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
raw_apply_lock_bytes(fd, 0, 0, true, &local_err);
|
||||
if (local_err) {
|
||||
/* The above call should not fail, and if it does, that does
|
||||
* not mean the whole creation operation has failed. So
|
||||
* report it the user for their convenience, but do not report
|
||||
* it to the caller. */
|
||||
error_report_err(local_err);
|
||||
}
|
||||
|
||||
out_close:
|
||||
|
|
Loading…
Reference in a new issue