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 */ --- xfsprogs-3.0.3.orig/configure 2009-12-07 17:06:42.472972680 -0600 +++ xfsprogs-3.0.3/configure 2009-12-07 17:08:30.663973127 -0600 @@ -839,6 +839,8 @@ LOCALIZED_FILES enable_lib64 libtermcap +enable_blkid +libblkid enable_editline libeditline enable_readline @@ -931,6 +933,7 @@ enable_readline enable_editline enable_termcap +enable_blkid enable_lib64 ' ac_precious_vars='build_alias @@ -1574,6 +1577,7 @@ --enable-gettext=yes/no Enable alternate language support default=yes --enable-readline=yes/no Enable readline command editing default=no --enable-editline=yes/no Enable editline command editing default=no + --enable-blkid=yes/no Enable block device id library default=no --enable-termcap=yes/no Enable terminal capabilities library default=no --enable-lib64=yes/no Enable lib64 support default=no @@ -10441,6 +10445,15 @@ + +# Check whether --enable-blkid was given. +if test "${enable_blkid+set}" = set; then + enableval=$enable_blkid; test $enable_blkid = yes && libblkid="-lblkid" +fi + + + + # Check whether --enable-lib64 was given. if test "${enable_lib64+set}" = set; then enableval=$enable_lib64;