mirror of https://gitee.com/openkylin/qemu.git
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
|
@ -2111,6 +2111,7 @@ static int coroutine_fn
|
||||||
raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||||
{
|
{
|
||||||
BlockdevCreateOptionsFile *file_opts;
|
BlockdevCreateOptionsFile *file_opts;
|
||||||
|
Error *local_err = NULL;
|
||||||
int fd;
|
int fd;
|
||||||
uint64_t perm, shared;
|
uint64_t perm, shared;
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
@ -2156,13 +2157,13 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||||
/* Step two: Check that nobody else has taken conflicting locks */
|
/* Step two: Check that nobody else has taken conflicting locks */
|
||||||
result = raw_check_lock_bytes(fd, perm, shared, errp);
|
result = raw_check_lock_bytes(fd, perm, shared, errp);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
goto out_close;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Clear the file by truncating it to 0 */
|
/* Clear the file by truncating it to 0 */
|
||||||
result = raw_regular_truncate(NULL, fd, 0, PREALLOC_MODE_OFF, errp);
|
result = raw_regular_truncate(NULL, fd, 0, PREALLOC_MODE_OFF, errp);
|
||||||
if (result < 0) {
|
if (result < 0) {
|
||||||
goto out_close;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file_opts->nocow) {
|
if (file_opts->nocow) {
|
||||||
|
@ -2185,7 +2186,17 @@ raw_co_create(BlockdevCreateOptions *options, Error **errp)
|
||||||
result = raw_regular_truncate(NULL, fd, file_opts->size,
|
result = raw_regular_truncate(NULL, fd, file_opts->size,
|
||||||
file_opts->preallocation, errp);
|
file_opts->preallocation, errp);
|
||||||
if (result < 0) {
|
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:
|
out_close:
|
||||||
|
|
Loading…
Reference in New Issue