diff mbox series

[v6,3/4] qapi: add filter-node-name to block-stream

Message ID 1597785880-431103-4-git-send-email-andrey.shinkevich@virtuozzo.com (mailing list archive)
State New, archived
Headers show
Series Apply COR-filter to the block-stream permanently | expand

Commit Message

Andrey Shinkevich Aug. 18, 2020, 9:24 p.m. UTC
Provide the possibility to pass the 'filter-node-name' parameter to the
block-stream job as it is done for the commit block job. That will be
needed for further iotests implementations.

Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
---
 block/monitor/block-hmp-cmds.c | 4 ++--
 block/stream.c                 | 4 +++-
 blockdev.c                     | 8 +++++++-
 include/block/block_int.h      | 7 ++++++-
 qapi/block-core.json           | 6 ++++++
 5 files changed, 24 insertions(+), 5 deletions(-)

Comments

Vladimir Sementsov-Ogievskiy Aug. 19, 2020, 10:29 a.m. UTC | #1
19.08.2020 00:24, Andrey Shinkevich wrote:
> Provide the possibility to pass the 'filter-node-name' parameter to the
> block-stream job as it is done for the commit block job. That will be
> needed for further iotests implementations.

and for users as well. I think, the last sentence may be dropped.

> 
> Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
> ---
>   block/monitor/block-hmp-cmds.c | 4 ++--
>   block/stream.c                 | 4 +++-
>   blockdev.c                     | 8 +++++++-
>   include/block/block_int.h      | 7 ++++++-
>   qapi/block-core.json           | 6 ++++++
>   5 files changed, 24 insertions(+), 5 deletions(-)
> 
> diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
> index 4d3db5e..4e66775 100644
> --- a/block/monitor/block-hmp-cmds.c
> +++ b/block/monitor/block-hmp-cmds.c
> @@ -507,8 +507,8 @@ void hmp_block_stream(Monitor *mon, const QDict *qdict)
>   
>       qmp_block_stream(true, device, device, base != NULL, base, false, NULL,
>                        false, NULL, qdict_haskey(qdict, "speed"), speed, true,
> -                     BLOCKDEV_ON_ERROR_REPORT, false, false, false, false,
> -                     &error);
> +                     BLOCKDEV_ON_ERROR_REPORT, false, NULL, false, false, false,
> +                     false, &error);
>   
>       hmp_handle_error(mon, error);
>   }
> diff --git a/block/stream.c b/block/stream.c
> index b9c1141..8bf6b6d 100644
> --- a/block/stream.c
> +++ b/block/stream.c
> @@ -221,7 +221,9 @@ static const BlockJobDriver stream_job_driver = {
>   void stream_start(const char *job_id, BlockDriverState *bs,
>                     BlockDriverState *base, const char *backing_file_str,
>                     int creation_flags, int64_t speed,
> -                  BlockdevOnError on_error, Error **errp)
> +                  BlockdevOnError on_error,
> +                  const char *filter_node_name,
> +                  Error **errp)
>   {
>       StreamBlockJob *s;
>       BlockDriverState *iter;
> diff --git a/blockdev.c b/blockdev.c
> index 237fffb..800ecb3 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -2476,6 +2476,7 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
>                         bool has_backing_file, const char *backing_file,
>                         bool has_speed, int64_t speed,
>                         bool has_on_error, BlockdevOnError on_error,
> +                      bool has_filter_node_name, const char *filter_node_name,
>                         bool has_auto_finalize, bool auto_finalize,
>                         bool has_auto_dismiss, bool auto_dismiss,
>                         Error **errp)
> @@ -2491,6 +2492,10 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
>           on_error = BLOCKDEV_ON_ERROR_REPORT;
>       }
>   
> +    if (!has_filter_node_name) {
> +        filter_node_name = NULL;
> +    }

this works automatically, you don't need to initialize it by hand

