From: Bharata B R. <bh...@in...> - 2002-12-27 05:11:49
|
This patch allows for having multiple target drivers loaded and choosing one at configuration time. The patch is against cvs code. Also there are a few cleanups like removing unused variable and function. I would like to commit this on monday if there are no objections. diff -ruN -X /home/bharata/dontdiff linux-2.5.52+lkcd/drivers/dump/dump_blockdev.c linux-2.5.52+lkcd+new/drivers/dump/dump_blockdev.c --- linux-2.5.52+lkcd/drivers/dump/dump_blockdev.c 2002-12-24 05:38:58.000000000 +0530 +++ linux-2.5.52+lkcd+new/drivers/dump/dump_blockdev.c 2002-12-26 05:32:18.000000000 +0530 @@ -444,7 +444,7 @@ static void __exit dump_blockdev_cleanup(void) { - dump_unregister_device(); + dump_unregister_device(&dump_blockdev->ddev); printk("block device driver for LKCD unregistered\n"); } diff -ruN -X /home/bharata/dontdiff linux-2.5.52+lkcd/drivers/dump/dump_netdev.c linux-2.5.52+lkcd+new/drivers/dump/dump_netdev.c --- linux-2.5.52+lkcd/drivers/dump/dump_netdev.c 2002-12-24 05:38:58.000000000 +0530 +++ linux-2.5.52+lkcd+new/drivers/dump/dump_netdev.c 2002-12-26 05:32:39.000000000 +0530 @@ -847,7 +847,7 @@ static void __exit dump_netdev_cleanup(void) { - dump_unregister_device(); + dump_unregister_device(&default_dump_netdev); } MODULE_AUTHOR("LKCD Development Team <lkc...@li...>"); diff -ruN -X /home/bharata/dontdiff linux-2.5.52+lkcd/drivers/dump/dump_setup.c linux-2.5.52+lkcd+new/drivers/dump/dump_setup.c --- linux-2.5.52+lkcd/drivers/dump/dump_setup.c 2002-12-24 05:38:58.000000000 +0530 +++ linux-2.5.52+lkcd+new/drivers/dump/dump_setup.c 2002-12-27 05:00:47.000000000 +0530 @@ -141,7 +141,6 @@ /* Other global fields */ extern struct __dump_header dump_header; struct dump_dev *dump_dev = NULL; /* Active dump device */ -static int dump_target; /* local disk, network etc */ int dump_device = 0; static int dump_compress = 0; @@ -160,12 +159,15 @@ .ioctl = dump_ioctl, }; -/* static variables */ -static int dump_okay = 0; /* can we dump out to disk? */ +/* static variables */ +static int dump_okay = 0; /* can we dump out to disk? */ /* used for dump compressors */ static struct list_head dump_compress_list = LIST_HEAD_INIT(dump_compress_list); +/* list of registered dump targets */ +static struct list_head dump_target_list = LIST_HEAD_INIT(dump_target_list); + /* lkcd info structure -- this is used by lcrash for basic system data */ struct __lkcdinfo lkcdinfo = { .ptrsz = (sizeof(void *) * 8), @@ -368,25 +370,6 @@ return -ENODATA; } -static const char * -dump_compress_name(void) -{ - struct list_head *tmp; - struct __dump_compress *dc; - const char *name = NULL; - - list_for_each(tmp, &dump_compress_list) { - dc = list_entry(tmp, struct __dump_compress, list); - if (dc->compress_type == dump_compress) { - name = dc->compress_name; - break; - } - } - if (!name) name = "Unknown"; - - return name; -} - static int dumper_setup(unsigned long flags, unsigned long devid) { @@ -415,6 +398,32 @@ return ret; } +static int +dump_target_init(int target) +{ + char type[20]; + struct list_head *tmp; + struct dump_dev *dev; + + switch (target) { + case DUMP_FLAGS_DISKDUMP: + strcpy(type, "blockdev"); break; + case DUMP_FLAGS_NETDUMP: + strcpy(type, "networkdev"); break; + default: + return -1; + } + + list_for_each(tmp, &dump_target_list) { + dev = list_entry(tmp, struct dump_dev, list); + if (strcmp(type, dev->type_name) == 0) { + dump_dev = dev; + return 0; + } + } + return -1; +} + /* * Name: dump_ioctl() * Func: Allow all dump tunables through a standard ioctl() mechanism. @@ -493,18 +502,11 @@ if (arg < 0) return -EINVAL; - /* - * Check if the driver corresponding to the specified - * dump target is loaded. - */ - if ((arg & DUMP_FLAGS_TARGETMASK) != (dump_config.flags & - DUMP_FLAGS_TARGETMASK)) { - printk("Dump target 0x%lx does not match flags 0x%lx\n", - dump_config.flags & DUMP_FLAGS_TARGETMASK, - arg); + if (dump_target_init(arg & DUMP_FLAGS_TARGETMASK) < 0) return -EINVAL; - } + dump_config.flags = arg; + printk("Dump Flags 0x%lx\n", dump_config.flags); break; @@ -567,38 +569,33 @@ /* * These register and unregister routines are exported for modules * to register their dump drivers (like block, net etc) - * - * TODO: Allow multiple registered devices but choose dump_dev - * at configuration time. */ int dump_register_device(struct dump_dev *ddev) { - if (dump_dev) - return -1; - dump_dev = ddev; - - /* - * Note the type of dump device, by default, it is block device. - * This is used to validate the type chosen at the time of - * configuration against the type of driver (block/net) loaded. - * - * TODO: Currently dump_target uses the flags definitions of - * dump_flags. This is because bit settings in dump_flags - * determine the type of dump. Should we have a separate - * configuration parameter DUMP_TYPE ? - */ - if (strcmp(dump_dev->type_name, "networkdev") == 0) - dump_config.flags |= DUMP_FLAGS_NETDUMP; - else if (strcmp(dump_dev->type_name, "blockdev") == 0) - dump_config.flags |= DUMP_FLAGS_DISKDUMP; + struct list_head *tmp; + struct dump_dev *dev; + list_for_each(tmp, &dump_target_list) { + dev = list_entry(tmp, struct dump_dev, list); + if (strcmp(ddev->type_name, dev->type_name) == 0) { + printk("Target type %s already registered\n", + dev->type_name); + return -EEXIST; + } + } + list_add(&(ddev->list), &dump_target_list); + return 0; } void -dump_unregister_device(void) +dump_unregister_device(struct dump_dev *ddev) { + list_del(&(ddev->list)); + if (ddev != dump_dev) + return; + dump_okay = 0; if (dump_config.dumper) diff -ruN -X /home/bharata/dontdiff linux-2.5.52+lkcd/include/linux/dumpdev.h linux-2.5.52+lkcd+new/include/linux/dumpdev.h --- linux-2.5.52+lkcd/include/linux/dumpdev.h 2002-12-24 05:39:12.000000000 +0530 +++ linux-2.5.52+lkcd+new/include/linux/dumpdev.h 2002-12-26 05:31:44.000000000 +0530 @@ -118,6 +118,6 @@ } extern int dump_register_device(struct dump_dev *); -extern void dump_unregister_device(void); +extern void dump_unregister_device(struct dump_dev *); #endif /* _LINUX_DUMPDEV_H */ Regards, Bharata. -- Bharata B Rao, IBM Linux Technology Center, IBM Software Lab, Bangalore, India. Ph: 91-80-5044962, Mail: bh...@in.... |
From: Patrick F. <pa...@pu...> - 2002-12-27 15:49:58
|
On Fri, 27 Dec 2002, Bharata B Rao wrote: > This patch allows for having multiple target drivers loaded and > choosing one at configuration time. The patch is against cvs code. > Also there are a few cleanups like removing unused variable and > function. I'm just curious and throwing something up in the air here - how difficult would it probably be to have multiple dump targets? For now, I'm just thinking of, say, a dump target on disk and another netdump target, which both recieve the result of the dump. The ideas is if the disk driver is hosed, you still get a copy off of the network (and vice versa). So, it'd only really be necessary to have one target per type of dump device (or dump target driver). Comments? If I get some time, positive responses, and direction to go in, I might try to start working on such a patch. Thanks, Pat -- Purdue Universtiy ITAP/RCS Information Technology at Purdue Research Computing and Storage http://www-rcd.cc.purdue.edu |