From 5b88608b296c44c67ffa25900b8c2e496c2b41a4 Mon Sep 17 00:00:00 2001 From: Mike Frysinger Date: Fri, 21 Nov 2014 16:13:16 -0500 Subject: [PATCH] Decode FIFREEZE/FITHAW/FITRIM ioctls The freeze/thaw ones are simple, but the trim is an interesting struct. * block.c (block_ioctl): Handle FIFREEZE/FITHAW/FITRIM. * ioctl.c (ioctl_decode): Pass 'X' ioctls to block_ioctl. --- block.c | 20 ++++++++++++++++++++ ioctl.c | 1 + 2 files changed, 21 insertions(+) diff --git a/block.c b/block.c index b281b1af..b62e4363 100644 --- a/block.c +++ b/block.c @@ -116,6 +116,11 @@ block_ioctl(struct tcb *tcp, long code, long arg) /* take a signed int */ case BLKROSET: case BLKBSZSET: +#ifdef FIFREEZE + /* First seen in linux-2.6.29 */ + case FIFREEZE: + case FITHAW: +#endif if (entering(tcp)) { int val; if (umove(tcp, arg, &val) < 0) @@ -263,6 +268,21 @@ block_ioctl(struct tcb *tcp, long code, long arg) } break; +#ifdef FITRIM + /* First seen in linux-2.6.37 */ + case FITRIM: + if (entering(tcp)) { + struct fstrim_range fstrim; + if (umove(tcp, arg, &fstrim)) + tprintf(", %#lx", arg); + else + tprintf(", {start=%#" PRIx64 ", len=%#" PRIx64 ", " + "minlen=%#" PRIx64 "}", (uint64_t) fstrim.start, + (uint64_t) fstrim.len, (uint64_t) fstrim.minlen); + } + break; +#endif + /* No arguments or unhandled */ case BLKTRACESTART: case BLKTRACESTOP: diff --git a/ioctl.c b/ioctl.c index 9c743ce5..cfd5a245 100644 --- a/ioctl.c +++ b/ioctl.c @@ -85,6 +85,7 @@ ioctl_decode(struct tcb *tcp, long code, long arg) return rtc_ioctl(tcp, code, arg); case 0x03: case 0x12: + case 'X': return block_ioctl(tcp, code, arg); #ifdef HAVE_SCSI_SG_H case 0x22: -- 2.34.1