[dm-devel] [PATCH] self-contained "kpartx kicker"

christophe varoqui christophe.varoqui at free.fr
Thu Apr 7 22:38:08 UTC 2005


Merged in pre10
Will appear soon on the website

On jeu, 2005-04-07 at 15:49 -0400, k-ueda at ct.jp.nec.com wrote:
> Hello Christophe, Alasdair,
> 
> Thank you for some comments.
> I attach the fixed patch.
> 
> On Thu, 7 Apr 2005 10:15:08 +0200, Christophe Varoqui <christophe.varoqui at free.fr> wrote:
> > It's a nice to have feature, but I don't really understand the 
> > reasons you present :
> > kpartx needs running only after multipath, if multipath is execed
> > from initrd why bother doing kpartx in initramfs ?
> > 
> > Either we need to do the same "hotplug mode" in multipath too, or nothing.
> > 
> > I guess the former brings more freedom to distributors as they can
> > choose how they want to run, and it is overall good for performance
> > and memory utilisation.
> 
> In boot up sequence, the init process execs /init.
> nash is a very small shell used in /init of Fedora, Red Hat
> Enterprise Linux, etc.
> nash has very limited functions, e.g. it doesn't have control 
> statements (like if, for, while) and shell variables.
> 
> This is enough for commands like multipath, lvm, dmraid which scan
> devices themselves for set up.  For example, the set up of multipath
> can be written in /init like following.
> So no need for the self-contained "hotplug mode" in multipath.
> 
> ------------------------------
> #!/sbin/nash
> ...
> snip
> ...
> insmod "SCSI-DRIVERS"
> insmod "DM-MULTIPATH-MODULES"
> /sbin/multipath -v0 -S
> ------------------------------
> 
> On the other hand, we have to specify a device for kpartx.
> As we can't know what devices will be created by multipath command
> in the system, script can't be written in /init.
> So self-contained "hotplug mode" is needed in only kpartx.
> 
> Best regards,
> Ky (Kiyoshi Ueda)
> 
> 
> diff -rup multipath-tools-0.4.4-pre8/kpartx/kpartx.c kpartx-0.4.4-pre8/kpartx/kpartx.c
> --- multipath-tools-0.4.4-pre8/kpartx/kpartx.c	2005-02-20 17:15:50.000000000 -0500
> +++ kpartx-0.4.4-pre8/kpartx/kpartx.c	2005-04-07 14:12:08.000000000 -0400
> @@ -22,6 +22,7 @@
>  #include <ctype.h>
>  #include <libdevmapper.h>
>  #include <devmapper.h>
> +#include <linux/kdev_t.h>
>  
>  #include "crc32.h"
>  
> @@ -124,7 +125,43 @@ find_devname_offset (char * device)
>  
>  	return (int)(q - device) + 1;
>  }
> -			
> +
> +static char *
> +get_hotplug_device()
> +{
> +	unsigned int major, minor, off, len;
> +	char *mapname = NULL, *devname = NULL, *device = NULL;
> +	struct stat buf;
> +
> +	if(strcmp(getenv("ACTION"), "add"))
> +		return NULL;
> +
> +	/* Get dm mapname for hotpluged device. */
> +	if (!(devname = getenv("DEVNAME")))
> +		return NULL;
> +	if (stat(devname, &buf))
> +		return NULL;
> +	major = (unsigned int)MAJOR(buf.st_rdev);
> +	minor = (unsigned int)MINOR(buf.st_rdev);
> +	if (!(mapname = dm_mapname(major, minor))) /* Not dm device. */
> +		return NULL;
> +
> +	off = find_devname_offset(devname);
> +	len = strlen(mapname);
> +	/* Dirname + mapname + \0 */
> +	if (!(device = (char *)malloc(sizeof(char) * (off + len + 1))))
> +		return NULL;
> +
> +	/* Create new device name. */
> +	snprintf(device, off + 1, "%s", devname);
> +	snprintf(device + off, len + 1, "%s", mapname);
> +	if (strlen(device) != (off + len)) {
> +		return NULL;
> +	}
> +
> +	return device;
> +}
> +
>  int
>  main(int argc, char **argv){
>          int fd, i, j, k, n, op, off, arg;
> @@ -132,12 +169,14 @@ main(int argc, char **argv){
>  	struct pt *ptp;
>  	enum action what = LIST;
>  	char *p, *type, *diskdevice, *device;
> +	char *progname;
>  	int lower, upper;
>  	int verbose = 0;
>  	char partname[PARTNAME_SIZE], params[PARTNAME_SIZE + 16];
>  	char * loopdev = NULL;
>  	char * delim = NULL;
>  	int loopro = 0;
> +	int hotplug = 0;
>  	struct stat buf;
>  
>  	initpts();
> @@ -147,8 +186,22 @@ main(int argc, char **argv){
>  	type = device = diskdevice = NULL;
>  	memset(&all, 0, sizeof(all));
>  	memset(&partname, 0, sizeof(partname));
> -	
> -	if (argc < 2) {
> +
> +	/* Check whether hotplug mode. */
> +	progname = strrchr(argv[0], '/');
> +	if (!progname)
> +		progname = argv[0];
> +	else
> +		progname++;
> +	if (!strcmp(progname, "kpartx.dev")) { /* Hotplug mode */
> +		hotplug = 1;
> +
> +		/* Setup for original kpartx variables */
> +		if (!(device = get_hotplug_device()))
> +			exit(1);
> +		diskdevice = device;
> +		what = ADD;
> +	} else if (argc < 2) {
>  		usage();
>  		exit(1);
>  	}
> @@ -193,7 +246,8 @@ main(int argc, char **argv){
>  		exit(1);
>  	}
>  
> -	if (optind == argc-2) {
> +	if (hotplug) {
> +	} else if (optind == argc-2) {
>  		device = argv[optind];
>  		diskdevice = argv[optind+1];
>  	} else if (optind == argc-1) {
> diff -rup multipath-tools-0.4.4-pre8/kpartx/devmapper.c kpartx-0.4.4-pre8/kpartx/devmapper.c
> --- multipath-tools-0.4.4-pre8/kpartx/devmapper.c	2005-04-04 08:49:46.000000000 -0400
> +++ kpartx-0.4.4-pre8/kpartx/devmapper.c	2005-04-07 14:14:06.000000000 -0400
> @@ -121,3 +121,34 @@ dm_map_present (char * str)
>  	dm_task_destroy (dmt);
>  	return r;
>  }
> +
> +char *
> +dm_mapname(int major, int minor)
> +{
> +	struct dm_task *dmt;
> +	int len;
> +	char *name = NULL, *mapname = NULL;
> +
> +	if (!(dmt = dm_task_create(DM_DEVICE_INFO)))
> +		return 0;
> +
> +	dm_task_no_open_count(dmt);
> +	dm_task_set_major(dmt, major);
> +	dm_task_set_minor(dmt, minor);
> +
> +	if (!dm_task_run(dmt))
> +		goto out;
> +
> +	if (!(name = dm_task_get_name(dmt)))
> +		goto out;
> +
> +        len = strlen(name) + 1;
> +        if (!(mapname = malloc(len)))
> +		goto out;
> +
> +        strncpy(mapname, name, len);
> +
> +out:
> +	dm_task_destroy(dmt);
> +	return mapname;
> +}
> diff -rup multipath-tools-0.4.4-pre8/kpartx/devmapper.h kpartx-0.4.4-pre8/kpartx/devmapper.h
> --- multipath-tools-0.4.4-pre8/kpartx/devmapper.h	2005-03-30 16:48:27.000000000 -0500
> +++ kpartx-0.4.4-pre8/kpartx/devmapper.h	2005-04-07 14:12:08.000000000 -0400
> @@ -2,3 +2,4 @@ int dm_prereq (char *, int, int, int);
>  int dm_simplecmd (int, const char *);
>  int dm_addmap (int, const char *, const char *, const char *, unsigned long);
>  int dm_map_present (char *);
> +char * dm_mapname(int major, int minor);
> 
> --
> dm-devel mailing list
> dm-devel at redhat.com
> https://www.redhat.com/mailman/listinfo/dm-devel
-- 
christophe varoqui <christophe.varoqui at free.fr>





More information about the dm-devel mailing list