7f1c5b
From 4af86458d6bea2a6e15fd57d4d4bbe88e35f7e72 Mon Sep 17 00:00:00 2001
7f1c5b
From: Hanna Reitz <hreitz@redhat.com>
7f1c5b
Date: Mon, 20 Jun 2022 18:26:54 +0200
7f1c5b
Subject: [PATCH 07/20] block/file: Add file-specific image info
7f1c5b
7f1c5b
RH-Author: Hanna Czenczek <hreitz@redhat.com>
7f1c5b
RH-MergeRequest: 145: Show protocol-level information in qemu-img info
7f1c5b
RH-Bugzilla: 1860292
7f1c5b
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
7f1c5b
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
7f1c5b
RH-Acked-by: Stefano Garzarella <sgarzare@redhat.com>
7f1c5b
RH-Commit: [2/12] d8cc351d6c16c41b2000e41dc555f13093a9edce (hreitz/qemu-kvm-c-9-s)
7f1c5b
7f1c5b
Add some (optional) information that the file driver can provide for
7f1c5b
image files, namely the extent size hint.
7f1c5b
7f1c5b
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
7f1c5b
Message-Id: <20220620162704.80987-3-hreitz@redhat.com>
7f1c5b
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
7f1c5b
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
7f1c5b
(cherry picked from commit 7f36a50ab4e7d39369cac67be4ba9d6ee4081dc0)
7f1c5b
Signed-off-by: Hanna Czenczek <hreitz@redhat.com>
7f1c5b
---
7f1c5b
 block/file-posix.c   | 30 ++++++++++++++++++++++++++++++
7f1c5b
 qapi/block-core.json | 26 ++++++++++++++++++++++++--
7f1c5b
 2 files changed, 54 insertions(+), 2 deletions(-)
7f1c5b
7f1c5b
diff --git a/block/file-posix.c b/block/file-posix.c
7f1c5b
index b9647c5ffc..df3da79aed 100644
7f1c5b
--- a/block/file-posix.c
7f1c5b
+++ b/block/file-posix.c
7f1c5b
@@ -3095,6 +3095,34 @@ static int raw_get_info(BlockDriverState *bs, BlockDriverInfo *bdi)
7f1c5b
     return 0;
7f1c5b
 }
7f1c5b
 
7f1c5b
+static ImageInfoSpecific *raw_get_specific_info(BlockDriverState *bs,
7f1c5b
+                                                Error **errp)
7f1c5b
+{
7f1c5b
+    ImageInfoSpecificFile *file_info = g_new0(ImageInfoSpecificFile, 1);
7f1c5b
+    ImageInfoSpecific *spec_info = g_new(ImageInfoSpecific, 1);
7f1c5b
+
7f1c5b
+    *spec_info = (ImageInfoSpecific){
7f1c5b
+        .type = IMAGE_INFO_SPECIFIC_KIND_FILE,
7f1c5b
+        .u.file.data = file_info,
7f1c5b
+    };
7f1c5b
+
7f1c5b
+#ifdef FS_IOC_FSGETXATTR
7f1c5b
+    {
7f1c5b
+        BDRVRawState *s = bs->opaque;
7f1c5b
+        struct fsxattr attr;
7f1c5b
+        int ret;
7f1c5b
+
7f1c5b
+        ret = ioctl(s->fd, FS_IOC_FSGETXATTR, &attr);
7f1c5b
+        if (!ret && attr.fsx_extsize != 0) {
7f1c5b
+            file_info->has_extent_size_hint = true;
7f1c5b
+            file_info->extent_size_hint = attr.fsx_extsize;
7f1c5b
+        }
7f1c5b
+    }
7f1c5b
+#endif
7f1c5b
+
7f1c5b
+    return spec_info;
7f1c5b
+}
7f1c5b
+
7f1c5b
 static BlockStatsSpecificFile get_blockstats_specific_file(BlockDriverState *bs)
