Message ID | 20180613225057.GB9432@magnolia (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jun 13, 2018 at 03:50:57PM -0700, Darrick J. Wong wrote: > From: Darrick J. Wong <darrick.wong@oracle.com> > > Since XFS has deprecated FIBMAP on FSDAX filesystems, we can't use > FIBMAP to verify stripe alignment anymore. FIEMAP has existed for quite > some time now, so port it to use that instead, and only fall back to > FIBMAP if FIEMAP doesn't exist. > > Tested-by: ross.zwisler@linux.intel.com > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> > --- > src/t_stripealign.c | 72 +++++++++++++++++++++++++++++++++++++++++++-------- > 1 file changed, 61 insertions(+), 11 deletions(-) > > diff --git a/src/t_stripealign.c b/src/t_stripealign.c > index 05ed36b5..690f743a 100644 > --- a/src/t_stripealign.c > +++ b/src/t_stripealign.c > @@ -17,8 +17,13 @@ > #include <fcntl.h> > #include <stdio.h> > #include <sys/ioctl.h> > +#include <linux/fiemap.h> > +#include <linux/fs.h> As it requires <linux/fiemap.h> now, looks like we should update src/Makefile too to only compile it when "HAVE_FIEMAP" is true. ifeq ($(HAVE_FIEMAP), true) LINUX_TARGETS += fiemap-tester t_stripealign endif Thanks, Eryu P.S. LINUX_TARGETS could be cleaned up and merged with TARGETS, it's useless to have both TARGETS and LINUX_TARGETS defined now, as we only support Linux platform, but that's a different issue. > > -#define FIBMAP _IO(0x00, 1) /* bmap access */ > +#define FIEMAP_EXTENT_ACCEPTABLE (FIEMAP_EXTENT_LAST | \ > + FIEMAP_EXTENT_DATA_ENCRYPTED | FIEMAP_EXTENT_ENCODED | \ > + FIEMAP_EXTENT_UNWRITTEN | FIEMAP_EXTENT_MERGED | \ > + FIEMAP_EXTENT_SHARED) > > /* > * If only filename given, print first block. > @@ -28,11 +33,14 @@ > > int main(int argc, char ** argv) > { > - int fd; > - int ret; > - int sunit = 0; /* in blocks */ > - char *filename; > - unsigned int block = 0; > + struct stat sb; > + struct fiemap *fie; > + struct fiemap_extent *fe; > + int fd; > + int ret; > + int sunit = 0; /* in blocks */ > + char *filename; > + unsigned long long block; > > if (argc < 3) { > printf("Usage: %s <filename> <sunit in blocks>\n", argv[0]); > @@ -48,21 +56,63 @@ int main(int argc, char ** argv) > return 1; > } > > - ret = ioctl(fd, FIBMAP, &block); > - if (ret < 0) { > + ret = fstat(fd, &sb); > + if (ret) { > + perror(filename); > close(fd); > - perror("fibmap"); > return 1; > } > > - close(fd); > + fie = calloc(1, sizeof(struct fiemap) + sizeof(struct fiemap_extent)); > + if (!fie) { > + close(fd); > + perror("malloc"); > + return 1; > + } > + fie->fm_length = 1; > + fie->fm_flags = FIEMAP_FLAG_SYNC; > + fie->fm_extent_count = 1; > + > + ret = ioctl(fd, FS_IOC_FIEMAP, fie); > + if (ret < 0) { > + unsigned int bmap = 0; > + > + ret = ioctl(fd, FIBMAP, &bmap); > + if (ret < 0) { > + perror("fibmap"); > + free(fie); > + close(fd); > + return 1; > + } > + block = bmap; > + goto check; > + } > > + > + if (fie->fm_mapped_extents != 1) { > + printf("%s: no extents?\n", filename); > + free(fie); > + close(fd); > + return 1; > + } > + fe = &fie->fm_extents[0]; > + if (fe->fe_flags & ~FIEMAP_EXTENT_ACCEPTABLE) { > + printf("%s: bad flags 0x%x\n", filename, fe->fe_flags); > + free(fie); > + close(fd); > + return 1; > + } > + > + block = fie->fm_extents[0].fe_physical / sb.st_blksize; > +check: > if (block % sunit) { > - printf("%s: Start block %u not multiple of sunit %u\n", > + printf("%s: Start block %llu not multiple of sunit %u\n", > filename, block, sunit); > return 1; > } else > printf("%s: well-aligned\n", filename); > + free(fie); > + close(fd); > > return 0; > } -- To unsubscribe from this list: send the line "unsubscribe fstests" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, Jun 15, 2018 at 10:49:01AM +0800, Eryu Guan wrote: > On Wed, Jun 13, 2018 at 03:50:57PM -0700, Darrick J. Wong wrote: > > From: Darrick J. Wong <darrick.wong@oracle.com> > > > > Since XFS has deprecated FIBMAP on FSDAX filesystems, we can't use > > FIBMAP to verify stripe alignment anymore. FIEMAP has existed for quite > > some time now, so port it to use that instead, and only fall back to > > FIBMAP if FIEMAP doesn't exist. > > > > Tested-by: ross.zwisler@linux.intel.com > > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com> > > --- > > src/t_stripealign.c | 72 +++++++++++++++++++++++++++++++++++++++++++-------- > > 1 file changed, 61 insertions(+), 11 deletions(-) > > > > diff --git a/src/t_stripealign.c b/src/t_stripealign.c > > index 05ed36b5..690f743a 100644 > > --- a/src/t_stripealign.c > > +++ b/src/t_stripealign.c > > @@ -17,8 +17,13 @@ > > #include <fcntl.h> > > #include <stdio.h> > > #include <sys/ioctl.h> > > +#include <linux/fiemap.h> > > +#include <linux/fs.h> > > As it requires <linux/fiemap.h> now, looks like we should update > src/Makefile too to only compile it when "HAVE_FIEMAP" is true. > > ifeq ($(HAVE_FIEMAP), true) > LINUX_TARGETS += fiemap-tester t_stripealign > endif JFYI, I fixed it on commit (also remove t_stripealign from TARGETS). Thanks, Eryu -- To unsubscribe from this list: send the line "unsubscribe fstests" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/src/t_stripealign.c b/src/t_stripealign.c index 05ed36b5..690f743a 100644 --- a/src/t_stripealign.c +++ b/src/t_stripealign.c @@ -17,8 +17,13 @@ #include <fcntl.h> #include <stdio.h> #include <sys/ioctl.h> +#include <linux/fiemap.h> +#include <linux/fs.h> -#define FIBMAP _IO(0x00, 1) /* bmap access */ +#define FIEMAP_EXTENT_ACCEPTABLE (FIEMAP_EXTENT_LAST | \ + FIEMAP_EXTENT_DATA_ENCRYPTED | FIEMAP_EXTENT_ENCODED | \ + FIEMAP_EXTENT_UNWRITTEN | FIEMAP_EXTENT_MERGED | \ + FIEMAP_EXTENT_SHARED) /* * If only filename given, print first block. @@ -28,11 +33,14 @@ int main(int argc, char ** argv) { - int fd; - int ret; - int sunit = 0; /* in blocks */ - char *filename; - unsigned int block = 0; + struct stat sb; + struct fiemap *fie; + struct fiemap_extent *fe; + int fd; + int ret; + int sunit = 0; /* in blocks */ + char *filename; + unsigned long long block; if (argc < 3) { printf("Usage: %s <filename> <sunit in blocks>\n", argv[0]); @@ -48,21 +56,63 @@ int main(int argc, char ** argv) return 1; } - ret = ioctl(fd, FIBMAP, &block); - if (ret < 0) { + ret = fstat(fd, &sb); + if (ret) { + perror(filename); close(fd); - perror("fibmap"); return 1; } - close(fd); + fie = calloc(1, sizeof(struct fiemap) + sizeof(struct fiemap_extent)); + if (!fie) { + close(fd); + perror("malloc"); + return 1; + } + fie->fm_length = 1; + fie->fm_flags = FIEMAP_FLAG_SYNC; + fie->fm_extent_count = 1; + + ret = ioctl(fd, FS_IOC_FIEMAP, fie); + if (ret < 0) { + unsigned int bmap = 0; + + ret = ioctl(fd, FIBMAP, &bmap); + if (ret < 0) { + perror("fibmap"); + free(fie); + close(fd); + return 1; + } + block = bmap; + goto check; + } + + if (fie->fm_mapped_extents != 1) { + printf("%s: no extents?\n", filename); + free(fie); + close(fd); + return 1; + } + fe = &fie->fm_extents[0]; + if (fe->fe_flags & ~FIEMAP_EXTENT_ACCEPTABLE) { + printf("%s: bad flags 0x%x\n", filename, fe->fe_flags); + free(fie); + close(fd); + return 1; + } + + block = fie->fm_extents[0].fe_physical / sb.st_blksize; +check: if (block % sunit) { - printf("%s: Start block %u not multiple of sunit %u\n", + printf("%s: Start block %llu not multiple of sunit %u\n", filename, block, sunit); return 1; } else printf("%s: well-aligned\n", filename); + free(fie); + close(fd); return 0; }