diff options
author | Kevin Wolf <kwolf@redhat.com> | 2014-04-11 21:29:52 +0200 |
---|---|---|
committer | Kevin Wolf <kwolf@redhat.com> | 2014-04-30 11:05:00 +0200 |
commit | 0b50cc885381fc6794590dbbb40665e32f9292f8 (patch) | |
tree | 4a5308890ef5cc2f8577fa583d080fca320e4eb8 /block.c | |
parent | cffb12051a26e5494ed009c99db7858b2aab7099 (diff) | |
download | qemu-0b50cc885381fc6794590dbbb40665e32f9292f8.zip |
block: Create bdrv_inherited_flags()
Instead of having bdrv_open_flags() as a function that creates flags for
several unrelated places and then adding open-coded flags on top, create
a new function that derives the flags for bs->file from the flags for bs.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 28 |
1 files changed, 26 insertions, 2 deletions
@@ -774,6 +774,30 @@ void bdrv_disable_copy_on_read(BlockDriverState *bs) bs->copy_on_read--; } +/* + * Returns the flags that bs->file should get, based on the given flags for + * the parent BDS + */ +static int bdrv_inherited_flags(int flags) +{ + /* Enable protocol handling, disable format probing for bs->file */ + flags |= BDRV_O_PROTOCOL; + + /* Our block drivers take care to send flushes and respect unmap policy, + * so we can enable both unconditionally on lower layers. */ + flags |= BDRV_O_CACHE_WB | BDRV_O_UNMAP; + + /* The backing file of a temporary snapshot is read-only */ + if (flags & BDRV_O_SNAPSHOT) { + flags &= ~BDRV_O_RDWR; + } + + /* Clear flags that only apply to the top layer */ + flags &= ~(BDRV_O_SNAPSHOT | BDRV_O_NO_BACKING); + + return flags; +} + static int bdrv_open_flags(BlockDriverState *bs, int flags) { int open_flags = flags | BDRV_O_CACHE_WB; @@ -1333,8 +1357,8 @@ int bdrv_open(BlockDriverState **pbs, const char *filename, assert(file == NULL); ret = bdrv_open_image(&file, filename, options, "file", - bdrv_open_flags(bs, flags | BDRV_O_UNMAP) | - BDRV_O_PROTOCOL, true, &local_err); + bdrv_inherited_flags(flags), + true, &local_err); if (ret < 0) { goto unlink_and_fail; } |