7f1c5b
 {
7f1c5b
     BDRVRawState *s = bs->opaque;
7f1c5b
@@ -3328,6 +3356,7 @@ BlockDriver bdrv_file = {
7f1c5b
     .bdrv_co_truncate = raw_co_truncate,
7f1c5b
     .bdrv_getlength = raw_getlength,
7f1c5b
     .bdrv_get_info = raw_get_info,
7f1c5b
+    .bdrv_get_specific_info             = raw_get_specific_info,
7f1c5b
     .bdrv_get_allocated_file_size
7f1c5b
                         = raw_get_allocated_file_size,
7f1c5b
     .bdrv_get_specific_stats = raw_get_specific_stats,
7f1c5b
@@ -3700,6 +3729,7 @@ static BlockDriver bdrv_host_device = {
7f1c5b
     .bdrv_co_truncate       = raw_co_truncate,
7f1c5b
     .bdrv_getlength	= raw_getlength,
7f1c5b
     .bdrv_get_info = raw_get_info,
7f1c5b
+    .bdrv_get_specific_info             = raw_get_specific_info,
7f1c5b
     .bdrv_get_allocated_file_size
7f1c5b
                         = raw_get_allocated_file_size,
7f1c5b
     .bdrv_get_specific_stats = hdev_get_specific_stats,
7f1c5b
diff --git a/qapi/block-core.json b/qapi/block-core.json
7f1c5b
index 95ac4fa634..f5d822cbd6 100644
7f1c5b
--- a/qapi/block-core.json
7f1c5b
+++ b/qapi/block-core.json
7f1c5b
@@ -139,16 +139,29 @@
7f1c5b
       '*encryption-format': 'RbdImageEncryptionFormat'
7f1c5b
   } }
7f1c5b
 
7f1c5b
+##
7f1c5b
+# @ImageInfoSpecificFile:
7f1c5b
+#
7f1c5b
+# @extent-size-hint: Extent size hint (if available)
7f1c5b
+#
7f1c5b
+# Since: 8.0
7f1c5b
+##
7f1c5b
+{ 'struct': 'ImageInfoSpecificFile',
7f1c5b
+  'data': {
7f1c5b
+      '*extent-size-hint': 'size'
7f1c5b
+  } }
7f1c5b
+
7f1c5b
 ##
7f1c5b
 # @ImageInfoSpecificKind:
7f1c5b
 #
7f1c5b
 # @luks: Since 2.7
7f1c5b
 # @rbd: Since 6.1
7f1c5b
+# @file: Since 8.0
7f1c5b
 #
7f1c5b
 # Since: 1.7
7f1c5b
 ##
7f1c5b
 { 'enum': 'ImageInfoSpecificKind',
7f1c5b
-  'data': [ 'qcow2', 'vmdk', 'luks', 'rbd' ] }
7f1c5b
+  'data': [ 'qcow2', 'vmdk', 'luks', 'rbd', 'file' ] }
7f1c5b
 
7f1c5b
 ##
7f1c5b
 # @ImageInfoSpecificQCow2Wrapper:
7f1c5b
@@ -185,6 +198,14 @@
7f1c5b
 { 'struct': 'ImageInfoSpecificRbdWrapper',
7f1c5b
   'data': { 'data': 'ImageInfoSpecificRbd' } }
7f1c5b
 
7f1c5b
+##
7f1c5b
+# @ImageInfoSpecificFileWrapper:
7f1c5b
+#
7f1c5b
+# Since: 8.0
7f1c5b
+##
7f1c5b
+{ 'struct': 'ImageInfoSpecificFileWrapper',
7f1c5b
+  'data': { 'data': 'ImageInfoSpecificFile' } }
7f1c5b
+
7f1c5b
 ##
7f1c5b
 # @ImageInfoSpecific:
7f1c5b
 #
7f1c5b
@@ -199,7 +220,8 @@
7f1c5b
       'qcow2': 'ImageInfoSpecificQCow2Wrapper',
7f1c5b
       'vmdk': 'ImageInfoSpecificVmdkWrapper',
7f1c5b
       'luks': 'ImageInfoSpecificLUKSWrapper',
7f1c5b
-      'rbd': 'ImageInfoSpecificRbdWrapper'
7f1c5b
+      'rbd': 'ImageInfoSpecificRbdWrapper',
7f1c5b
+      'file': 'ImageInfoSpecificFileWrapper'
7f1c5b
   } }
7f1c5b
 
7f1c5b
 ##
7f1c5b
-- 
7f1c5b
2.31.1
7f1c5b