[PATCH v6 1/5] server: Allow volume information queries to be asynchronous
Zebediah Figura (she/her)
zfigura at codeweavers.com
Wed Feb 10 22:15:20 CST 2021
Sorry I didn't notice these before, but...
On 2/6/21 12:24 PM, Erich E. Hoover wrote:
> From: "Erich E. Hoover" <erich.e.hoover at gmail.com>
> Subject: [PATCH v6 1/5] server: Allow volume information queries to be asynchronous
> Message-Id: <CAEU2+vqETWab9BeFry-kO9+9=+6Xvm47Azhi7jumnf3D8ej0Jg at mail.gmail.com>
> Date: Sat, 6 Feb 2021 11:24:44 -0700
>
> Overall, this patchset has two objectives:
> 1) remove the volume information duplication in
> dlls/kernelbase/volume.c in preference to the version in
> dlls/mountmgr.sys/device.c
> 2) set the stage for fixing the advertisement of reparse point support
> ( https://github.com/wine-staging/wine-staging/blob/master/patches/ntdll-Junction_Points/xx06-kernel32-Advertise-junction-point-support.patch
> )
>
> Per Zeb's suggestion, these patches are now organized as follows:
> 0001: allow volume information queries to be asynchronous
> 0002: allow NtQueryVolumeInformationFile to make async volume
> information queries
> 0003: implement volume information queries for device files
> 0004: hook up volume information queries for mountmgr
> 0005: reimplement GetVolumeInformation on top of GetVolumeInformationByHandle
>
> ===
>
> This specific patch allows the volume information queries to be
> asynchronous on the server side.
>
> v6: No change
> v5: No change
> v4: Split content from server/device.c and
> dlls/ntoskrnl.exe/ntoskrnl.c and moved to patch 4
> v3: No change
> v2: Split
>
> Best,
> Erich
>
> From 01708bb64a4b20c8deba0b0a86b7e3a274090bd4 Mon Sep 17 00:00:00 2001
> From: "Erich E. Hoover" <erich.e.hoover at gmail.com>
> Date: Sat, 23 May 2020 21:39:41 -0600
> Subject: server: Allow volume information queries to be asynchronous.
>
> Signed-off-by: Erich E. Hoover <erich.e.hoover at gmail.com>
> ---
> server/fd.c | 15 ++++++++++-----
> server/file.h | 4 ++--
> server/named_pipe.c | 5 +++--
> server/protocol.def | 2 ++
> 4 files changed, 17 insertions(+), 9 deletions(-)
>
> diff --git a/server/fd.c b/server/fd.c
> index 848203f31ec..ee3cb458d35 100644
> --- a/server/fd.c
> +++ b/server/fd.c
> @@ -2314,9 +2314,10 @@ void default_fd_get_file_info( struct fd *fd, obj_handle_t handle, unsigned int
> }
>
> /* default get_volume_info() routine */
> -void no_fd_get_volume_info( struct fd *fd, unsigned int info_class )
> +int no_fd_get_volume_info( struct fd *fd, struct async *async, unsigned int info_class )
> {
> set_error( STATUS_OBJECT_TYPE_MISMATCH );
> + return 0;
> }
>
> /* default ioctl() routine */
> @@ -2608,13 +2609,17 @@ DECL_HANDLER(get_file_info)
> /* query volume info */
> DECL_HANDLER(get_volume_info)
> {
> - struct fd *fd = get_handle_fd_obj( current->process, req->handle, 0 );
> + struct fd *fd = get_handle_fd_obj( current->process, req->async.handle, 0 );
> + struct async *async;
>
> - if (fd)
> + if (!fd) return;
> +
> + if ((async = create_request_async( fd, fd->comp_flags, &req->async )))
> {
> - fd->fd_ops->get_volume_info( fd, req->info_class );
> - release_object( fd );
> + reply->wait = async_handoff( async, fd->fd_ops->get_volume_info( fd, async, req->info_class ), NULL, 0 );
Shouldn't we pass 1 to force_blocking here? From the client's
perspective I believe this call is always synchronous.
(Also, weird spacing before = in that line...)
> + release_object( async );
> }
> + release_object( fd );
> }
>
> /* open a file object */
> diff --git a/server/file.h b/server/file.h
> index 686bae084c5..a341793d4ab 100644
> --- a/server/file.h
> +++ b/server/file.h
> @@ -65,7 +65,7 @@ struct fd_ops
> /* query file info */
> void (*get_file_info)( struct fd *, obj_handle_t, unsigned int );
> /* query volume info */
> - void (*get_volume_info)( struct fd *, unsigned int );
> + int (*get_volume_info)( struct fd *, struct async *, unsigned int );
> /* perform an ioctl on the file */
> int (*ioctl)(struct fd *fd, ioctl_code_t code, struct async *async );
> /* queue an async operation */
> @@ -112,7 +112,7 @@ extern int no_fd_write( struct fd *fd, struct async *async, file_pos_t pos );
> extern int no_fd_flush( struct fd *fd, struct async *async );
> extern void no_fd_get_file_info( struct fd *fd, obj_handle_t handle, unsigned int info_class );
> extern void default_fd_get_file_info( struct fd *fd, obj_handle_t handle, unsigned int info_class );
> -extern void no_fd_get_volume_info( struct fd *fd, unsigned int info_class );
> +extern int no_fd_get_volume_info( struct fd *fd, struct async *async, unsigned int info_class );
> extern int no_fd_ioctl( struct fd *fd, ioctl_code_t code, struct async *async );
> extern int default_fd_ioctl( struct fd *fd, ioctl_code_t code, struct async *async );
> extern void no_fd_queue_async( struct fd *fd, struct async *async, int type, int count );
> diff --git a/server/named_pipe.c b/server/named_pipe.c
> index 2e80ef3b1aa..a3ce9d463f1 100644
> --- a/server/named_pipe.c
> +++ b/server/named_pipe.c
> @@ -146,7 +146,7 @@ static WCHAR *pipe_end_get_full_name( struct object *obj, data_size_t *len );
> static int pipe_end_read( struct fd *fd, struct async *async, file_pos_t pos );
> static int pipe_end_write( struct fd *fd, struct async *async_data, file_pos_t pos );
> static int pipe_end_flush( struct fd *fd, struct async *async );
> -static void pipe_end_get_volume_info( struct fd *fd, unsigned int info_class );
> +static int pipe_end_get_volume_info( struct fd *fd, struct async *async, unsigned int info_class );
> static void pipe_end_reselect_async( struct fd *fd, struct async_queue *queue );
> static void pipe_end_get_file_info( struct fd *fd, obj_handle_t handle, unsigned int info_class );
>
> @@ -742,7 +742,7 @@ static WCHAR *pipe_end_get_full_name( struct object *obj, data_size_t *len )
> return pipe_end->pipe->obj.ops->get_full_name( &pipe_end->pipe->obj, len );
> }
>
> -static void pipe_end_get_volume_info( struct fd *fd, unsigned int info_class )
> +static int pipe_end_get_volume_info( struct fd *fd, struct async *async, unsigned int info_class )
> {
> switch (info_class)
> {
> @@ -762,6 +762,7 @@ static void pipe_end_get_volume_info( struct fd *fd, unsigned int info_class )
> default:
> set_error( STATUS_NOT_IMPLEMENTED );
> }
> + return 0;
> }
>
> static void message_queue_read( struct pipe_end *pipe_end, struct iosb *iosb )
> diff --git a/server/protocol.def b/server/protocol.def
> index 3747a3b63ec..cd7ed35d9a3 100644
> --- a/server/protocol.def
> +++ b/server/protocol.def
> @@ -1400,9 +1400,11 @@ enum server_fd_type
>
> /* Query volume information */
> @REQ(get_volume_info)
> + async_data_t async; /* async I/O parameters */
Another inconsistent spacing nitpick here.
> obj_handle_t handle; /* handle to the file */
> unsigned int info_class; /* queried information class */
> @REPLY
> + obj_handle_t wait; /* handle to wait on for blocking read */
> VARARG(data,bytes); /* volume info data */
> @END
>
>
> --
> 2.17.1
>
More information about the wine-devel
mailing list