diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 18:23:12 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-05-21 18:23:12 +0400 |
commit | c316ba3b518bc35ce5aef5421135220389f4eb98 (patch) | |
tree | 36bb4ab299728da14f3cd1a67d7f572d50693880 /drivers/mtd/ubi/build.c | |
parent | 777cb1b53dd11dbec6157adc97e9f908f6e8458c (diff) | |
parent | be436f6238a17b8432b9de0212bcfc838afb1f85 (diff) | |
download | linux-c316ba3b518bc35ce5aef5421135220389f4eb98.tar.xz |
Merge branch 'linux-next' of git://git.infradead.org/ubi-2.6
* 'linux-next' of git://git.infradead.org/ubi-2.6:
UBI: misc comment fixes
UBI: fix s/then/than/ typos
UBI: init even if MTD device cannot be attached, if built into kernel
UBI: remove reboot notifier
Diffstat (limited to 'drivers/mtd/ubi/build.c')
-rw-r--r-- | drivers/mtd/ubi/build.c | 60 |
1 files changed, 23 insertions, 37 deletions
diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c index 55c726dde942..13b05cb33b08 100644 --- a/drivers/mtd/ubi/build.c +++ b/drivers/mtd/ubi/build.c @@ -42,7 +42,6 @@ #include <linux/miscdevice.h> #include <linux/log2.h> #include <linux/kthread.h> -#include <linux/reboot.h> #include <linux/kernel.h> #include <linux/slab.h> #include "ubi.h" @@ -50,6 +49,12 @@ /* Maximum length of the 'mtd=' parameter */ #define MTD_PARAM_LEN_MAX 64 +#ifdef CONFIG_MTD_UBI_MODULE +#define ubi_is_module() 1 +#else +#define ubi_is_module() 0 +#endif + /** * struct mtd_dev_param - MTD device parameter description data structure. * @name: MTD character device node path, MTD device name, or MTD device number @@ -832,34 +837,6 @@ static int autoresize(struct ubi_device *ubi, int vol_id) } /** - * ubi_reboot_notifier - halt UBI transactions immediately prior to a reboot. - * @n: reboot notifier object - * @state: SYS_RESTART, SYS_HALT, or SYS_POWER_OFF - * @cmd: pointer to command string for RESTART2 - * - * This function stops the UBI background thread so that the flash device - * remains quiescent when Linux restarts the system. Any queued work will be - * discarded, but this function will block until do_work() finishes if an - * operation is already in progress. - * - * This function solves a real-life problem observed on NOR flashes when an - * PEB erase operation starts, then the system is rebooted before the erase is - * finishes, and the boot loader gets confused and dies. So we prefer to finish - * the ongoing operation before rebooting. - */ -static int ubi_reboot_notifier(struct notifier_block *n, unsigned long state, - void *cmd) -{ - struct ubi_device *ubi; - - ubi = container_of(n, struct ubi_device, reboot_notifier); - if (ubi->bgt_thread) - kthread_stop(ubi->bgt_thread); - ubi_sync(ubi->ubi_num); - return NOTIFY_DONE; -} - -/** * ubi_attach_mtd_dev - attach an MTD device. * @mtd: MTD device description object * @ubi_num: number to assign to the new UBI device @@ -1016,11 +993,6 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset) wake_up_process(ubi->bgt_thread); spin_unlock(&ubi->wl_lock); - /* Flash device priority is 0 - UBI needs to shut down first */ - ubi->reboot_notifier.priority = 1; - ubi->reboot_notifier.notifier_call = ubi_reboot_notifier; - register_reboot_notifier(&ubi->reboot_notifier); - ubi_devices[ubi_num] = ubi; ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL); return ubi_num; @@ -1091,7 +1063,6 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway) * Before freeing anything, we have to stop the background thread to * prevent it from doing anything on this device while we are freeing. */ - unregister_reboot_notifier(&ubi->reboot_notifier); if (ubi->bgt_thread) kthread_stop(ubi->bgt_thread); @@ -1241,9 +1212,24 @@ static int __init ubi_init(void) p->vid_hdr_offs); mutex_unlock(&ubi_devices_mutex); if (err < 0) { - put_mtd_device(mtd); ubi_err("cannot attach mtd%d", mtd->index); - goto out_detach; + put_mtd_device(mtd); + + /* + * Originally UBI stopped initializing on any error. + * However, later on it was found out that this + * behavior is not very good when UBI is compiled into + * the kernel and the MTD devices to attach are passed + * through the command line. Indeed, UBI failure + * stopped whole boot sequence. + * + * To fix this, we changed the behavior for the + * non-module case, but preserved the old behavior for + * the module case, just for compatibility. This is a + * little inconsistent, though. + */ + if (ubi_is_module()) + goto out_detach; } } |