> +
>       bs = bdrv_lookup_bs(device, device, errp);
>       if (!bs) {
>           return;
> @@ -2558,7 +2563,8 @@ void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
>       }
>   
>       stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name,
> -                 job_flags, has_speed ? speed : 0, on_error, &local_err);
> +                 job_flags, has_speed ? speed : 0, on_error,
> +                 filter_node_name, &local_err);
>       if (local_err) {
>           error_propagate(errp, local_err);
>           goto out;
> diff --git a/include/block/block_int.h b/include/block/block_int.h
> index 465a601..3efde33 100644
> --- a/include/block/block_int.h
> +++ b/include/block/block_int.h
> @@ -1122,6 +1122,9 @@ int is_windows_drive(const char *filename);
>    *                  See @BlockJobCreateFlags
>    * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
>    * @on_error: The action to take upon error.
> + * @filter_node_name: The node name that should be assigned to the filter
> + * driver that the commit job inserts into the graph above @bs. NULL means
> + * that a node name should be autogenerated.
>    * @errp: Error object.
>    *
>    * Start a streaming operation on @bs.  Clusters that are unallocated
> @@ -1134,7 +1137,9 @@ int is_windows_drive(const char *filename);
>   void stream_start(const char *job_id, BlockDriverState *bs,
>                     BlockDriverState *base, const char *backing_file_str,
>                     int creation_flags, int64_t speed,
> -                  BlockdevOnError on_error, Error **errp);
> +                  BlockdevOnError on_error,
> +                  const char *filter_node_name,
> +                  Error **errp);
>   
>   /**
>    * commit_start:
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index 0b8ccd3..1db6ce1 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -2524,6 +2524,11 @@
>   #            'stop' and 'enospc' can only be used if the block device
>   #            supports io-status (see BlockInfo).  Since 1.3.
>   #
> +# @filter-node-name: the node name that should be assigned to the
> +#                    filter driver that the stream job inserts into the graph
> +#                    above @device. If this option is not given, a node name is
> +#                    autogenerated. (Since: 5.1)
> +#
>   # @auto-finalize: When false, this job will wait in a PENDING state after it has
>   #                 finished its work, waiting for @block-job-finalize before
>   #                 making any block graph changes.
> @@ -2554,6 +2559,7 @@
>     'data': { '*job-id': 'str', 'device': 'str', '*base': 'str',
>               '*base-node': 'str', '*backing-file': 'str', '*speed': 'int',
>               '*on-error': 'BlockdevOnError',
> +            '*filter-node-name': 'str',
>               '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } }
>   
>   ##
> 


With extra "filter_node_name = NULL" dropped:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Andrey Shinkevich Aug. 23, 2020, 7:33 p.m. UTC | #2
On 19.08.2020 13:29, Vladimir Sementsov-Ogievskiy wrote:
> 19.08.2020 00:24, Andrey Shinkevich wrote:
>> Provide the possibility to pass the 'filter-node-name' parameter to the
>> block-stream job as it is done for the commit block job. That will be
>> needed for further iotests implementations.
>
> and for users as well. I think, the last sentence may be dropped.
>
>>
>> Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
>> ---
>>   block/monitor/block-hmp-cmds.c | 4 ++--
>>   block/stream.c                 | 4 +++-
>>   blockdev.c                     | 8 +++++++-
>>   include/block/block_int.h      | 7 ++++++-
>>   qapi/block-core.json           | 6 ++++++
>>   5 files changed, 24 insertions(+), 5 deletions(-)
>>
>> diff --git a/block/monitor/block-hmp-cmds.c 
>> b/block/monitor/block-hmp-cmds.c
>> index 4d3db5e..4e66775 100644
>> --- a/block/monitor/block-hmp-cmds.c
>> +++ b/block/monitor/block-hmp-cmds.c
>> @@ -507,8 +507,8 @@ void hmp_block_stream(Monitor *mon, const QDict 
>> *qdict)
>>         qmp_block_stream(true, device, device, base != NULL, base, 
>> false, NULL,
>>                        false, NULL, qdict_haskey(qdict, "speed"), 
>> speed, true,
>> -                     BLOCKDEV_ON_ERROR_REPORT, false, false, false, 
>> false,
>> -                     &error);
>> +                     BLOCKDEV_ON_ERROR_REPORT, false, NULL, false, 
>> false, false,
>> +                     false, &error);
>>         hmp_handle_error(mon, error);
>>   }
>> diff --git a/block/stream.c b/block/stream.c
>> index b9c1141..8bf6b6d 100644
>> --- a/block/stream.c
>> +++ b/block/stream.c
>> @@ -221,7 +221,9 @@ static const BlockJobDriver stream_job_driver = {
>>   void stream_start(const char *job_id, BlockDriverState *bs,
>>                     BlockDriverState *base, const char 
>> *backing_file_str,
>>                     int creation_flags, int64_t speed,
>> -                  BlockdevOnError on_error, Error **errp)
>> +                  BlockdevOnError on_error,
>> +                  const char *filter_node_name,
>> +                  Error **errp)
>>   {
>>       StreamBlockJob *s;
>>       BlockDriverState *iter;
>> diff --git a/blockdev.c b/blockdev.c
>> index 237fffb..800ecb3 100644
>> --- a/blockdev.c
>> +++ b/blockdev.c
>> @@ -2476,6 +2476,7 @@ void qmp_block_stream(bool has_job_id, const 
>> char *job_id, const char *device,
>>                         bool has_backing_file, const char *backing_file,
>>                         bool has_speed, int64_t speed,
>>                         bool has_on_error, BlockdevOnError on_error,
>> +                      bool has_filter_node_name, const char 
>> *filter_node_name,
>>                         bool has_auto_finalize, bool auto_finalize,
>>                         bool has_auto_dismiss, bool auto_dismiss,
>>                         Error **errp)
>> @@ -2491,6 +2492,10 @@ void qmp_block_stream(bool has_job_id, const 
>> char *job_id, const char *device,
>>           on_error = BLOCKDEV_ON_ERROR_REPORT;
>>       }
>>   +    if (!has_filter_node_name) {
>> +        filter_node_name = NULL;
>> +    }
>
> this works automatically, you don't need to initialize it by hand


In the current impementation of QEMU, it may look like an excess. I will 
remove it. But the qmp_block_commit() has that check.

Andrey

>
>> +
>>       bs = bdrv_lookup_bs(device, device, errp);
>>       if (!bs) {
>>           return;
>> @@ -2558,7 +2563,8 @@ void qmp_block_stream(bool has_job_id, const 
>> char *job_id, const char *device,
>>       }
>>         stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name,
>> -                 job_flags, has_speed ? speed : 0, on_error, 
>> &local_err);
>> +                 job_flags, has_speed ? speed : 0, on_error,
>> +                 filter_node_name, &local_err);
>>       if (local_err) {
>>           error_propagate(errp, local_err);
>>           goto out;
>> diff --git a/include/block/block_int.h b/include/block/block_int.h
>> index 465a601..3efde33 100644
>> --- a/include/block/block_int.h
>> +++ b/include/block/block_int.h
>> @@ -1122,6 +1122,9 @@ int is_windows_drive(const char *filename);
>>    *                  See @BlockJobCreateFlags
>>    * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
>>    * @on_error: The action to take upon error.
>> + * @filter_node_name: The node name that should be assigned to the 
>> filter
>> + * driver that the commit job inserts into the graph above @bs. NULL 
>> means
>> + * that a node name should be autogenerated.
>>    * @errp: Error object.
>>    *
>>    * Start a streaming operation on @bs.  Clusters that are unallocated
>> @@ -1134,7 +1137,9 @@ int is_windows_drive(const char *filename);
>>   void stream_start(const char *job_id, BlockDriverState *bs,
>>                     BlockDriverState *base, const char 
>> *backing_file_str,
>>                     int creation_flags, int64_t speed,
>> -                  BlockdevOnError on_error, Error **errp);
>> +                  BlockdevOnError on_error,
>> +                  const char *filter_node_name,
>> +                  Error **errp);
>>     /**
>>    * commit_start:
>> diff --git a/qapi/block-core.json b/qapi/block-core.json
>> index 0b8ccd3..1db6ce1 100644
>> --- a/qapi/block-core.json
>> +++ b/qapi/block-core.json
>> @@ -2524,6 +2524,11 @@
>>   #            'stop' and 'enospc' can only be used if the block device
>>   #            supports io-status (see BlockInfo).  Since 1.3.
>>   #
>> +# @filter-node-name: the node name that should be assigned to the
>> +#                    filter driver that the stream job inserts into 
>> the graph
>> +#                    above @device. If this option is not given, a 
>> node name is
>> +#                    autogenerated. (Since: 5.1)
>> +#
>>   # @auto-finalize: When false, this job will wait in a PENDING state 
>> after it has
>>   #                 finished its work, waiting for 
>> @block-job-finalize before
>>   #                 making any block graph changes.
>> @@ -2554,6 +2559,7 @@
>>     'data': { '*job-id': 'str', 'device': 'str', '*base': 'str',
>>               '*base-node': 'str', '*backing-file': 'str', '*speed': 
>> 'int',
>>               '*on-error': 'BlockdevOnError',
>> +            '*filter-node-name': 'str',
>>               '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } }
>>     ##
>>
>
>
> With extra "filter_node_name = NULL" dropped:
> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
>
Markus Armbruster Aug. 24, 2020, 1:21 p.m. UTC | #3
Andrey Shinkevich <andrey.shinkevich@virtuozzo.com> writes:

> Provide the possibility to pass the 'filter-node-name' parameter to the
> block-stream job as it is done for the commit block job. That will be
> needed for further iotests implementations.
>
> Signed-off-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
[...]
> diff --git a/qapi/block-core.json b/qapi/block-core.json
> index 0b8ccd3..1db6ce1 100644
> --- a/qapi/block-core.json
> +++ b/qapi/block-core.json
> @@ -2524,6 +2524,11 @@
>  #            'stop' and 'enospc' can only be used if the block device
>  #            supports io-status (see BlockInfo).  Since 1.3.
>  #
> +# @filter-node-name: the node name that should be assigned to the
> +#                    filter driver that the stream job inserts into the graph
> +#                    above @device. If this option is not given, a node name is
> +#                    autogenerated. (Since: 5.1)

It's (Since: 5.2) now.

> +#
>  # @auto-finalize: When false, this job will wait in a PENDING state after it has
>  #                 finished its work, waiting for @block-job-finalize before
>  #                 making any block graph changes.
> @@ -2554,6 +2559,7 @@
>    'data': { '*job-id': 'str', 'device': 'str', '*base': 'str',
>              '*base-node': 'str', '*backing-file': 'str', '*speed': 'int',
>              '*on-error': 'BlockdevOnError',
> +            '*filter-node-name': 'str',
>              '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } }
>  
>  ##
diff mbox series

Patch

diff --git a/block/monitor/block-hmp-cmds.c b/block/monitor/block-hmp-cmds.c
index 4d3db5e..4e66775 100644
--- a/block/monitor/block-hmp-cmds.c
+++ b/block/monitor/block-hmp-cmds.c
@@ -507,8 +507,8 @@  void hmp_block_stream(Monitor *mon, const QDict *qdict)
 
     qmp_block_stream(true, device, device, base != NULL, base, false, NULL,
                      false, NULL, qdict_haskey(qdict, "speed"), speed, true,
-                     BLOCKDEV_ON_ERROR_REPORT, false, false, false, false,
-                     &error);
+                     BLOCKDEV_ON_ERROR_REPORT, false, NULL, false, false, false,
+                     false, &error);
 
     hmp_handle_error(mon, error);
 }
diff --git a/block/stream.c b/block/stream.c
index b9c1141..8bf6b6d 100644
--- a/block/stream.c
+++ b/block/stream.c
@@ -221,7 +221,9 @@  static const BlockJobDriver stream_job_driver = {
 void stream_start(const char *job_id, BlockDriverState *bs,
                   BlockDriverState *base, const char *backing_file_str,
                   int creation_flags, int64_t speed,
-                  BlockdevOnError on_error, Error **errp)
+                  BlockdevOnError on_error,
+                  const char *filter_node_name,
+                  Error **errp)
 {
     StreamBlockJob *s;
     BlockDriverState *iter;
diff --git a/blockdev.c b/blockdev.c
index 237fffb..800ecb3 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -2476,6 +2476,7 @@  void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
                       bool has_backing_file, const char *backing_file,
                       bool has_speed, int64_t speed,
                       bool has_on_error, BlockdevOnError on_error,
+                      bool has_filter_node_name, const char *filter_node_name,
                       bool has_auto_finalize, bool auto_finalize,
                       bool has_auto_dismiss, bool auto_dismiss,
                       Error **errp)
@@ -2491,6 +2492,10 @@  void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
         on_error = BLOCKDEV_ON_ERROR_REPORT;
     }
 
+    if (!has_filter_node_name) {
+        filter_node_name = NULL;
+    }
+
     bs = bdrv_lookup_bs(device, device, errp);
     if (!bs) {
         return;
@@ -2558,7 +2563,8 @@  void qmp_block_stream(bool has_job_id, const char *job_id, const char *device,
     }
 
     stream_start(has_job_id ? job_id : NULL, bs, base_bs, base_name,
-                 job_flags, has_speed ? speed : 0, on_error, &local_err);
+                 job_flags, has_speed ? speed : 0, on_error,
+                 filter_node_name, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         goto out;
diff --git a/include/block/block_int.h b/include/block/block_int.h
index 465a601..3efde33 100644
--- a/include/block/block_int.h
+++ b/include/block/block_int.h
@@ -1122,6 +1122,9 @@  int is_windows_drive(const char *filename);
  *                  See @BlockJobCreateFlags
  * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
  * @on_error: The action to take upon error.
+ * @filter_node_name: The node name that should be assigned to the filter
+ * driver that the commit job inserts into the graph above @bs. NULL means
+ * that a node name should be autogenerated.
  * @errp: Error object.
  *
  * Start a streaming operation on @bs.  Clusters that are unallocated
@@ -1134,7 +1137,9 @@  int is_windows_drive(const char *filename);
 void stream_start(const char *job_id, BlockDriverState *bs,
                   BlockDriverState *base, const char *backing_file_str,
                   int creation_flags, int64_t speed,
-                  BlockdevOnError on_error, Error **errp);
+                  BlockdevOnError on_error,
+                  const char *filter_node_name,
+                  Error **errp);
 
 /**
  * commit_start:
diff --git a/qapi/block-core.json b/qapi/block-core.json
index 0b8ccd3..1db6ce1 100644
--- a/qapi/block-core.json
+++ b/qapi/block-core.json
@@ -2524,6 +2524,11 @@ 
 #            'stop' and 'enospc' can only be used if the block device
 #            supports io-status (see BlockInfo).  Since 1.3.
 #
+# @filter-node-name: the node name that should be assigned to the
+#                    filter driver that the stream job inserts into the graph
+#                    above @device. If this option is not given, a node name is
+#                    autogenerated. (Since: 5.1)
+#
 # @auto-finalize: When false, this job will wait in a PENDING state after it has
 #                 finished its work, waiting for @block-job-finalize before
 #                 making any block graph changes.
@@ -2554,6 +2559,7 @@ 
   'data': { '*job-id': 'str', 'device': 'str', '*base': 'str',
             '*base-node': 'str', '*backing-file': 'str', '*speed': 'int',
             '*on-error': 'BlockdevOnError',
+            '*filter-node-name': 'str',
             '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } }
 
 ##