From 7a7f6c6a7c24177e7e2960c06564798e322e9ca0 Mon Sep 17 00:00:00 2001 From: Elvira Khabirova Date: Sat, 22 Sep 2018 15:09:50 +0200 Subject: [PATCH 093/293] Implement decoding of NBD_* ioctl commands * nbd_ioctl.c: New file. * Makefile.am (strace_SOURCES): Add it. * defs.h (DECL_IOCTL): Add nbd. * ioctl.c (ioctl_decode): Add 0xab (nbd) case. * xlat/nbd_ioctl_cmds.in: Likewise. * xlat/nbd_ioctl_flags.in: Likewise. * tests/ioctl_nbd.c: Likewise. * tests/.gitignore: Add ioctl_nbd. * tests/pure_executables.list: Likewise. * tests/gen_tests.in (ioctl_nbd): New entry. Co-Authored-by: Dmitry V. Levin --- Makefile.am | 1 + defs.h | 1 + ioctl.c | 2 + nbd_ioctl.c | 73 +++++++++++++++++++++++++++++ xlat/nbd_ioctl_cmds.in | 11 +++++ xlat/nbd_ioctl_flags.in | 29 ++++++++++++ 6 files changed, 117 insertions(+) create mode 100644 nbd_ioctl.c create mode 100644 xlat/nbd_ioctl_cmds.in create mode 100644 xlat/nbd_ioctl_flags.in diff --git a/Makefile.am b/Makefile.am index 9e5eef2..913d26a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -204,6 +204,7 @@ strace_SOURCES = \ msghdr.h \ mtd.c \ native_defs.h \ + nbd_ioctl.c \ negated_errno.h \ net.c \ netlink.c \ diff --git a/defs.h b/defs.h index 7f1e64d..5ba95f5 100644 --- a/defs.h +++ b/defs.h @@ -970,6 +970,7 @@ DECL_IOCTL(file); DECL_IOCTL(fs_x); DECL_IOCTL(inotify); DECL_IOCTL(kvm); +DECL_IOCTL(nbd); DECL_IOCTL(nsfs); DECL_IOCTL(ptp); DECL_IOCTL(scsi); diff --git a/ioctl.c b/ioctl.c index 66b10ec..4c9e7db 100644 --- a/ioctl.c +++ b/ioctl.c @@ -327,6 +327,8 @@ ioctl_decode(struct tcb *tcp) #endif case 'I': return inotify_ioctl(tcp, code, arg); + case 0xab: + return nbd_ioctl(tcp, code, arg); default: break; } diff --git a/nbd_ioctl.c b/nbd_ioctl.c new file mode 100644 index 0000000..0ceec3e --- /dev/null +++ b/nbd_ioctl.c @@ -0,0 +1,73 @@ +/* + * Copyright (c) 2018 The strace developers. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "defs.h" +#include "print_fields.h" +#include +#include +#include + +#define XLAT_MACROS_ONLY +# include "xlat/nbd_ioctl_cmds.h" +#undef XLAT_MACROS_ONLY + +#include "xlat/nbd_ioctl_flags.h" + +int +nbd_ioctl(struct tcb *const tcp, const unsigned int code, + const kernel_ulong_t arg) +{ + switch (code) { + case NBD_DISCONNECT: + case NBD_CLEAR_SOCK: + case NBD_DO_IT: + case NBD_CLEAR_QUE: + case NBD_PRINT_DEBUG: + return RVAL_IOCTL_DECODED; + + case NBD_SET_SOCK: + tprints(", "); + printfd(tcp, arg); + return RVAL_IOCTL_DECODED; + + case NBD_SET_BLKSIZE: + case NBD_SET_SIZE: + case NBD_SET_SIZE_BLOCKS: + case NBD_SET_TIMEOUT: + tprints(", "); + tprintf("%" PRI_klu, arg); + return RVAL_IOCTL_DECODED; + + case NBD_SET_FLAGS: + tprints(", "); + printflags(nbd_ioctl_flags, arg, "NBD_IOC_FLAG_???"); + return RVAL_IOCTL_DECODED; + + default: + return RVAL_DECODED; + } +} diff --git a/xlat/nbd_ioctl_cmds.in b/xlat/nbd_ioctl_cmds.in new file mode 100644 index 0000000..34f891e --- /dev/null +++ b/xlat/nbd_ioctl_cmds.in @@ -0,0 +1,11 @@ +NBD_SET_SOCK _IO( 0xab, 0 ) +NBD_SET_BLKSIZE _IO( 0xab, 1 ) +NBD_SET_SIZE _IO( 0xab, 2 ) +NBD_DO_IT _IO( 0xab, 3 ) +NBD_CLEAR_SOCK _IO( 0xab, 4 ) +NBD_CLEAR_QUE _IO( 0xab, 5 ) +NBD_PRINT_DEBUG _IO( 0xab, 6 ) +NBD_SET_SIZE_BLOCKS _IO( 0xab, 7 ) +NBD_DISCONNECT _IO( 0xab, 8 ) +NBD_SET_TIMEOUT _IO( 0xab, 9 ) +NBD_SET_FLAGS _IO( 0xab, 10) diff --git a/xlat/nbd_ioctl_flags.in b/xlat/nbd_ioctl_flags.in new file mode 100644 index 0000000..60bb07f --- /dev/null +++ b/xlat/nbd_ioctl_flags.in @@ -0,0 +1,29 @@ +/* + * Some flags are not defined in , but are passed anyway. + * These flags are sent from nbd-server to the client, and the client + * passes them to the kernel unmodified after parsing. Both the client + * and the kernel ignore flags unknown to them. + */ + +/* The server supports flags */ +NBD_FLAG_HAS_FLAGS (1 << 0) +/* The export is read-only */ +NBD_FLAG_READ_ONLY (1 << 1) +/* The server supports NBD_CMD_FLUSH */ +NBD_FLAG_SEND_FLUSH (1 << 2) +/* The server supports NBD_CMD_FLAG_FUA (Force Unit Access) */ +NBD_FLAG_SEND_FUA (1 << 3) +/* The export is a rotational medium */ +NBD_FLAG_ROTATIONAL (1 << 4) +/* The server supports NBD_CMD_TRIM */ +NBD_FLAG_SEND_TRIM (1 << 5) +/* The server supports NBD_CMD_WRITE_ZEROES and NBD_CMD_FLAG_NO_HOLE */ +NBD_FLAG_SEND_WRITE_ZEROES (1 << 6) +/* The server supports NBD_CMD_FLAG_DF (don't fragment replies) */ +NBD_FLAG_SEND_DF (1 << 7) +/* The server supports multiple connections */ +NBD_FLAG_CAN_MULTI_CONN (1 << 8) +/* The server supports NBD_CMD_RESIZE (resizing the device) */ +NBD_FLAG_SEND_RESIZE (1 << 9) +/* The server supports NBD_CMD_CACHE */ +NBD_FLAG_SEND_CACHE (1 << 10) -- 1.7.12.4