diff --git a/xfsprogs-3.0.3-libblkid.patch b/xfsprogs-3.0.3-libblkid.patch new file mode 100644 index 0000000..b734b76 --- /dev/null +++ b/xfsprogs-3.0.3-libblkid.patch @@ -0,0 +1,388 @@ +From: Christoph Hellwig +Date: Sat, 10 Oct 2009 21:05:32 +0000 (-0400) +Subject: allow linking against libblkid instead of libdisk +X-Git-Url: http://git.kernel.org/?p=fs%2Fxfs%2Fxfsprogs-dev.git;a=commitdiff_plain;h=e4da994184266c7f89da03a86a3f52dde478137b + +allow linking against libblkid instead of libdisk + +Add a new --enable-blkid switch to use libblkid from util-linux to detect +the device geometry and check for existing partitions or filesystem on a +device. Note that this requires the latest blkid from util-linux-ng git +for the topology calls, odler ones won't work. If I had a little more +autoconf fu we might be able to detect a too early one, but right now it +just fails if it's too old and --enable-blkid is specified. We also +stop building libdisk in the blkid case as it's an internal static library +not otherwise used. + +For the actual checks I tried to stay as close as possible to the old +code, so we still don't check topology for external log devices. I hope +to add this at a later stage. + +As a small addition we also print a warning if trying to create a filesystem +on a partition that is not properly aligned. + +Signed-off-by: Christoph Hellwig +Reviewed-by: Eric Sandeen +--- + +Index: xfsprogs-3.0.3/Makefile +=================================================================== +--- xfsprogs-3.0.3.orig/Makefile ++++ xfsprogs-3.0.3/Makefile +@@ -18,10 +18,14 @@ LDIRT = config.log .dep config.status co + Logs/* built .census install.* install-dev.* *.gz autom4te.cache/* \ + libtool include/builddefs include/platform_defs.h + +-LIB_SUBDIRS = libxfs libxlog libxcmd libhandle libdisk ++LIB_SUBDIRS = libxfs libxlog libxcmd libhandle $(LDISK) + TOOL_SUBDIRS = copy db estimate fsck fsr growfs io logprint mkfs quota \ + mdrestore repair rtcp m4 man doc po debian build + ++ifneq ($(ENABLE_BLKID), yes) ++LIB_SUBDIRS += libdisk ++endif ++ + SUBDIRS = include $(LIB_SUBDIRS) $(TOOL_SUBDIRS) + + default: include/builddefs include/platform_defs.h +@@ -38,10 +42,14 @@ db logprint: libxfs libxlog + fsr: libhandle + growfs: libxfs libxcmd + io: libxcmd libhandle +-mkfs: libxfs libdisk ++mkfs: libxfs + quota: libxcmd + repair: libxfs libxlog + ++ifneq ($(ENABLE_BLKID), yes) ++mkfs: libdisk ++endif ++ + ifeq ($(HAVE_BUILDDEFS), yes) + include $(BUILDRULES) + else +Index: xfsprogs-3.0.3/configure.in +=================================================================== +--- xfsprogs-3.0.3.orig/configure.in ++++ xfsprogs-3.0.3/configure.in +@@ -35,6 +35,12 @@ AC_ARG_ENABLE(termcap, + test $enable_termcap = yes && libtermcap="-ltermcap",) + AC_SUBST(libtermcap) + ++AC_ARG_ENABLE(blkid, ++[ --enable-blkid=[yes/no] Enable block device id library [default=no]], ++ test $enable_blkid = yes && libblkid="-lblkid",) ++AC_SUBST(libblkid) ++AC_SUBST(enable_blkid) ++ + AC_ARG_ENABLE(lib64, + [ --enable-lib64=[yes/no] Enable lib64 support [default=no]],, + enable_lib64=no) +Index: xfsprogs-3.0.3/include/builddefs.in +=================================================================== +--- xfsprogs-3.0.3.orig/include/builddefs.in ++++ xfsprogs-3.0.3/include/builddefs.in +@@ -31,6 +31,7 @@ LIBPTHREAD = @libpthread@ + LIBTERMCAP = @libtermcap@ + LIBEDITLINE = @libeditline@ + LIBREADLINE = @libreadline@ ++LIBBLKID = @libblkid@ + LIBXFS = $(TOPDIR)/libxfs/libxfs.la + LIBXCMD = $(TOPDIR)/libxcmd/libxcmd.la + LIBXLOG = $(TOPDIR)/libxlog/libxlog.la +@@ -85,6 +86,7 @@ ENABLE_SHARED = @enable_shared@ + ENABLE_GETTEXT = @enable_gettext@ + ENABLE_EDITLINE = @enable_editline@ + ENABLE_READLINE = @enable_readline@ ++ENABLE_BLKID = @enable_blkid@ + + HAVE_ZIPPED_MANPAGES = @have_zipped_manpages@ + +Index: xfsprogs-3.0.3/mkfs/Makefile +=================================================================== +--- xfsprogs-3.0.3.orig/mkfs/Makefile ++++ xfsprogs-3.0.3/mkfs/Makefile +@@ -11,14 +11,27 @@ FSTYP = fstyp + HFILES = xfs_mkfs.h + CFILES = maxtrres.c proto.c xfs_mkfs.c + +-LLDLIBS = $(LIBXFS) $(LIBUUID) $(LIBDISK) $(LIBRT) $(LIBPTHREAD) +-LTDEPENDENCIES = $(LIBXFS) $(LIBDISK) ++LLDLIBS = $(LIBXFS) $(LIBUUID) $(LIBRT) $(LIBPTHREAD) ++LTDEPENDENCIES = $(LIBXFS) + LLDFLAGS = -static + ++ifeq ($(ENABLE_BLKID),yes) ++LLDLIBS += $(LIBBLKID) ++CFLAGS += -DENABLE_BLKID ++else ++LLDLIBS += $(LIBDISK) ++LTDEPENDENCIES += $(LIBDISK) ++endif ++ ++ + LSRCFILES = $(FSTYP).c + LDIRT = $(FSTYP) + +-default: $(FSTYP) $(LTCOMMAND) ++default: $(LTCOMMAND) ++ ++ifneq ($(ENABLE_BLKID),yes) ++default: $(FSTYP) ++endif + + include $(BUILDRULES) + +Index: xfsprogs-3.0.3/mkfs/xfs_mkfs.c +=================================================================== +--- xfsprogs-3.0.3.orig/mkfs/xfs_mkfs.c ++++ xfsprogs-3.0.3/mkfs/xfs_mkfs.c +@@ -17,12 +17,26 @@ + */ + + #include ++#include ++#ifdef ENABLE_BLKID ++#include ++#else + #include + #include +-#include ++#endif + #include "xfs_mkfs.h" + + /* ++ * Device topology information. ++ */ ++struct fs_topology { ++ int dsunit; /* stripe unit - data subvolume */ ++ int dswidth; /* stripe width - data subvolume */ ++ int rtswidth; /* stripe width - rt subvolume */ ++ int sectoralign; ++}; ++ ++/* + * Prototypes for internal functions. + */ + static void conflict(char opt, char *tab[], int oldidx, int newidx); +@@ -266,6 +280,105 @@ calc_stripe_factors( + } + } + ++#ifdef ENABLE_BLKID ++static int ++check_overwrite( ++ char *device) ++{ ++ const char *type; ++ blkid_probe pr; ++ int ret = 0; ++ ++ if (!device || !*device) ++ return 0; ++ ++ pr = blkid_new_probe_from_filename(device); ++ if (!pr) ++ return -1; ++ ++ if (blkid_probe_enable_partitions(pr, 1)) ++ goto out_free_probe; ++ ++ if (blkid_do_fullprobe(pr)) ++ goto out_free_probe; ++ ++ if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) { ++ fprintf(stderr, ++ _("%s: %s appears to contain an existing " ++ "filesystem (%s).\n"), progname, device, type); ++ ret = 1; ++ } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) { ++ fprintf(stderr, ++ _("%s: %s appears to contain a partition " ++ "table (%s).\n"), progname, device, type); ++ ret = 1; ++ } ++ ++out_free_probe: ++ blkid_free_probe(pr); ++ return ret; ++} ++ ++static void blkid_get_topology(const char *device, int *sunit, int *swidth) ++{ ++ blkid_topology tp; ++ blkid_probe pr; ++ unsigned long val; ++ ++ pr = blkid_new_probe_from_filename(device); ++ if (!pr) ++ return; ++ ++ tp = blkid_probe_get_topology(pr); ++ if (!tp) ++ goto out_free_probe; ++ ++ /* ++ * Blkid reports the information in terms of bytes, but we want it in ++ * terms of 512 bytes blocks (just to convert it to bytes later..) ++ * ++ * If the reported values are just the normal 512 byte block size ++ * do not bother to report anything. It will just causes warnings ++ * if people specifier larger stripe units or widths manually. ++ */ ++ val = blkid_topology_get_minimum_io_size(tp) >> 9; ++ if (val > 1) ++ *sunit = val; ++ val = blkid_topology_get_optimal_io_size(tp) >> 9; ++ if (val > 1) ++ *swidth = val; ++ ++ if (blkid_topology_get_alignment_offset(tp) != 0) { ++ fprintf(stderr, ++ _("warning: device is not properly aligned %s\n"), ++ device); ++ } ++ ++ blkid_free_probe(pr); ++ return; ++ ++out_free_probe: ++ blkid_free_probe(pr); ++ fprintf(stderr, ++ _("warning: unable to probe device toplology for device %s\n"), ++ device); ++} ++ ++static void get_topology(libxfs_init_t *xi, struct fs_topology *ft) ++{ ++ if (!xi->disfile) { ++ const char *dfile = xi->volname ? xi->volname : xi->dname; ++ ++ blkid_get_topology(dfile, &ft->dsunit, &ft->dswidth); ++ } ++ ++ if (xi->rtname && !xi->risfile) { ++ int dummy; ++ ++ blkid_get_topology(xi->rtname, &dummy, &ft->rtswidth); ++ } ++} ++#else /* ENABLE_BLKID */ + static int + check_overwrite( + char *device) +@@ -289,6 +402,24 @@ check_overwrite( + return 0; + } + ++static void get_topology(libxfs_init_t *xi, struct fs_topology *ft) ++{ ++ char *dfile = xi->volname ? xi->volname : xi->dname; ++ ++ if (!xi->disfile) { ++ get_subvol_stripe_wrapper(dfile, SVTYPE_DATA, ++ &ft->dsunit, &ft->dswidth, &ft->sectoralign); ++ } ++ ++ if (xi->rtname && !xi->risfile) { ++ int dummy1; ++ ++ get_subvol_stripe_wrapper(dfile, SVTYPE_RT, &dummy1, ++ &ft->rtswidth, &dummy1); ++ } ++} ++#endif /* ENABLE_BLKID */ ++ + static void + fixup_log_stripe_unit( + int lsflag, +@@ -691,7 +822,6 @@ main( + char *rtfile; + char *rtsize; + xfs_sb_t *sbp; +- int sectoralign; + int sectorlog; + unsigned int sectorsize; + __uint64_t sector_mask; +@@ -701,8 +831,7 @@ main( + uuid_t uuid; + int worst_freelist; + libxfs_init_t xi; +- int xlv_dsunit; +- int xlv_dswidth; ++ struct fs_topology ft; + int lazy_sb_counters; + + progname = basename(argv[0]); +@@ -1392,12 +1521,10 @@ main( + usage(); + } + +- sectoralign = 0; +- xlv_dsunit = xlv_dswidth = 0; +- if (!xi.disfile) +- get_subvol_stripe_wrapper(dfile, SVTYPE_DATA, +- &xlv_dsunit, &xlv_dswidth, §oralign); +- if (sectoralign) { ++ memset(&ft, 0, sizeof(ft)); ++ get_topology(&xi, &ft); ++ ++ if (ft.sectoralign) { + sectorsize = blocksize; + sectorlog = libxfs_highbit32(sectorsize); + if (loginternal) { +@@ -1545,14 +1672,15 @@ main( + * and the underlying volume is striped, then set rtextblocks + * to the stripe width. + */ +- int dummy1, rswidth; ++ int rswidth; + __uint64_t rtextbytes; + +- dummy1 = rswidth = 0; ++ rswidth = 0; + + if (!norsflag && !xi.risfile && !(!rtsize && xi.disfile)) +- get_subvol_stripe_wrapper(dfile, SVTYPE_RT, &dummy1, +- &rswidth, &dummy1); ++ rswidth = ft.rtswidth; ++ else ++ rswidth = 0; + + /* check that rswidth is a multiple of fs blocksize */ + if (!norsflag && rswidth && !(BBTOB(rswidth) % blocksize)) { +@@ -1793,27 +1921,27 @@ _("size %s specified for log subvolume i + agsize = dblocks / agcount + (dblocks % agcount != 0); + else + calc_default_ag_geometry(blocklog, dblocks, +- xlv_dsunit | xlv_dswidth, &agsize, &agcount); ++ ft.dsunit | ft.dswidth, &agsize, &agcount); + + if (!nodsflag) { + if (dsunit) { +- if (xlv_dsunit && xlv_dsunit != dsunit) { ++ if (ft.dsunit && ft.dsunit != dsunit) { + fprintf(stderr, + _("%s: Specified data stripe unit %d " + "is not the same as the volume stripe " + "unit %d\n"), +- progname, dsunit, xlv_dsunit); ++ progname, dsunit, ft.dsunit); + } +- if (xlv_dswidth && xlv_dswidth != dswidth) { ++ if (ft.dswidth && ft.dswidth != dswidth) { + fprintf(stderr, + _("%s: Specified data stripe width %d " + "is not the same as the volume stripe " + "width %d\n"), +- progname, dswidth, xlv_dswidth); ++ progname, dswidth, ft.dswidth); + } + } else { +- dsunit = xlv_dsunit; +- dswidth = xlv_dswidth; ++ dsunit = ft.dsunit; ++ dswidth = ft.dswidth; + nodsflag = 1; + } + } /* else dsunit & dswidth can't be set if nodsflag is set */ diff --git a/xfsprogs-3.0.3-trim.patch b/xfsprogs-3.0.3-trim.patch new file mode 100644 index 0000000..8ba97a0 --- /dev/null +++ b/xfsprogs-3.0.3-trim.patch @@ -0,0 +1,181 @@ +From: Christoph Hellwig +Date: Tue, 13 Oct 2009 22:28:52 +0000 (+0200) +Subject: mkfs: add discard support +X-Git-Url: http://git.kernel.org/?p=fs%2Fxfs%2Fxfsprogs-dev.git;a=commitdiff_plain;h=ad136b3382919e93cc692b54f735fad8b35e88fe + +mkfs: add discard support + +Call the BLKDISCARD ioctl to mark the whole disk as unused before creating +a new filesystem. This will allow SSDs, Arrays with thin provisioning support +and virtual machines to make smarter allocation decisions. + +Add a new -K option to prevent mkfs from discarding blocks to aid +trouble-shooting or specialized requirements. + +Signed-off-by: Christoph Hellwig +Reviewed-by: Eric Sandeen +Reviewed-by: Andi Kleen +--- + +Index: xfsprogs-3.0.3/include/darwin.h +=================================================================== +--- xfsprogs-3.0.3.orig/include/darwin.h ++++ xfsprogs-3.0.3/include/darwin.h +@@ -154,4 +154,10 @@ typedef unsigned char uchar_t; + + #define HAVE_FID 1 + ++static __inline__ int ++platform_discard_blocks(int fd, off64_t start, off64_t end) ++{ ++ return 0; ++} ++ + #endif /* __XFS_DARWIN_H__ */ +Index: xfsprogs-3.0.3/include/freebsd.h +=================================================================== +--- xfsprogs-3.0.3.orig/include/freebsd.h ++++ xfsprogs-3.0.3/include/freebsd.h +@@ -139,4 +139,10 @@ static __inline__ void platform_uuid_cop + memcpy(dst, src, sizeof(uuid_t)); + } + ++static __inline__ int ++platform_discard_blocks(int fd, off64_t start, off64_t end) ++{ ++ return 0; ++} ++ + #endif /* __XFS_FREEBSD_H__ */ +Index: xfsprogs-3.0.3/include/irix.h +=================================================================== +--- xfsprogs-3.0.3.orig/include/irix.h ++++ xfsprogs-3.0.3/include/irix.h +@@ -337,6 +337,12 @@ static __inline__ void platform_uuid_cop + memcpy(dst, src, sizeof(uuid_t)); + } + ++static __inline__ int ++platform_discard_blocks(int fd, off64_t start, off64_t end) ++{ ++ return 0; ++} ++ + static __inline__ char * strsep(char **s, const char *ct) + { + char *sbegin = *s, *end; +Index: xfsprogs-3.0.3/include/linux.h +=================================================================== +--- xfsprogs-3.0.3.orig/include/linux.h ++++ xfsprogs-3.0.3/include/linux.h +@@ -93,6 +93,20 @@ static __inline__ void platform_uuid_cop + uuid_copy(*dst, *src); + } + ++#ifndef BLKDISCARD ++#define BLKDISCARD _IO(0x12,119) ++#endif ++ ++static __inline__ int ++platform_discard_blocks(int fd, off64_t start, off64_t end) ++{ ++ __uint64_t range[2] = { start, end }; ++ ++ if (ioctl(fd, BLKDISCARD, &range) < 0) ++ return errno; ++ return 0; ++} ++ + #if (__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ <= 1)) + # define constpp const char * const * + #else +Index: xfsprogs-3.0.3/man/man8/mkfs.xfs.8 +=================================================================== +--- xfsprogs-3.0.3.orig/man/man8/mkfs.xfs.8 ++++ xfsprogs-3.0.3/man/man8/mkfs.xfs.8 +@@ -36,6 +36,8 @@ mkfs.xfs \- construct an XFS filesystem + .I label + ] [ + .B \-N ++] [ ++.B \-K + ] + .I device + .SH DESCRIPTION +@@ -715,6 +717,9 @@ manual entries for additional informatio + .B \-N + Causes the file system parameters to be printed out without really + creating the file system. ++.TP ++.B \-K ++Do not attempt to discard blocks at mkfs time. + .SH SEE ALSO + .BR xfs (5), + .BR mkfs (8), +Index: xfsprogs-3.0.3/mkfs/xfs_mkfs.c +=================================================================== +--- xfsprogs-3.0.3.orig/mkfs/xfs_mkfs.c ++++ xfsprogs-3.0.3/mkfs/xfs_mkfs.c +@@ -735,6 +735,20 @@ done: + free(buf); + } + ++static void ++discard_blocks(dev_t dev, __uint64_t nsectors) ++{ ++ int fd; ++ ++ /* ++ * We intentionally ignore errors from the discard ioctl. It is ++ * not necessary for the mkfs functionality but just an optimization. ++ */ ++ fd = libxfs_device_to_fd(dev); ++ if (fd > 0) ++ platform_discard_blocks(fd, 0, nsectors << 9); ++} ++ + int + main( + int argc, +@@ -811,6 +825,7 @@ main( + int nvflag; + int nci; + int Nflag; ++ int discard = 1; + char *p; + char *protofile; + char *protostring; +@@ -869,7 +884,7 @@ main( + xi.isdirect = LIBXFS_DIRECT; + xi.isreadonly = LIBXFS_EXCLUSIVELY; + +- while ((c = getopt(argc, argv, "b:d:i:l:L:n:Np:qr:s:CfV")) != EOF) { ++ while ((c = getopt(argc, argv, "b:d:i:l:L:n:KNp:qr:s:CfV")) != EOF) { + switch (c) { + case 'C': + case 'f': +@@ -1385,6 +1400,9 @@ main( + case 'N': + Nflag = 1; + break; ++ case 'K': ++ discard = 0; ++ break; + case 'p': + if (protofile) + respec('p', NULL, 0); +@@ -1772,6 +1790,14 @@ main( + } + } + ++ if (discard) { ++ discard_blocks(xi.ddev, xi.dsize); ++ if (xi.rtdev) ++ discard_blocks(xi.rtdev, xi.rtsize); ++ if (xi.logdev && xi.logdev != xi.ddev) ++ discard_blocks(xi.logdev, xi.logBBsize); ++ } ++ + if (!liflag && !ldflag) + loginternal = xi.logdev == 0; + if (xi.logname) diff --git a/xfsprogs.spec b/xfsprogs.spec index 5640a28..c0df91c 100644 --- a/xfsprogs.spec +++ b/xfsprogs.spec @@ -1,7 +1,7 @@ Summary: Utilities for managing the XFS filesystem Name: xfsprogs Version: 3.0.3 -Release: 1%{?dist} +Release: 2%{?dist} # Licensing based on generic "GNU GENERAL PUBLIC LICENSE" # in source, with no mention of version. # doc/COPYING file specifies what is GPL and what is LGPL @@ -18,9 +18,11 @@ Obsoletes: xfs-cmds <= %{version} Conflicts: xfsdump < 3.0.1 # Upstream patches: +Patch1: xfsprogs-3.0.3-trim.patch +Patch2: xfsprogs-3.0.3-libblkid.patch # Not-yet-upstream patches: -Patch1: xfsprogs-3.0.1-mkfs-lazy-count-default.patch +Patch10: xfsprogs-3.0.1-mkfs-lazy-count-default.patch %description A set of commands to use the XFS filesystem, including mkfs.xfs. @@ -66,6 +68,9 @@ in building or running the xfstests QA suite. %setup -q %patch1 -p1 +%patch2 -p1 + +%patch10 -p1 %build export tagname=CC DEBUG=-DNDEBUG @@ -192,6 +197,9 @@ rm -rf $RPM_BUILD_ROOT %{_includedir}/xfs/xfs_types.h %changelog +* Tue Nov 10 2009 Eric Sandeen 3.0.3-2 +- Add trim/discard & libblkid support + * Tue Sep 01 2009 Eric Sandeen 3.0.3-1 - New upstream release