block: Unlink temporary files in raw-posix/win32
Instead of having unlink() calls in the generic block layer, where we aren't even guarateed to have a file name, move them to those block drivers that are actually used and that always have a filename. Gets us rid of some #ifdefs as well. The patch also converts bs->is_temporary to a new BDRV_O_TEMPORARY open flag so that it is inherited in the protocol layer and the raw-posix and raw-win32 drivers can unlink the file. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
5669b44de5
commit
8bfea15dda
36
block.c
36
block.c
|
@ -808,7 +808,7 @@ static int bdrv_backing_flags(int flags)
|
||||||
flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
|
flags &= ~(BDRV_O_RDWR | BDRV_O_COPY_ON_READ);
|
||||||
|
|
||||||
/* snapshot=on is handled on the top layer */
|
/* snapshot=on is handled on the top layer */
|
||||||
flags &= ~BDRV_O_SNAPSHOT;
|
flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_TEMPORARY);
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
@ -831,7 +831,7 @@ static int bdrv_open_flags(BlockDriverState *bs, int flags)
|
||||||
/*
|
/*
|
||||||
* Snapshots should be writable.
|
* Snapshots should be writable.
|
||||||
*/
|
*/
|
||||||
if (bs->is_temporary) {
|
if (flags & BDRV_O_TEMPORARY) {
|
||||||
open_flags |= BDRV_O_RDWR;
|
open_flags |= BDRV_O_RDWR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -990,13 +990,6 @@ static int bdrv_open_common(BlockDriverState *bs, BlockDriverState *file,
|
||||||
bdrv_refresh_limits(bs);
|
bdrv_refresh_limits(bs);
|
||||||
assert(bdrv_opt_mem_align(bs) != 0);
|
assert(bdrv_opt_mem_align(bs) != 0);
|
||||||
assert((bs->request_alignment != 0) || bs->sg);
|
assert((bs->request_alignment != 0) || bs->sg);
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
if (bs->is_temporary) {
|
|
||||||
assert(bs->filename[0] != '\0');
|
|
||||||
unlink(bs->filename);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
free_and_fail:
|
free_and_fail:
|
||||||
|
@ -1267,10 +1260,10 @@ void bdrv_append_temp_snapshot(BlockDriverState *bs, Error **errp)
|
||||||
qstring_from_str(tmp_filename));
|
qstring_from_str(tmp_filename));
|
||||||
|
|
||||||
bs_snapshot = bdrv_new("", &error_abort);
|
bs_snapshot = bdrv_new("", &error_abort);
|
||||||
bs_snapshot->is_temporary = 1;
|
|
||||||
|
|
||||||
ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
|
ret = bdrv_open(&bs_snapshot, NULL, NULL, snapshot_options,
|
||||||
bs->open_flags & ~BDRV_O_SNAPSHOT, bdrv_qcow2, &local_err);
|
(bs->open_flags & ~BDRV_O_SNAPSHOT) | BDRV_O_TEMPORARY,
|
||||||
|
bdrv_qcow2, &local_err);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
goto out;
|
goto out;
|
||||||
|
@ -1371,7 +1364,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
|
||||||
bdrv_inherited_flags(flags),
|
bdrv_inherited_flags(flags),
|
||||||
true, &local_err);
|
true, &local_err);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto unlink_and_fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find the right image format driver */
|
/* Find the right image format driver */
|
||||||
|
@ -1382,7 +1375,7 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
|
||||||
if (!drv) {
|
if (!drv) {
|
||||||
error_setg(errp, "Invalid driver: '%s'", drvname);
|
error_setg(errp, "Invalid driver: '%s'", drvname);
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto unlink_and_fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1392,18 +1385,18 @@ int bdrv_open(BlockDriverState **pbs, const char *filename,
|
||||||
} else {
|
} else {
|
||||||
error_setg(errp, "Must specify either driver or file");
|
error_setg(errp, "Must specify either driver or file");
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto unlink_and_fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!drv) {
|
if (!drv) {
|
||||||
goto unlink_and_fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open the image */
|
/* Open the image */
|
||||||
ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
|
ret = bdrv_open_common(bs, file, options, flags, drv, &local_err);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto unlink_and_fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file && (bs->file != file)) {
|
if (file && (bs->file != file)) {
|
||||||
|
@ -1465,14 +1458,10 @@ done:
|
||||||
*pbs = bs;
|
*pbs = bs;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
unlink_and_fail:
|
fail:
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
bdrv_unref(file);
|
bdrv_unref(file);
|
||||||
}
|
}
|
||||||
if (bs->is_temporary) {
|
|
||||||
unlink(filename);
|
|
||||||
}
|
|
||||||
fail:
|
|
||||||
QDECREF(bs->options);
|
QDECREF(bs->options);
|
||||||
QDECREF(options);
|
QDECREF(options);
|
||||||
bs->options = NULL;
|
bs->options = NULL;
|
||||||
|
@ -1752,11 +1741,6 @@ void bdrv_close(BlockDriverState *bs)
|
||||||
}
|
}
|
||||||
bs->drv->bdrv_close(bs);
|
bs->drv->bdrv_close(bs);
|
||||||
g_free(bs->opaque);
|
g_free(bs->opaque);
|
||||||
#ifdef _WIN32
|
|
||||||
if (bs->is_temporary) {
|
|
||||||
unlink(bs->filename);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
bs->opaque = NULL;
|
bs->opaque = NULL;
|
||||||
bs->drv = NULL;
|
bs->drv = NULL;
|
||||||
bs->copy_on_read = 0;
|
bs->copy_on_read = 0;
|
||||||
|
|
|
@ -366,7 +366,7 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
QemuOpts *opts;
|
QemuOpts *opts;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
const char *filename;
|
const char *filename = NULL;
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
|
|
||||||
|
@ -446,6 +446,9 @@ static int raw_open_common(BlockDriverState *bs, QDict *options,
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
fail:
|
fail:
|
||||||
|
if (filename && (bdrv_flags & BDRV_O_TEMPORARY)) {
|
||||||
|
unlink(filename);
|
||||||
|
}
|
||||||
qemu_opts_del(opts);
|
qemu_opts_del(opts);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -390,6 +390,9 @@ static void raw_close(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
BDRVRawState *s = bs->opaque;
|
BDRVRawState *s = bs->opaque;
|
||||||
CloseHandle(s->hfile);
|
CloseHandle(s->hfile);
|
||||||
|
if (bs->open_flags & BDRV_O_TEMPORARY) {
|
||||||
|
unlink(bs->filename);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int raw_truncate(BlockDriverState *bs, int64_t offset)
|
static int raw_truncate(BlockDriverState *bs, int64_t offset)
|
||||||
|
|
|
@ -92,6 +92,7 @@ typedef enum {
|
||||||
|
|
||||||
#define BDRV_O_RDWR 0x0002
|
#define BDRV_O_RDWR 0x0002
|
||||||
#define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */
|
#define BDRV_O_SNAPSHOT 0x0008 /* open the file read only and save writes in a snapshot */
|
||||||
|
#define BDRV_O_TEMPORARY 0x0010 /* delete the file after use */
|
||||||
#define BDRV_O_NOCACHE 0x0020 /* do not use the host page cache */
|
#define BDRV_O_NOCACHE 0x0020 /* do not use the host page cache */
|
||||||
#define BDRV_O_CACHE_WB 0x0040 /* use write-back caching */
|
#define BDRV_O_CACHE_WB 0x0040 /* use write-back caching */
|
||||||
#define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool */
|
#define BDRV_O_NATIVE_AIO 0x0080 /* use native AIO instead of the thread pool */
|
||||||
|
|
|
@ -299,7 +299,6 @@ struct BlockDriverState {
|
||||||
char backing_file[1024]; /* if non zero, the image is a diff of
|
char backing_file[1024]; /* if non zero, the image is a diff of
|
||||||
this file image */
|
this file image */
|
||||||
char backing_format[16]; /* if non-zero and backing_file exists */
|
char backing_format[16]; /* if non-zero and backing_file exists */
|
||||||
int is_temporary;
|
|
||||||
|
|
||||||
BlockDriverState *backing_hd;
|
BlockDriverState *backing_hd;
|
||||||
BlockDriverState *file;
|
BlockDriverState *file;
|
||||||
|
|
Loading…
Reference in New Issue