diff options
author | Jeff Dike <jdike@addtoit.com> | 2005-06-25 17:55:25 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-06-25 19:24:36 -0400 |
commit | 29d56cfe3ca599ddc3ae9156e7e469c044d97b96 (patch) | |
tree | 7790477f5b138c249725fe8ecf9dc07794e9d1eb /arch/um/drivers/ubd_kern.c | |
parent | fc47a0d18a1994b4a18d2235fcde1b75dfa72552 (diff) |
[PATCH] uml: hot-unplug code cleanup
Clean up the hot-unplugging code. There is now an id procedure which is
called to figure out what device we're talking to. The error messages from
that are now done from mconsole_remove instead of the driver. remove is now
called with the device number, after it has been checked, so doesn't need to
do sanity checking on it.
Signed-off-by: Jeff Dike <jdike@addtoit.com>
Cc: Paolo Giarrusso <blaisorblade@yahoo.it>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/um/drivers/ubd_kern.c')
-rw-r--r-- | arch/um/drivers/ubd_kern.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/arch/um/drivers/ubd_kern.c b/arch/um/drivers/ubd_kern.c index 2a7f6892c55c..344b24d09a7c 100644 --- a/arch/um/drivers/ubd_kern.c +++ b/arch/um/drivers/ubd_kern.c | |||
@@ -754,24 +754,34 @@ static int ubd_get_config(char *name, char *str, int size, char **error_out) | |||
754 | return(len); | 754 | return(len); |
755 | } | 755 | } |
756 | 756 | ||
757 | static int ubd_remove(char *str) | 757 | static int ubd_id(char **str, int *start_out, int *end_out) |
758 | { | ||
759 | int n; | ||
760 | |||
761 | n = parse_unit(str); | ||
762 | *start_out = 0; | ||
763 | *end_out = MAX_DEV - 1; | ||
764 | return n; | ||
765 | } | ||
766 | |||
767 | static int ubd_remove(int n) | ||
758 | { | 768 | { |
759 | struct ubd *dev; | 769 | struct ubd *dev; |
760 | int n, err = -ENODEV; | 770 | int err = -ENODEV; |
761 | 771 | ||
762 | n = parse_unit(&str); | 772 | spin_lock(&ubd_lock); |
763 | 773 | ||
764 | if((n < 0) || (n >= MAX_DEV)) | 774 | if(ubd_gendisk[n] == NULL) |
765 | return(err); | 775 | goto out; |
766 | 776 | ||
767 | dev = &ubd_dev[n]; | 777 | dev = &ubd_dev[n]; |
768 | if(dev->count > 0) | ||
769 | return(-EBUSY); /* you cannot remove a open disk */ | ||
770 | 778 | ||
771 | err = 0; | 779 | if(dev->file == NULL) |
772 | spin_lock(&ubd_lock); | 780 | goto out; |
773 | 781 | ||
774 | if(ubd_gendisk[n] == NULL) | 782 | /* you cannot remove a open disk */ |
783 | err = -EBUSY; | ||
784 | if(dev->count > 0) | ||
775 | goto out; | 785 | goto out; |
776 | 786 | ||
777 | del_gendisk(ubd_gendisk[n]); | 787 | del_gendisk(ubd_gendisk[n]); |
@@ -787,15 +797,16 @@ static int ubd_remove(char *str) | |||
787 | platform_device_unregister(&dev->pdev); | 797 | platform_device_unregister(&dev->pdev); |
788 | *dev = ((struct ubd) DEFAULT_UBD); | 798 | *dev = ((struct ubd) DEFAULT_UBD); |
789 | err = 0; | 799 | err = 0; |
790 | out: | 800 | out: |
791 | spin_unlock(&ubd_lock); | 801 | spin_unlock(&ubd_lock); |
792 | return(err); | 802 | return err; |
793 | } | 803 | } |
794 | 804 | ||
795 | static struct mc_device ubd_mc = { | 805 | static struct mc_device ubd_mc = { |
796 | .name = "ubd", | 806 | .name = "ubd", |
797 | .config = ubd_config, | 807 | .config = ubd_config, |
798 | .get_config = ubd_get_config, | 808 | .get_config = ubd_get_config, |
809 | .id = ubd_id, | ||
799 | .remove = ubd_remove, | 810 | .remove = ubd_remove, |
800 | }; | 811 | }; |
801 | 812 | ||