From: Nathan Scott Date: Fri, 30 Apr 2004 03:50:20 +0000 (+0000) Subject: Update libdisk to extract stripe info from device mapper, for mkfs. X-Git-Tag: v2.7.0~105 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=486700010ef3b23215fe25b5ca41897c8c1cf3f0;p=thirdparty%2Fxfsprogs-dev.git Update libdisk to extract stripe info from device mapper, for mkfs. --- diff --git a/VERSION b/VERSION index bff762b5e..80f357450 100644 --- a/VERSION +++ b/VERSION @@ -3,5 +3,5 @@ # PKG_MAJOR=2 PKG_MINOR=6 -PKG_REVISION=11 +PKG_REVISION=12 PKG_BUILD=1 diff --git a/debian/changelog b/debian/changelog index 32fe62250..ede67c8b5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +xfsprogs (2.6.12-1) unstable; urgency=low + + * New upstream release. + + -- Nathan Scott Fri, 30 Apr 2004 05:13:20 +1000 + xfsprogs (2.6.11-1) unstable; urgency=low * New upstream release. diff --git a/doc/CHANGES b/doc/CHANGES index 0bb7a36c7..ca91e93db 100644 --- a/doc/CHANGES +++ b/doc/CHANGES @@ -1,3 +1,11 @@ +xfsprogs-2.6.12 (30 April 2004) + - Extract stripe unit/width from device mapper devices + (added libdisk infrastructure, used by mkfs.xfs). + - Fix rounding in xfs_io(8) bytes read/written output. + - Sync up user/kernel source in libxfs and headers. + - Fix compiler warnings on 64 bit platforms. + - Update i18n message catalog. + xfsprogs-2.6.11 (15 April 2004) - Fix file descriptor leak in path_to_fshandle. A file was being opened but never closed, regardless of diff --git a/libdisk/Makefile b/libdisk/Makefile index 9be1de3a8..6f3d705ee 100644 --- a/libdisk/Makefile +++ b/libdisk/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2000-2001 Silicon Graphics, Inc. All Rights Reserved. +# Copyright (c) 2000-2001,2004 Silicon Graphics, Inc. All Rights Reserved. # # This program is free software; you can redistribute it and/or modify it # under the terms of version 2 of the GNU General Public License as @@ -39,12 +39,14 @@ LT_REVISION = 0 LT_AGE = 0 CFILES = drivers.c fstype.c pttype.c +HFILES = drivers.h fstype.h pttype.h md.h xvm.h evms.h +LINUX_DRIVERS = dm.c md.c xvm.c evms.c lvm.c + ifeq ($(PKG_PLATFORM),linux) -CFILES += md.c xvm.c evms.c lvm.c +CFILES += $(LINUX_DRIVERS) else -LSRCFILES = md.c xvm.c evms.c lvm.c +LSRCFILES = $(LINUX_DRIVERS) endif -HFILES = drivers.h fstype.h pttype.h md.h xvm.h evms.h default: $(LTLIBRARY) diff --git a/libdisk/dm.c b/libdisk/dm.c new file mode 100644 index 000000000..220bb36c8 --- /dev/null +++ b/libdisk/dm.c @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2004 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of version 2 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. + * + * Further, this software is distributed without any warranty that it is + * free of the rightful claim of any third person regarding infringement + * or the like. Any license provided herein, whether implied or + * otherwise, applies only to this software file. Patent licenses, if + * any, provided herein do not apply to combinations of this program with + * other software, or any other product whatsoever. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write the Free Software Foundation, Inc., 59 + * Temple Place - Suite 330, Boston MA 02111-1307, USA. + * + * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy, + * Mountain View, CA 94043, or: + * + * http://www.sgi.com + * + * For further information regarding this notice, see: + * + * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/ + */ + +#include "drivers.h" + +int +mnt_is_dm_subvol( + dev_t dev) +{ + return get_driver_block_major("device-mapper", major(dev)); +} + +int +dm_get_subvol_stripe( + char *dfile, + sv_type_t type, + int *sunit, + int *swidth, + struct stat64 *sb) +{ + int count, stripes = 0, stripesize = 0; + int dmpipe[2]; + char *dpath, *largv[4], tmppath[PATH_MAX]; + FILE *stream; + long long offset, size; + static char *command = "table"; /* dmsetup table /dev/xxx */ + + if (!mnt_is_dm_subvol(sb->st_rdev)) + return 0; + + /* Quest for dmsetup */ + if (!access("/usr/local/sbin/dmsetup", R_OK|X_OK)) + largv[0] = "/usr/local/sbin/dmsetup"; + else if (!access("/sbin/dmsetup", R_OK|X_OK)) + largv[0] = "/sbin/dmsetup"; + else { + fprintf(stderr, + _("Warning - device mapper device, but no dmsetup(8) found\n")); + return 0; + } + + if (!(dpath = realpath(dfile, tmppath))) { + fprintf(stderr, + _("Warning - device mapper device, but cannot resolve path %s: %s\n"), + dfile, strerror(errno)); + return 0; + } + + largv[1] = command; + largv[2] = dpath; + largv[3] = NULL; + + /* Open pipe */ + if (pipe(dmpipe) < 0) { + fprintf(stderr, _("Could not open pipe\n")); + exit(1); + } + + /* Spawn dmsetup */ + switch (fork()) { + case 0: + /* Plumbing */ + close(dmpipe[0]); + + if (dmpipe[1] != STDOUT_FILENO) + dup2(dmpipe[1], STDOUT_FILENO); + + execv(largv[0], largv); + + fprintf(stderr, _("Failed to execute %s\n"), largv[0]); + exit(1); + + case -1: + fprintf(stderr, _("Failed forking dmsetup process\n")); + exit(1); + + default: + break; + } + + close(dmpipe[1]); + stream = fdopen(dmpipe[0], "r"); + count = fscanf(stream, "%lld %lld striped %d %d ", + &offset, &size, &stripes, &stripesize); + fclose(stream); + if (count != 4) + return 0; + + /* Update sizes */ + *sunit = stripesize; + *swidth = (stripes * stripesize); + return 1; +} diff --git a/libdisk/drivers.c b/libdisk/drivers.c index 9bfb75174..4cbb9344d 100644 --- a/libdisk/drivers.c +++ b/libdisk/drivers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as @@ -46,6 +46,8 @@ get_subvol_stripe_wrapper(char *dev, sv_type_t type, int *sunit, int *swidth) exit(1); } + if ( dm_get_subvol_stripe(dev, type, sunit, swidth, &sb)) + return; if ( md_get_subvol_stripe(dev, type, sunit, swidth, &sb)) return; if ( lvm_get_subvol_stripe(dev, type, sunit, swidth, &sb)) diff --git a/libdisk/drivers.h b/libdisk/drivers.h index cd729cb2e..c712064bc 100644 --- a/libdisk/drivers.h +++ b/libdisk/drivers.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2002 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as @@ -39,12 +39,14 @@ */ #ifdef __linux__ +extern int dm_get_subvol_stripe(char*, sv_type_t, int*, int*, struct stat64*); extern int md_get_subvol_stripe(char*, sv_type_t, int*, int*, struct stat64*); extern int lvm_get_subvol_stripe(char*, sv_type_t, int*, int*, struct stat64*); extern int xvm_get_subvol_stripe(char*, sv_type_t, int*, int*, struct stat64*); extern int evms_get_subvol_stripe(char*, sv_type_t, int*, int*, struct stat64*); #else #define stat64 stat +#define dm_get_subvol_stripe(dev, type, a, b, stat) (-1) #define md_get_subvol_stripe(dev, type, a, b, stat) (-1) #define lvm_get_subvol_stripe(dev, type, a, b, stat) (-1) #define xvm_get_subvol_stripe(dev, type, a, b, stat) (-1) diff --git a/libdisk/lvm.c b/libdisk/lvm.c index ad5e6c104..327808fff 100644 --- a/libdisk/lvm.c +++ b/libdisk/lvm.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000-2003 Silicon Graphics, Inc. All Rights Reserved. + * Copyright (c) 2000-2004 Silicon Graphics, Inc. All Rights Reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as @@ -70,19 +70,11 @@ lvm_get_subvol_stripe( largv[0] = "/sbin/lvdisplay"; else { fprintf(stderr, - "Warning - LVM device, but no lvdisplay(8) found\n"); + _("Warning - LVM device, but no lvdisplay(8) found\n")); return 0; } - /* lvm tools want the full, real path to a logical volume. - * (lvm doesn't really open the file, it just wants a - * string that happens to look like a path :/ ) - */ - if (dfile[0] != '/') { - getcwd(tmppath, MAXPATHLEN); - strcat(tmppath, "/"); - dfile = strcat(tmppath, dfile); - } + /* realpath gives an absolute pathname */ largv[1] = realpath(dfile, tmppath); largv[2] = NULL;