qemu-img info: show nocow info
Add nocow info in 'qemu-img info' output to show whether the file currently has NOCOW flag set or not. Signed-off-by: Chunyan Liu <cyliu@suse.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
c6ac36e145
commit
000c4dfff4
26
block/qapi.c
26
block/qapi.c
@ -28,6 +28,13 @@
|
|||||||
#include "qapi-visit.h"
|
#include "qapi-visit.h"
|
||||||
#include "qapi/qmp-output-visitor.h"
|
#include "qapi/qmp-output-visitor.h"
|
||||||
#include "qapi/qmp/types.h"
|
#include "qapi/qmp/types.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <linux/fs.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#ifndef FS_NOCOW_FL
|
||||||
|
#define FS_NOCOW_FL 0x00800000 /* Do not cow file */
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs)
|
BlockDeviceInfo *bdrv_block_device_info(BlockDriverState *bs)
|
||||||
{
|
{
|
||||||
@ -172,6 +179,9 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
|||||||
int ret;
|
int ret;
|
||||||
Error *err = NULL;
|
Error *err = NULL;
|
||||||
ImageInfo *info;
|
ImageInfo *info;
|
||||||
|
#ifdef __linux__
|
||||||
|
int fd, attr;
|
||||||
|
#endif
|
||||||
|
|
||||||
size = bdrv_getlength(bs);
|
size = bdrv_getlength(bs);
|
||||||
if (size < 0) {
|
if (size < 0) {
|
||||||
@ -201,6 +211,18 @@ void bdrv_query_image_info(BlockDriverState *bs,
|
|||||||
info->format_specific = bdrv_get_specific_info(bs);
|
info->format_specific = bdrv_get_specific_info(bs);
|
||||||
info->has_format_specific = info->format_specific != NULL;
|
info->has_format_specific = info->format_specific != NULL;
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
/* get NOCOW info */
|
||||||
|
fd = qemu_open(bs->filename, O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fd >= 0) {
|
||||||
|
if (ioctl(fd, FS_IOC_GETFLAGS, &attr) == 0 && (attr & FS_NOCOW_FL)) {
|
||||||
|
info->has_nocow = true;
|
||||||
|
info->nocow = true;
|
||||||
|
}
|
||||||
|
qemu_close(fd);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
backing_filename = bs->backing_file;
|
backing_filename = bs->backing_file;
|
||||||
if (backing_filename[0] != '\0') {
|
if (backing_filename[0] != '\0') {
|
||||||
info->backing_filename = g_strdup(backing_filename);
|
info->backing_filename = g_strdup(backing_filename);
|
||||||
@ -631,4 +653,8 @@ void bdrv_image_info_dump(fprintf_function func_fprintf, void *f,
|
|||||||
func_fprintf(f, "Format specific information:\n");
|
func_fprintf(f, "Format specific information:\n");
|
||||||
bdrv_image_info_specific_dump(func_fprintf, f, info->format_specific);
|
bdrv_image_info_specific_dump(func_fprintf, f, info->format_specific);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (info->has_nocow && info->nocow) {
|
||||||
|
func_fprintf(f, "NOCOW flag: set\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -115,6 +115,8 @@
|
|||||||
# @format-specific: #optional structure supplying additional format-specific
|
# @format-specific: #optional structure supplying additional format-specific
|
||||||
# information (since 1.7)
|
# information (since 1.7)
|
||||||
#
|
#
|
||||||
|
# @nocow: #optional info of whether NOCOW flag is set or not. (since 2.2)
|
||||||
|
#
|
||||||
# Since: 1.3
|
# Since: 1.3
|
||||||
#
|
#
|
||||||
##
|
##
|
||||||
@ -126,7 +128,8 @@
|
|||||||
'*backing-filename': 'str', '*full-backing-filename': 'str',
|
'*backing-filename': 'str', '*full-backing-filename': 'str',
|
||||||
'*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'],
|
'*backing-filename-format': 'str', '*snapshots': ['SnapshotInfo'],
|
||||||
'*backing-image': 'ImageInfo',
|
'*backing-image': 'ImageInfo',
|
||||||
'*format-specific': 'ImageInfoSpecific' } }
|
'*format-specific': 'ImageInfoSpecific',
|
||||||
|
'*nocow': 'bool' } }
|
||||||
|
|
||||||
##
|
##
|
||||||
# @ImageCheck:
|
# @ImageCheck:
|
||||||
|
Loading…
Reference in New Issue
Block a user