From 4dd9f3f038683e9b3b92539c204d6009121dd77a Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Thu, 26 May 2016 00:37:26 +0000 Subject: [PATCH] Move parser of 'X' type ioctls to a separate file * fs_x_ioctl.c: New file. * Makefile.am (strace_SOURCES): Add it. * block.c: (block_ioctl): Move parser of FITRIM, FIFREEZE, and FITHAW to fs_x_ioctl.c. * defs.h (fs_x_ioctl): New prototype. * ioctl.c (ioctl_decode): Call fs_x_ioctl for ioctl type 'X'. --- Makefile.am | 1 + block.c | 21 ----------------- defs.h | 1 + fs_x_ioctl.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ioctl.c | 3 ++- 5 files changed, 69 insertions(+), 22 deletions(-) create mode 100644 fs_x_ioctl.c diff --git a/Makefile.am b/Makefile.am index 5783ab1f..052cb21f 100644 --- a/Makefile.am +++ b/Makefile.am @@ -112,6 +112,7 @@ strace_SOURCES = \ file.c \ file_handle.c \ file_ioctl.c \ + fs_x_ioctl.c \ flock.c \ flock.h \ futex.c \ diff --git a/block.c b/block.c index 70c2cc98..f4fefe28 100644 --- a/block.c +++ b/block.c @@ -240,33 +240,12 @@ block_ioctl(struct tcb *tcp, const unsigned int code, const long arg) break; } -#ifdef FITRIM - /* First seen in linux-2.6.37 */ - case FITRIM: { - struct fstrim_range fstrim; - - tprints(", "); - if (!umove_or_printaddr(tcp, arg, &fstrim)) - tprintf("{start=%#" PRIx64 ", " - "len=%#" PRIx64 ", " - "minlen=%#" PRIx64 "}", - (uint64_t) fstrim.start, - (uint64_t) fstrim.len, - (uint64_t) fstrim.minlen); - break; - } -#endif - /* No arguments */ case BLKRRPART: case BLKFLSBUF: case BLKTRACESTART: case BLKTRACESTOP: case BLKTRACETEARDOWN: -#ifdef FIFREEZE - case FIFREEZE: - case FITHAW: -#endif break; default: return RVAL_DECODED; diff --git a/defs.h b/defs.h index 4cc31bd3..39180877 100644 --- a/defs.h +++ b/defs.h @@ -662,6 +662,7 @@ extern void print_struct_statfs64(struct tcb *tcp, long, unsigned long); extern int block_ioctl(struct tcb *, const unsigned int, long); extern int evdev_ioctl(struct tcb *, const unsigned int, long); extern int file_ioctl(struct tcb *, const unsigned int, long); +extern int fs_x_ioctl(struct tcb *, const unsigned int, long); extern int hdio_ioctl(struct tcb *, const unsigned int, long); extern int loop_ioctl(struct tcb *, const unsigned int, long); extern int mtd_ioctl(struct tcb *, const unsigned int, long); diff --git a/fs_x_ioctl.c b/fs_x_ioctl.c new file mode 100644 index 00000000..7403e6b0 --- /dev/null +++ b/fs_x_ioctl.c @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2014 Mike Frysinger + * Copyright (c) 2015-2016 Dmitry V. Levin + * 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 + +int +fs_x_ioctl(struct tcb *tcp, const unsigned int code, const long arg) +{ + switch (code) { +#ifdef FITRIM + /* First seen in linux-2.6.37 */ + case FITRIM: { + struct fstrim_range fstrim; + + tprints(", "); + if (!umove_or_printaddr(tcp, arg, &fstrim)) + tprintf("{start=%#" PRIx64 + ", len=%#" PRIx64 + ", minlen=%#" PRIx64 "}", + (uint64_t) fstrim.start, + (uint64_t) fstrim.len, + (uint64_t) fstrim.minlen); + break; + } +#endif + + /* No arguments */ +#ifdef FIFREEZE + case FIFREEZE: + case FITHAW: + break; +#endif + + default: + return RVAL_DECODED; + } + + return RVAL_DECODED | 1; +} diff --git a/ioctl.c b/ioctl.c index c5183332..495fb3c7 100644 --- a/ioctl.c +++ b/ioctl.c @@ -252,8 +252,9 @@ ioctl_decode(struct tcb *tcp) case 0x03: return hdio_ioctl(tcp, code, arg); case 0x12: - case 'X': return block_ioctl(tcp, code, arg); + case 'X': + return fs_x_ioctl(tcp, code, arg); #ifdef HAVE_SCSI_SG_H case 0x22: return scsi_ioctl(tcp, code, arg); -- 2.40.0