* Tue Nov 10 2009 Eric Sandeen <sandeen@redhat.com> 3.0.3-2

- Add trim/discard & libblkid support
This commit is contained in:
Eric Sandeen 2009-11-10 23:45:50 +00:00
parent 0e54226069
commit e131f8ad55
3 changed files with 579 additions and 2 deletions

View File

@ -0,0 +1,388 @@
From: Christoph Hellwig <hch@lst.de>
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 <hch@lst.de>
Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
---
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 <xfs/libxfs.h>
+#include <ctype.h>
+#ifdef ENABLE_BLKID
+#include <blkid/blkid.h>
+#else
#include <disk/fstyp.h>
#include <disk/volume.h>
-#include <ctype.h>
+#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, &sectoralign);
- 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 */

181
xfsprogs-3.0.3-trim.patch Normal file
View File

@ -0,0 +1,181 @@
From: Christoph Hellwig <hch@lst.de>
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 <hch@lst.de>
Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
Reviewed-by: Andi Kleen <andi@firstfloor.org>
---
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)

View File

@ -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 <sandeen@redhat.com> 3.0.3-2
- Add trim/discard & libblkid support
* Tue Sep 01 2009 Eric Sandeen <sandeen@redhat.com> 3.0.3-1
- New upstream release