* [xfsprogs PATCH v4 0/2] Add necessary items for MAP_SYNC testing
@ 2017-12-21 22:07 Ross Zwisler
2017-12-21 22:07 ` [xfsprogs PATCH v4 1/2] xfs_io: add MAP_SYNC support to mmap() Ross Zwisler
2017-12-21 22:08 ` [xfsprogs PATCH v4 2/2] xfs_io: add a new 'log_writes' command Ross Zwisler
0 siblings, 2 replies; 4+ messages in thread
From: Ross Zwisler @ 2017-12-21 22:07 UTC (permalink / raw)
To: linux-xfs, Darrick J. Wong, Eric Sandeen
Cc: Ross Zwisler, linux-nvdimm, fstests, Jan Kara, Dave Chinner,
Dan Williams
This is the fourth revision of my MAP_SYNC + dm-log-writes support for
xfsprogs. The previous revision can be found here:
https://lists.01.org/pipermail/linux-nvdimm/2017-December/013473.html
Changes since v3:
- Fixed indentation of variable declarations (Darrick).
- Added a comment for the case where MAP_SYNC and MAP_SHARED_VALIDATE
aren't defined in system headers and we fail an msync command
(Darrick).
- Dropped patch 1 of the previous series which fixed compiler warnings.
A fix for this issue was already submitted by Dave.
---
As suggested by Dave Chinner:
As I say to all these sorts of one-off test prgrams: please add the
new MAP_SYNC flag to xfs_io rather than writing a one-off
test program to set it and write some data.
And if we're going to be adding special custom tests just because
we need to insert dm-log marks, add that functionality to xfs_io,
too.
That way we can create complex custom dm logwrite tests without
needing one-off test programs for them all...
This series enhances xfs_io by adding support for the MAP_SYNC mmap() flag
and for dm-log-writes marks. This allows the resulting xfstest for
MAP_SYNC to be much simpler and have no custom C programs.
Ross Zwisler (2):
xfs_io: add MAP_SYNC support to mmap()
xfs_io: add a new 'log_writes' command
configure.ac | 2 +
debian/control | 2 +-
include/builddefs.in | 3 ++
include/linux.h | 8 ++++
io/Makefile | 10 +++++
io/init.c | 1 +
io/io.h | 7 ++++
io/log_writes.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++
io/mmap.c | 29 ++++++++++---
m4/Makefile | 1 +
m4/package_devmapper.m4 | 11 +++++
m4/package_libcdev.m4 | 16 ++++++++
man/man8/xfs_io.8 | 29 ++++++++++++-
13 files changed, 217 insertions(+), 8 deletions(-)
create mode 100644 io/log_writes.c
create mode 100644 m4/package_devmapper.m4
--
2.14.3
^ permalink raw reply [flat|nested] 4+ messages in thread* [xfsprogs PATCH v4 1/2] xfs_io: add MAP_SYNC support to mmap() 2017-12-21 22:07 [xfsprogs PATCH v4 0/2] Add necessary items for MAP_SYNC testing Ross Zwisler @ 2017-12-21 22:07 ` Ross Zwisler 2017-12-21 22:18 ` Darrick J. Wong 2017-12-21 22:08 ` [xfsprogs PATCH v4 2/2] xfs_io: add a new 'log_writes' command Ross Zwisler 1 sibling, 1 reply; 4+ messages in thread From: Ross Zwisler @ 2017-12-21 22:07 UTC (permalink / raw) To: linux-xfs, Darrick J. Wong, Eric Sandeen Cc: Ross Zwisler, linux-nvdimm, fstests, Jan Kara, Dave Chinner, Dan Williams Add support for a new -S flag to xfs_io's mmap command. This opens the mapping with the (MAP_SYNC | MAP_SHARED_VALIDATE) flags instead of the standard MAP_SHARED flag. Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> Suggested-by: Dave Chinner <david@fromorbit.com> --- configure.ac | 1 + include/builddefs.in | 1 + include/linux.h | 8 ++++++++ io/Makefile | 4 ++++ io/io.h | 1 + io/mmap.c | 29 ++++++++++++++++++++++++----- m4/package_libcdev.m4 | 16 ++++++++++++++++ man/man8/xfs_io.8 | 6 +++++- 8 files changed, 60 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index e5d0309f..f3325aa0 100644 --- a/configure.ac +++ b/configure.ac @@ -163,6 +163,7 @@ AC_HAVE_MREMAP AC_NEED_INTERNAL_FSXATTR AC_HAVE_GETFSMAP AC_HAVE_STATFS_FLAGS +AC_HAVE_MAP_SYNC if test "$enable_blkid" = yes; then AC_HAVE_BLKID_TOPO diff --git a/include/builddefs.in b/include/builddefs.in index fd274ddc..126f7e95 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -115,6 +115,7 @@ HAVE_MREMAP = @have_mremap@ NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@ HAVE_GETFSMAP = @have_getfsmap@ HAVE_STATFS_FLAGS = @have_statfs_flags@ +HAVE_MAP_SYNC = @have_map_sync@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl diff --git a/include/linux.h b/include/linux.h index 6ce344c5..1998941a 100644 --- a/include/linux.h +++ b/include/linux.h @@ -327,4 +327,12 @@ fsmap_advance( #define HAVE_GETFSMAP #endif /* HAVE_GETFSMAP */ +#ifndef HAVE_MAP_SYNC +#define MAP_SYNC 0 +#define MAP_SHARED_VALIDATE 0 +#else +#include <asm-generic/mman.h> +#include <asm-generic/mman-common.h> +#endif /* HAVE_MAP_SYNC */ + #endif /* __XFS_LINUX_H__ */ diff --git a/io/Makefile b/io/Makefile index 6725936d..2987ee11 100644 --- a/io/Makefile +++ b/io/Makefile @@ -103,6 +103,10 @@ ifeq ($(HAVE_MREMAP),yes) LCFLAGS += -DHAVE_MREMAP endif +ifeq ($(HAVE_MAP_SYNC),yes) +LCFLAGS += -DHAVE_MAP_SYNC +endif + # On linux we get fsmap from the system or define it ourselves # so include this based on platform type. If this reverts to only # the autoconf check w/o local definition, change to testing HAVE_GETFSMAP diff --git a/io/io.h b/io/io.h index 3862985f..8b2753b3 100644 --- a/io/io.h +++ b/io/io.h @@ -65,6 +65,7 @@ typedef struct mmap_region { size_t length; /* length of mapping */ off64_t offset; /* start offset into backing file */ int prot; /* protection mode of the mapping */ + bool map_sync; /* is this a MAP_SYNC mapping? */ char *name; /* name of backing file */ } mmap_region_t; diff --git a/io/mmap.c b/io/mmap.c index b0c1f764..04a828a4 100644 --- a/io/mmap.c +++ b/io/mmap.c @@ -42,7 +42,7 @@ print_mapping( int index, int braces) { - unsigned char buffer[8] = { 0 }; + char buffer[8] = { 0 }; int i; static struct { @@ -57,6 +57,10 @@ print_mapping( for (i = 0, p = pflags; p->prot != PROT_NONE; i++, p++) buffer[i] = (map->prot & p->prot) ? p->mode : '-'; + + if (map->map_sync) + sprintf(&buffer[i], " S"); + printf("%c%03d%c 0x%lx - 0x%lx %s %14s (%lld : %ld)\n", braces? '[' : ' ', index, braces? ']' : ' ', (unsigned long)map->addr, @@ -147,6 +151,7 @@ mmap_help(void) " -r -- map with PROT_READ protection\n" " -w -- map with PROT_WRITE protection\n" " -x -- map with PROT_EXEC protection\n" +" -S -- map with MAP_SYNC and MAP_SHARED_VALIDATE flags\n" " -s <size> -- first do mmap(size)/munmap(size), try to reserve some free space\n" " If no protection mode is specified, all are used by default.\n" "\n")); @@ -162,7 +167,7 @@ mmap_f( void *address = NULL; char *filename; size_t blocksize, sectsize; - int c, prot = 0; + int c, prot = 0, flags = MAP_SHARED; exitcode = 1; if (argc == 1) { @@ -186,7 +191,7 @@ mmap_f( init_cvtnum(&blocksize, §size); - while ((c = getopt(argc, argv, "rwxs:")) != EOF) { + while ((c = getopt(argc, argv, "rwxSs:")) != EOF) { switch (c) { case 'r': prot |= PROT_READ; @@ -197,6 +202,19 @@ mmap_f( case 'x': prot |= PROT_EXEC; break; + case 'S': + flags = MAP_SYNC | MAP_SHARED_VALIDATE; + + /* + * If MAP_SYNC and MAP_SHARED_VALIDATE aren't defined + * in the system headers we will have defined them + * both as 0. + */ + if (!flags) { + printf("MAP_SYNC not supported\n"); + return 0; + } + break; case 's': length2 = cvtnum(blocksize, sectsize, optarg); break; @@ -240,7 +258,7 @@ mmap_f( MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); munmap(address, length2); } - address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); + address = mmap(address, length, prot, flags, file->fd, offset); if (address == MAP_FAILED) { perror("mmap"); free(filename); @@ -265,6 +283,7 @@ mmap_f( mapping->offset = offset; mapping->name = filename; mapping->prot = prot; + mapping->map_sync = (flags == (MAP_SYNC | MAP_SHARED_VALIDATE)); exitcode = 0; return 0; } @@ -691,7 +710,7 @@ mmap_init(void) mmap_cmd.argmax = -1; mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK | CMD_FLAG_ONESHOT; - mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); + mmap_cmd.args = _("[N] | [-rwxS] [-s size] [off len]"); mmap_cmd.oneline = _("mmap a range in the current file, show mappings"); mmap_cmd.help = mmap_help; diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 index 7b4dfc85..71cedc5c 100644 --- a/m4/package_libcdev.m4 +++ b/m4/package_libcdev.m4 @@ -328,3 +328,19 @@ AC_DEFUN([AC_HAVE_STATFS_FLAGS], ) AC_SUBST(have_statfs_flags) ]) + +# +# Check if we have MAP_SYNC defines (Linux) +# +AC_DEFUN([AC_HAVE_MAP_SYNC], + [ AC_MSG_CHECKING([for MAP_SYNC]) + AC_TRY_COMPILE([ +#include <asm-generic/mman.h> +#include <asm-generic/mman-common.h> + ], [ + int flags = MAP_SYNC | MAP_SHARED_VALIDATE; + ], have_map_sync=yes + AC_MSG_RESULT(yes), + AC_MSG_RESULT(no)) + AC_SUBST(have_map_sync) + ]) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 9bf1a478..1693f7f1 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -764,7 +764,7 @@ Each (sec, nsec) pair constitutes a single timestamp value. .SH MEMORY MAPPED I/O COMMANDS .TP -.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] +.BI "mmap [ " N " | [[ \-rwxS ] [\-s " size " ] " "offset length " ]] With no arguments, .B mmap shows the current mappings. Specifying a single numeric argument @@ -780,6 +780,10 @@ PROT_WRITE .RB ( \-w ), and PROT_EXEC .RB ( \-x ). +The mapping will be created with the MAP_SHARED flag by default, or with the +Linux specific (MAP_SYNC | MAP_SHARED_VALIDATE) flags if +.B -S +is given. .BI \-s " size" is used to do a mmap(size) && munmap(size) operation at first, try to reserve some extendible free memory space, if -- 2.14.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [xfsprogs PATCH v4 1/2] xfs_io: add MAP_SYNC support to mmap() 2017-12-21 22:07 ` [xfsprogs PATCH v4 1/2] xfs_io: add MAP_SYNC support to mmap() Ross Zwisler @ 2017-12-21 22:18 ` Darrick J. Wong 0 siblings, 0 replies; 4+ messages in thread From: Darrick J. Wong @ 2017-12-21 22:18 UTC (permalink / raw) To: Ross Zwisler Cc: linux-xfs, Eric Sandeen, linux-nvdimm, fstests, Jan Kara, Dave Chinner, Dan Williams On Thu, Dec 21, 2017 at 03:07:59PM -0700, Ross Zwisler wrote: > Add support for a new -S flag to xfs_io's mmap command. This opens the > mapping with the (MAP_SYNC | MAP_SHARED_VALIDATE) flags instead of the > standard MAP_SHARED flag. > > Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> > Suggested-by: Dave Chinner <david@fromorbit.com> Looks ok, Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> > --- > configure.ac | 1 + > include/builddefs.in | 1 + > include/linux.h | 8 ++++++++ > io/Makefile | 4 ++++ > io/io.h | 1 + > io/mmap.c | 29 ++++++++++++++++++++++++----- > m4/package_libcdev.m4 | 16 ++++++++++++++++ > man/man8/xfs_io.8 | 6 +++++- > 8 files changed, 60 insertions(+), 6 deletions(-) > > diff --git a/configure.ac b/configure.ac > index e5d0309f..f3325aa0 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -163,6 +163,7 @@ AC_HAVE_MREMAP > AC_NEED_INTERNAL_FSXATTR > AC_HAVE_GETFSMAP > AC_HAVE_STATFS_FLAGS > +AC_HAVE_MAP_SYNC > > if test "$enable_blkid" = yes; then > AC_HAVE_BLKID_TOPO > diff --git a/include/builddefs.in b/include/builddefs.in > index fd274ddc..126f7e95 100644 > --- a/include/builddefs.in > +++ b/include/builddefs.in > @@ -115,6 +115,7 @@ HAVE_MREMAP = @have_mremap@ > NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@ > HAVE_GETFSMAP = @have_getfsmap@ > HAVE_STATFS_FLAGS = @have_statfs_flags@ > +HAVE_MAP_SYNC = @have_map_sync@ > > GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall > # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl > diff --git a/include/linux.h b/include/linux.h > index 6ce344c5..1998941a 100644 > --- a/include/linux.h > +++ b/include/linux.h > @@ -327,4 +327,12 @@ fsmap_advance( > #define HAVE_GETFSMAP > #endif /* HAVE_GETFSMAP */ > > +#ifndef HAVE_MAP_SYNC > +#define MAP_SYNC 0 > +#define MAP_SHARED_VALIDATE 0 > +#else > +#include <asm-generic/mman.h> > +#include <asm-generic/mman-common.h> > +#endif /* HAVE_MAP_SYNC */ > + > #endif /* __XFS_LINUX_H__ */ > diff --git a/io/Makefile b/io/Makefile > index 6725936d..2987ee11 100644 > --- a/io/Makefile > +++ b/io/Makefile > @@ -103,6 +103,10 @@ ifeq ($(HAVE_MREMAP),yes) > LCFLAGS += -DHAVE_MREMAP > endif > > +ifeq ($(HAVE_MAP_SYNC),yes) > +LCFLAGS += -DHAVE_MAP_SYNC > +endif > + > # On linux we get fsmap from the system or define it ourselves > # so include this based on platform type. If this reverts to only > # the autoconf check w/o local definition, change to testing HAVE_GETFSMAP > diff --git a/io/io.h b/io/io.h > index 3862985f..8b2753b3 100644 > --- a/io/io.h > +++ b/io/io.h > @@ -65,6 +65,7 @@ typedef struct mmap_region { > size_t length; /* length of mapping */ > off64_t offset; /* start offset into backing file */ > int prot; /* protection mode of the mapping */ > + bool map_sync; /* is this a MAP_SYNC mapping? */ > char *name; /* name of backing file */ > } mmap_region_t; > > diff --git a/io/mmap.c b/io/mmap.c > index b0c1f764..04a828a4 100644 > --- a/io/mmap.c > +++ b/io/mmap.c > @@ -42,7 +42,7 @@ print_mapping( > int index, > int braces) > { > - unsigned char buffer[8] = { 0 }; > + char buffer[8] = { 0 }; > int i; > > static struct { > @@ -57,6 +57,10 @@ print_mapping( > > for (i = 0, p = pflags; p->prot != PROT_NONE; i++, p++) > buffer[i] = (map->prot & p->prot) ? p->mode : '-'; > + > + if (map->map_sync) > + sprintf(&buffer[i], " S"); > + > printf("%c%03d%c 0x%lx - 0x%lx %s %14s (%lld : %ld)\n", > braces? '[' : ' ', index, braces? ']' : ' ', > (unsigned long)map->addr, > @@ -147,6 +151,7 @@ mmap_help(void) > " -r -- map with PROT_READ protection\n" > " -w -- map with PROT_WRITE protection\n" > " -x -- map with PROT_EXEC protection\n" > +" -S -- map with MAP_SYNC and MAP_SHARED_VALIDATE flags\n" > " -s <size> -- first do mmap(size)/munmap(size), try to reserve some free space\n" > " If no protection mode is specified, all are used by default.\n" > "\n")); > @@ -162,7 +167,7 @@ mmap_f( > void *address = NULL; > char *filename; > size_t blocksize, sectsize; > - int c, prot = 0; > + int c, prot = 0, flags = MAP_SHARED; > > exitcode = 1; > if (argc == 1) { > @@ -186,7 +191,7 @@ mmap_f( > > init_cvtnum(&blocksize, §size); > > - while ((c = getopt(argc, argv, "rwxs:")) != EOF) { > + while ((c = getopt(argc, argv, "rwxSs:")) != EOF) { > switch (c) { > case 'r': > prot |= PROT_READ; > @@ -197,6 +202,19 @@ mmap_f( > case 'x': > prot |= PROT_EXEC; > break; > + case 'S': > + flags = MAP_SYNC | MAP_SHARED_VALIDATE; > + > + /* > + * If MAP_SYNC and MAP_SHARED_VALIDATE aren't defined > + * in the system headers we will have defined them > + * both as 0. > + */ > + if (!flags) { > + printf("MAP_SYNC not supported\n"); > + return 0; > + } > + break; > case 's': > length2 = cvtnum(blocksize, sectsize, optarg); > break; > @@ -240,7 +258,7 @@ mmap_f( > MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); > munmap(address, length2); > } > - address = mmap(address, length, prot, MAP_SHARED, file->fd, offset); > + address = mmap(address, length, prot, flags, file->fd, offset); > if (address == MAP_FAILED) { > perror("mmap"); > free(filename); > @@ -265,6 +283,7 @@ mmap_f( > mapping->offset = offset; > mapping->name = filename; > mapping->prot = prot; > + mapping->map_sync = (flags == (MAP_SYNC | MAP_SHARED_VALIDATE)); > exitcode = 0; > return 0; > } > @@ -691,7 +710,7 @@ mmap_init(void) > mmap_cmd.argmax = -1; > mmap_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | > CMD_FOREIGN_OK | CMD_FLAG_ONESHOT; > - mmap_cmd.args = _("[N] | [-rwx] [-s size] [off len]"); > + mmap_cmd.args = _("[N] | [-rwxS] [-s size] [off len]"); > mmap_cmd.oneline = > _("mmap a range in the current file, show mappings"); > mmap_cmd.help = mmap_help; > diff --git a/m4/package_libcdev.m4 b/m4/package_libcdev.m4 > index 7b4dfc85..71cedc5c 100644 > --- a/m4/package_libcdev.m4 > +++ b/m4/package_libcdev.m4 > @@ -328,3 +328,19 @@ AC_DEFUN([AC_HAVE_STATFS_FLAGS], > ) > AC_SUBST(have_statfs_flags) > ]) > + > +# > +# Check if we have MAP_SYNC defines (Linux) > +# > +AC_DEFUN([AC_HAVE_MAP_SYNC], > + [ AC_MSG_CHECKING([for MAP_SYNC]) > + AC_TRY_COMPILE([ > +#include <asm-generic/mman.h> > +#include <asm-generic/mman-common.h> > + ], [ > + int flags = MAP_SYNC | MAP_SHARED_VALIDATE; > + ], have_map_sync=yes > + AC_MSG_RESULT(yes), > + AC_MSG_RESULT(no)) > + AC_SUBST(have_map_sync) > + ]) > diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 > index 9bf1a478..1693f7f1 100644 > --- a/man/man8/xfs_io.8 > +++ b/man/man8/xfs_io.8 > @@ -764,7 +764,7 @@ Each (sec, nsec) pair constitutes a single timestamp value. > > .SH MEMORY MAPPED I/O COMMANDS > .TP > -.BI "mmap [ " N " | [[ \-rwx ] [\-s " size " ] " "offset length " ]] > +.BI "mmap [ " N " | [[ \-rwxS ] [\-s " size " ] " "offset length " ]] > With no arguments, > .B mmap > shows the current mappings. Specifying a single numeric argument > @@ -780,6 +780,10 @@ PROT_WRITE > .RB ( \-w ), > and PROT_EXEC > .RB ( \-x ). > +The mapping will be created with the MAP_SHARED flag by default, or with the > +Linux specific (MAP_SYNC | MAP_SHARED_VALIDATE) flags if > +.B -S > +is given. > .BI \-s " size" > is used to do a mmap(size) && munmap(size) operation at first, try to reserve some > extendible free memory space, if > -- > 2.14.3 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 4+ messages in thread
* [xfsprogs PATCH v4 2/2] xfs_io: add a new 'log_writes' command 2017-12-21 22:07 [xfsprogs PATCH v4 0/2] Add necessary items for MAP_SYNC testing Ross Zwisler 2017-12-21 22:07 ` [xfsprogs PATCH v4 1/2] xfs_io: add MAP_SYNC support to mmap() Ross Zwisler @ 2017-12-21 22:08 ` Ross Zwisler 1 sibling, 0 replies; 4+ messages in thread From: Ross Zwisler @ 2017-12-21 22:08 UTC (permalink / raw) To: linux-xfs, Darrick J. Wong, Eric Sandeen Cc: Ross Zwisler, linux-nvdimm, fstests, Jan Kara, Dave Chinner, Dan Williams Add a new 'log_writes' command to xfs_io so that we can add dm-log-writes log marks. It's helpful to allow users of xfs_io to adds these marks from within xfs_io instead of waiting until after xfs_io exits because then they are able to replay the dm-log-writes log up to immediately after another xfs_io operation such as mwrite. This isolates the log replay from other operations that happen as part of xfs_io exiting (file handles being closed, mmaps being torn down, etc.). This also allows users to insert multiple marks between different xfs_io commands. Signed-off-by: Ross Zwisler <ross.zwisler@linux.intel.com> Suggested-by: Dave Chinner <david@fromorbit.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> --- configure.ac | 1 + debian/control | 2 +- include/builddefs.in | 2 + io/Makefile | 6 +++ io/init.c | 1 + io/io.h | 6 +++ io/log_writes.c | 106 ++++++++++++++++++++++++++++++++++++++++++++++++ m4/Makefile | 1 + m4/package_devmapper.m4 | 11 +++++ man/man8/xfs_io.8 | 23 ++++++++++- 10 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 io/log_writes.c create mode 100644 m4/package_devmapper.m4 diff --git a/configure.ac b/configure.ac index f3325aa0..f83d5817 100644 --- a/configure.ac +++ b/configure.ac @@ -164,6 +164,7 @@ AC_NEED_INTERNAL_FSXATTR AC_HAVE_GETFSMAP AC_HAVE_STATFS_FLAGS AC_HAVE_MAP_SYNC +AC_HAVE_DEVMAPPER if test "$enable_blkid" = yes; then AC_HAVE_BLKID_TOPO diff --git a/debian/control b/debian/control index ad816622..5c26e3d7 100644 --- a/debian/control +++ b/debian/control @@ -3,7 +3,7 @@ Section: admin Priority: optional Maintainer: XFS Development Team <linux-xfs@vger.kernel.org> Uploaders: Nathan Scott <nathans@debian.org>, Anibal Monsalve Salazar <anibal@debian.org> -Build-Depends: uuid-dev, dh-autoreconf, debhelper (>= 5), gettext, libtool, libreadline-gplv2-dev | libreadline5-dev, libblkid-dev (>= 2.17), linux-libc-dev +Build-Depends: uuid-dev, dh-autoreconf, debhelper (>= 5), gettext, libtool, libreadline-gplv2-dev | libreadline5-dev, libblkid-dev (>= 2.17), linux-libc-dev, libdevmapper-dev Standards-Version: 3.9.1 Homepage: http://xfs.org/ diff --git a/include/builddefs.in b/include/builddefs.in index 126f7e95..66bdbfa2 100644 --- a/include/builddefs.in +++ b/include/builddefs.in @@ -35,6 +35,7 @@ LIBTERMCAP = @libtermcap@ LIBEDITLINE = @libeditline@ LIBREADLINE = @libreadline@ LIBBLKID = @libblkid@ +LIBDEVMAPPER = @libdevmapper@ LIBXFS = $(TOPDIR)/libxfs/libxfs.la LIBXCMD = $(TOPDIR)/libxcmd/libxcmd.la LIBXLOG = $(TOPDIR)/libxlog/libxlog.la @@ -116,6 +117,7 @@ NEED_INTERNAL_FSXATTR = @need_internal_fsxattr@ HAVE_GETFSMAP = @have_getfsmap@ HAVE_STATFS_FLAGS = @have_statfs_flags@ HAVE_MAP_SYNC = @have_map_sync@ +HAVE_DEVMAPPER = @have_devmapper@ GCCFLAGS = -funsigned-char -fno-strict-aliasing -Wall # -Wbitwise -Wno-transparent-union -Wno-old-initializer -Wno-decl diff --git a/io/Makefile b/io/Makefile index 2987ee11..b7585a1b 100644 --- a/io/Makefile +++ b/io/Makefile @@ -107,6 +107,12 @@ ifeq ($(HAVE_MAP_SYNC),yes) LCFLAGS += -DHAVE_MAP_SYNC endif +ifeq ($(HAVE_DEVMAPPER),yes) +CFILES += log_writes.c +LLDLIBS += $(LIBDEVMAPPER) +LCFLAGS += -DHAVE_DEVMAPPER +endif + # On linux we get fsmap from the system or define it ourselves # so include this based on platform type. If this reverts to only # the autoconf check w/o local definition, change to testing HAVE_GETFSMAP diff --git a/io/init.c b/io/init.c index 20d5f80d..34d87b5f 100644 --- a/io/init.c +++ b/io/init.c @@ -72,6 +72,7 @@ init_commands(void) help_init(); imap_init(); inject_init(); + log_writes_init(); madvise_init(); mincore_init(); mmap_init(); diff --git a/io/io.h b/io/io.h index 8b2753b3..9349cc75 100644 --- a/io/io.h +++ b/io/io.h @@ -186,3 +186,9 @@ extern void fsmap_init(void); #else # define fsmap_init() do { } while (0) #endif + +#ifdef HAVE_DEVMAPPER +extern void log_writes_init(void); +#else +#define log_writes_init() do { } while (0) +#endif diff --git a/io/log_writes.c b/io/log_writes.c new file mode 100644 index 00000000..46ea1c26 --- /dev/null +++ b/io/log_writes.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2017 Intel Corporation. + * All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "platform_defs.h" +#include <libdevmapper.h> +#include "command.h" +#include "init.h" + +static cmdinfo_t log_writes_cmd; + +static int +mark_log(const char *device, const char *mark) +{ + struct dm_task *dmt; + const int size = 80; + char message[size]; + int len, ret = 0; + + len = snprintf(message, size, "mark %s", mark); + if (len >= size) { + printf("mark '%s' is too long\n", mark); + return ret; + } + + if (!(dmt = dm_task_create(DM_DEVICE_TARGET_MSG))) + return ret; + + if (!dm_task_set_name(dmt, device)) + goto out; + + if (!dm_task_set_sector(dmt, 0)) + goto out; + + if (!dm_task_set_message(dmt, message)) + goto out; + + if (dm_task_run(dmt)) + ret = 1; +out: + dm_task_destroy(dmt); + return ret; +} + +static int +log_writes_f( + int argc, + char **argv) +{ + const char *device = NULL; + const char *mark = NULL; + int c; + + exitcode = 1; + while ((c = getopt(argc, argv, "d:m:")) != EOF) { + switch (c) { + case 'd': + device = optarg; + break; + case 'm': + mark = optarg; + break; + default: + return command_usage(&log_writes_cmd); + } + } + + if (device == NULL || mark == NULL) + return command_usage(&log_writes_cmd); + + if (mark_log(device, mark)) + exitcode = 0; + + return 0; +} + +void +log_writes_init(void) +{ + log_writes_cmd.name = "log_writes"; + log_writes_cmd.altname = "lw"; + log_writes_cmd.cfunc = log_writes_f; + log_writes_cmd.flags = CMD_NOMAP_OK | CMD_NOFILE_OK | CMD_FOREIGN_OK + | CMD_FLAG_ONESHOT; + log_writes_cmd.argmin = 0; + log_writes_cmd.argmax = -1; + log_writes_cmd.args = _("-d device -m mark"); + log_writes_cmd.oneline = + _("create mark <mark> in the dm-log-writes log specified by <device>"); + + add_command(&log_writes_cmd); +} diff --git a/m4/Makefile b/m4/Makefile index 4706121b..77f2edda 100644 --- a/m4/Makefile +++ b/m4/Makefile @@ -15,6 +15,7 @@ CONFIGURE = \ LSRCFILES = \ manual_format.m4 \ package_blkid.m4 \ + package_devmapper.m4 \ package_globals.m4 \ package_libcdev.m4 \ package_pthread.m4 \ diff --git a/m4/package_devmapper.m4 b/m4/package_devmapper.m4 new file mode 100644 index 00000000..821f283c --- /dev/null +++ b/m4/package_devmapper.m4 @@ -0,0 +1,11 @@ +# +# See if libdevmapper is available on the system. +# +AC_DEFUN([AC_HAVE_DEVMAPPER], +[ AC_SEARCH_LIBS([dm_task_create], [devmapper], + libdevmapper="-ldevmapper" + have_devmapper=yes, + have_devmapper=no,) + AC_SUBST(have_devmapper) + AC_SUBST(libdevmapper) +]) diff --git a/man/man8/xfs_io.8 b/man/man8/xfs_io.8 index 1693f7f1..4fce6d39 100644 --- a/man/man8/xfs_io.8 +++ b/man/man8/xfs_io.8 @@ -1123,7 +1123,27 @@ version of policy structure (numeric) .BR get_encpolicy On filesystems that support encryption, display the encryption policy of the current file. +.RE +.PD +.TP +.BI "log_writes \-d " device " \-m " mark +Create a mark named +.I mark +in the dm-log-writes log specified by +.I device. +This is intended to be equivalent to the shell command: +.B dmsetup message +.I device +.B 0 mark +.I mark +.PD +.RE +.TP +.B lw +See the +.B log_writes +command. .SH SEE ALSO .BR mkfs.xfs (8), .BR xfsctl (3), @@ -1141,4 +1161,5 @@ current file. .BR open (2), .BR pread (2), .BR pwrite (2), -.BR readdir (3). +.BR readdir (3), +.BR dmsetup (8). -- 2.14.3 ^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-12-21 22:20 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-12-21 22:07 [xfsprogs PATCH v4 0/2] Add necessary items for MAP_SYNC testing Ross Zwisler 2017-12-21 22:07 ` [xfsprogs PATCH v4 1/2] xfs_io: add MAP_SYNC support to mmap() Ross Zwisler 2017-12-21 22:18 ` Darrick J. Wong 2017-12-21 22:08 ` [xfsprogs PATCH v4 2/2] xfs_io: add a new 'log_writes' command Ross Zwisler
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).