diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/memory.c | 8 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_msghandler.c | 4 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_si_intf.c | 7 | ||||
| -rw-r--r-- | drivers/char/ipmi/ipmi_watchdog.c | 6 | ||||
| -rw-r--r-- | drivers/cpufreq/cpufreq.c | 61 | ||||
| -rw-r--r-- | drivers/firmware/dcdbas.c | 19 | ||||
| -rw-r--r-- | drivers/macintosh/adb.c | 11 | ||||
| -rw-r--r-- | drivers/macintosh/adbhid.c | 3 | ||||
| -rw-r--r-- | drivers/macintosh/via-pmu.c | 2 | ||||
| -rw-r--r-- | drivers/macintosh/via-pmu68k.c | 7 | ||||
| -rw-r--r-- | drivers/macintosh/windfarm_core.c | 8 | ||||
| -rw-r--r-- | drivers/misc/ibmasm/heartbeat.c | 5 | ||||
| -rw-r--r-- | drivers/net/bonding/bond_main.c | 2 | ||||
| -rw-r--r-- | drivers/parisc/led.c | 14 | ||||
| -rw-r--r-- | drivers/parisc/power.c | 6 | ||||
| -rw-r--r-- | drivers/scsi/gdth.c | 9 | ||||
| -rw-r--r-- | drivers/usb/core/notify.c | 65 | ||||
| -rw-r--r-- | drivers/video/fbmem.c | 31 | 
18 files changed, 113 insertions, 155 deletions
diff --git a/drivers/base/memory.c b/drivers/base/memory.c index 105a0d61eb1..dd547af4681 100644 --- a/drivers/base/memory.c +++ b/drivers/base/memory.c @@ -47,16 +47,16 @@ static struct kset_uevent_ops memory_uevent_ops = {  	.uevent		= memory_uevent,  }; -static struct notifier_block *memory_chain; +static BLOCKING_NOTIFIER_HEAD(memory_chain);  int register_memory_notifier(struct notifier_block *nb)  { -        return notifier_chain_register(&memory_chain, nb); +        return blocking_notifier_chain_register(&memory_chain, nb);  }  void unregister_memory_notifier(struct notifier_block *nb)  { -        notifier_chain_unregister(&memory_chain, nb); +        blocking_notifier_chain_unregister(&memory_chain, nb);  }  /* @@ -140,7 +140,7 @@ static ssize_t show_mem_state(struct sys_device *dev, char *buf)  static inline int memory_notify(unsigned long val, void *v)  { -	return notifier_call_chain(&memory_chain, val, v); +	return blocking_notifier_call_chain(&memory_chain, val, v);  }  /* diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c index b8fb87c6c29..40eb005b9d7 100644 --- a/drivers/char/ipmi/ipmi_msghandler.c +++ b/drivers/char/ipmi/ipmi_msghandler.c @@ -3744,7 +3744,7 @@ static int ipmi_init_msghandler(void)  	ipmi_timer.expires = jiffies + IPMI_TIMEOUT_JIFFIES;  	add_timer(&ipmi_timer); -	notifier_chain_register(&panic_notifier_list, &panic_block); +	atomic_notifier_chain_register(&panic_notifier_list, &panic_block);  	initialized = 1; @@ -3764,7 +3764,7 @@ static __exit void cleanup_ipmi(void)  	if (!initialized)  		return; -	notifier_chain_unregister(&panic_notifier_list, &panic_block); +	atomic_notifier_chain_unregister(&panic_notifier_list, &panic_block);  	/* This can't be called if any interfaces exist, so no worry about  	   shutting down the interfaces. */ diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c index 12f858dc999..35fbd4d8ed4 100644 --- a/drivers/char/ipmi/ipmi_si_intf.c +++ b/drivers/char/ipmi/ipmi_si_intf.c @@ -237,10 +237,10 @@ struct smi_info  static int try_smi_init(struct smi_info *smi); -static struct notifier_block *xaction_notifier_list; +static ATOMIC_NOTIFIER_HEAD(xaction_notifier_list);  static int register_xaction_notifier(struct notifier_block * nb)  { -	return notifier_chain_register(&xaction_notifier_list, nb); +	return atomic_notifier_chain_register(&xaction_notifier_list, nb);  }  static void si_restart_short_timer(struct smi_info *smi_info); @@ -302,7 +302,8 @@ static enum si_sm_result start_next_msg(struct smi_info *smi_info)  		do_gettimeofday(&t);  		printk("**Start2: %d.%9.9d\n", t.tv_sec, t.tv_usec);  #endif -		err = notifier_call_chain(&xaction_notifier_list, 0, smi_info); +		err = atomic_notifier_call_chain(&xaction_notifier_list, +				0, smi_info);  		if (err & NOTIFY_STOP_MASK) {  			rv = SI_SM_CALL_WITHOUT_DELAY;  			goto out; diff --git a/drivers/char/ipmi/ipmi_watchdog.c b/drivers/char/ipmi/ipmi_watchdog.c index 616539310d9..7ece9f3c8f7 100644 --- a/drivers/char/ipmi/ipmi_watchdog.c +++ b/drivers/char/ipmi/ipmi_watchdog.c @@ -1158,7 +1158,8 @@ static int __init ipmi_wdog_init(void)  	}  	register_reboot_notifier(&wdog_reboot_notifier); -	notifier_chain_register(&panic_notifier_list, &wdog_panic_notifier); +	atomic_notifier_chain_register(&panic_notifier_list, +			&wdog_panic_notifier);  	printk(KERN_INFO PFX "driver initialized\n"); @@ -1176,7 +1177,8 @@ static __exit void ipmi_unregister_watchdog(void)  		release_nmi(&ipmi_nmi_handler);  #endif -	notifier_chain_unregister(&panic_notifier_list, &wdog_panic_notifier); +	atomic_notifier_chain_unregister(&panic_notifier_list, +			&wdog_panic_notifier);  	unregister_reboot_notifier(&wdog_reboot_notifier);  	if (! watchdog_user) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index aed80e6aec6..9b6ae7dc8b8 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -52,9 +52,8 @@ static void handle_update(void *data);   * changes to devices when the CPU clock speed changes.   * The mutex locks both lists.   */ -static struct notifier_block *cpufreq_policy_notifier_list; -static struct notifier_block *cpufreq_transition_notifier_list; -static DECLARE_RWSEM (cpufreq_notifier_rwsem); +static BLOCKING_NOTIFIER_HEAD(cpufreq_policy_notifier_list); +static BLOCKING_NOTIFIER_HEAD(cpufreq_transition_notifier_list);  static LIST_HEAD(cpufreq_governor_list); @@ -247,8 +246,6 @@ void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)  	dprintk("notification %u of frequency transition to %u kHz\n",  		state, freqs->new); -	down_read(&cpufreq_notifier_rwsem); -  	policy = cpufreq_cpu_data[freqs->cpu];  	switch (state) { @@ -266,20 +263,19 @@ void cpufreq_notify_transition(struct cpufreq_freqs *freqs, unsigned int state)  				freqs->old = policy->cur;  			}  		} -		notifier_call_chain(&cpufreq_transition_notifier_list, -					CPUFREQ_PRECHANGE, freqs); +		blocking_notifier_call_chain(&cpufreq_transition_notifier_list, +				CPUFREQ_PRECHANGE, freqs);  		adjust_jiffies(CPUFREQ_PRECHANGE, freqs);  		break;  	case CPUFREQ_POSTCHANGE:  		adjust_jiffies(CPUFREQ_POSTCHANGE, freqs); -		notifier_call_chain(&cpufreq_transition_notifier_list, -					CPUFREQ_POSTCHANGE, freqs); +		blocking_notifier_call_chain(&cpufreq_transition_notifier_list, +				CPUFREQ_POSTCHANGE, freqs);  		if (likely(policy) && likely(policy->cpu == freqs->cpu))  			policy->cur = freqs->new;  		break;  	} -	up_read(&cpufreq_notifier_rwsem);  }  EXPORT_SYMBOL_GPL(cpufreq_notify_transition); @@ -1007,7 +1003,7 @@ static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)  		freqs.old = cpu_policy->cur;  		freqs.new = cur_freq; -		notifier_call_chain(&cpufreq_transition_notifier_list, +		blocking_notifier_call_chain(&cpufreq_transition_notifier_list,  				    CPUFREQ_SUSPENDCHANGE, &freqs);  		adjust_jiffies(CPUFREQ_SUSPENDCHANGE, &freqs); @@ -1088,7 +1084,8 @@ static int cpufreq_resume(struct sys_device * sysdev)  			freqs.old = cpu_policy->cur;  			freqs.new = cur_freq; -			notifier_call_chain(&cpufreq_transition_notifier_list, +			blocking_notifier_call_chain( +					&cpufreq_transition_notifier_list,  					CPUFREQ_RESUMECHANGE, &freqs);  			adjust_jiffies(CPUFREQ_RESUMECHANGE, &freqs); @@ -1125,24 +1122,24 @@ static struct sysdev_driver cpufreq_sysdev_driver = {   *      changes in cpufreq policy.   *   *	This function may sleep, and has the same return conditions as - *	notifier_chain_register. + *	blocking_notifier_chain_register.   */  int cpufreq_register_notifier(struct notifier_block *nb, unsigned int list)  {  	int ret; -	down_write(&cpufreq_notifier_rwsem);  	switch (list) {  	case CPUFREQ_TRANSITION_NOTIFIER: -		ret = notifier_chain_register(&cpufreq_transition_notifier_list, nb); +		ret = blocking_notifier_chain_register( +				&cpufreq_transition_notifier_list, nb);  		break;  	case CPUFREQ_POLICY_NOTIFIER: -		ret = notifier_chain_register(&cpufreq_policy_notifier_list, nb); +		ret = blocking_notifier_chain_register( +				&cpufreq_policy_notifier_list, nb);  		break;  	default:  		ret = -EINVAL;  	} -	up_write(&cpufreq_notifier_rwsem);  	return ret;  } @@ -1157,24 +1154,24 @@ EXPORT_SYMBOL(cpufreq_register_notifier);   *	Remove a driver from the CPU frequency notifier list.   *   *	This function may sleep, and has the same return conditions as - *	notifier_chain_unregister. + *	blocking_notifier_chain_unregister.   */  int cpufreq_unregister_notifier(struct notifier_block *nb, unsigned int list)  {  	int ret; -	down_write(&cpufreq_notifier_rwsem);  	switch (list) {  	case CPUFREQ_TRANSITION_NOTIFIER: -		ret = notifier_chain_unregister(&cpufreq_transition_notifier_list, nb); +		ret = blocking_notifier_chain_unregister( +				&cpufreq_transition_notifier_list, nb);  		break;  	case CPUFREQ_POLICY_NOTIFIER: -		ret = notifier_chain_unregister(&cpufreq_policy_notifier_list, nb); +		ret = blocking_notifier_chain_unregister( +				&cpufreq_policy_notifier_list, nb);  		break;  	default:  		ret = -EINVAL;  	} -	up_write(&cpufreq_notifier_rwsem);  	return ret;  } @@ -1346,29 +1343,23 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli  	if (ret)  		goto error_out; -	down_read(&cpufreq_notifier_rwsem); -  	/* adjust if necessary - all reasons */ -	notifier_call_chain(&cpufreq_policy_notifier_list, CPUFREQ_ADJUST, -			    policy); +	blocking_notifier_call_chain(&cpufreq_policy_notifier_list, +			CPUFREQ_ADJUST, policy);  	/* adjust if necessary - hardware incompatibility*/ -	notifier_call_chain(&cpufreq_policy_notifier_list, CPUFREQ_INCOMPATIBLE, -			    policy); +	blocking_notifier_call_chain(&cpufreq_policy_notifier_list, +			CPUFREQ_INCOMPATIBLE, policy);  	/* verify the cpu speed can be set within this limit,  	   which might be different to the first one */  	ret = cpufreq_driver->verify(policy); -	if (ret) { -		up_read(&cpufreq_notifier_rwsem); +	if (ret)  		goto error_out; -	}  	/* notification of the new policy */ -	notifier_call_chain(&cpufreq_policy_notifier_list, CPUFREQ_NOTIFY, -			    policy); - -	up_read(&cpufreq_notifier_rwsem); +	blocking_notifier_call_chain(&cpufreq_policy_notifier_list, +			CPUFREQ_NOTIFY, policy);  	data->min = policy->min;  	data->max = policy->max; diff --git a/drivers/firmware/dcdbas.c b/drivers/firmware/dcdbas.c index d6543fc4a92..339f405ff70 100644 --- a/drivers/firmware/dcdbas.c +++ b/drivers/firmware/dcdbas.c @@ -484,26 +484,15 @@ static void dcdbas_host_control(void)  static int dcdbas_reboot_notify(struct notifier_block *nb, unsigned long code,  				void *unused)  { -	static unsigned int notify_cnt = 0; -  	switch (code) {  	case SYS_DOWN:  	case SYS_HALT:  	case SYS_POWER_OFF:  		if (host_control_on_shutdown) {  			/* firmware is going to perform host control action */ -			if (++notify_cnt == 2) { -				printk(KERN_WARNING -				       "Please wait for shutdown " -				       "action to complete...\n"); -				dcdbas_host_control(); -			} -			/* -			 * register again and initiate the host control -			 * action on the second notification to allow -			 * everyone that registered to be notified -			 */ -			register_reboot_notifier(nb); +			printk(KERN_WARNING "Please wait for shutdown " +			       "action to complete...\n"); +			dcdbas_host_control();  		}  		break;  	} @@ -514,7 +503,7 @@ static int dcdbas_reboot_notify(struct notifier_block *nb, unsigned long code,  static struct notifier_block dcdbas_reboot_nb = {  	.notifier_call = dcdbas_reboot_notify,  	.next = NULL, -	.priority = 0 +	.priority = INT_MIN  };  static DCDBAS_BIN_ATTR_RW(smi_data); diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index d2ead1776c1..34fcabac5fd 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -80,7 +80,7 @@ static struct adb_driver *adb_driver_list[] = {  static struct class *adb_dev_class;  struct adb_driver *adb_controller; -struct notifier_block *adb_client_list = NULL; +BLOCKING_NOTIFIER_HEAD(adb_client_list);  static int adb_got_sleep;  static int adb_inited;  static pid_t adb_probe_task_pid; @@ -354,7 +354,8 @@ adb_notify_sleep(struct pmu_sleep_notifier *self, int when)  		/* Stop autopoll */  		if (adb_controller->autopoll)  			adb_controller->autopoll(0); -		ret = notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL); +		ret = blocking_notifier_call_chain(&adb_client_list, +				ADB_MSG_POWERDOWN, NULL);  		if (ret & NOTIFY_STOP_MASK) {  			up(&adb_probe_mutex);  			return PBOOK_SLEEP_REFUSE; @@ -391,7 +392,8 @@ do_adb_reset_bus(void)  	if (adb_controller->autopoll)  		adb_controller->autopoll(0); -	nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL); +	nret = blocking_notifier_call_chain(&adb_client_list, +			ADB_MSG_PRE_RESET, NULL);  	if (nret & NOTIFY_STOP_MASK) {  		if (adb_controller->autopoll)  			adb_controller->autopoll(autopoll_devs); @@ -426,7 +428,8 @@ do_adb_reset_bus(void)  	}  	up(&adb_handler_sem); -	nret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL); +	nret = blocking_notifier_call_chain(&adb_client_list, +			ADB_MSG_POST_RESET, NULL);  	if (nret & NOTIFY_STOP_MASK)  		return -EBUSY; diff --git a/drivers/macintosh/adbhid.c b/drivers/macintosh/adbhid.c index c0b46bceb5d..f5779a73184 100644 --- a/drivers/macintosh/adbhid.c +++ b/drivers/macintosh/adbhid.c @@ -1214,7 +1214,8 @@ static int __init adbhid_init(void)  	adbhid_probe(); -	notifier_chain_register(&adb_client_list, &adbhid_adb_notifier); +	blocking_notifier_chain_register(&adb_client_list, +			&adbhid_adb_notifier);  	return 0;  } diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c index 4f5f3abc9cb..0b5ff553e39 100644 --- a/drivers/macintosh/via-pmu.c +++ b/drivers/macintosh/via-pmu.c @@ -187,7 +187,7 @@ extern int disable_kernel_backlight;  int __fake_sleep;  int asleep; -struct notifier_block *sleep_notifier_list; +BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);  #ifdef CONFIG_ADB  static int adb_dev_map = 0; diff --git a/drivers/macintosh/via-pmu68k.c b/drivers/macintosh/via-pmu68k.c index f08e52f2107..35b70323e7e 100644 --- a/drivers/macintosh/via-pmu68k.c +++ b/drivers/macintosh/via-pmu68k.c @@ -102,7 +102,7 @@ static int pmu_kind = PMU_UNKNOWN;  static int pmu_fully_inited = 0;  int asleep; -struct notifier_block *sleep_notifier_list; +BLOCKING_NOTIFIER_HEAD(sleep_notifier_list);  static int pmu_probe(void);  static int pmu_init(void); @@ -913,7 +913,8 @@ int powerbook_sleep(void)  	struct adb_request sleep_req;  	/* Notify device drivers */ -	ret = notifier_call_chain(&sleep_notifier_list, PBOOK_SLEEP, NULL); +	ret = blocking_notifier_call_chain(&sleep_notifier_list, +			PBOOK_SLEEP, NULL);  	if (ret & NOTIFY_STOP_MASK)  		return -EBUSY; @@ -984,7 +985,7 @@ int powerbook_sleep(void)  			enable_irq(i);  	/* Notify drivers */ -	notifier_call_chain(&sleep_notifier_list, PBOOK_WAKE, NULL); +	blocking_notifier_call_chain(&sleep_notifier_list, PBOOK_WAKE, NULL);  	/* reenable ADB autopoll */  	pmu_adb_autopoll(adb_dev_map); diff --git a/drivers/macintosh/windfarm_core.c b/drivers/macintosh/windfarm_core.c index 6c0ba04bc57..ab3faa702d5 100644 --- a/drivers/macintosh/windfarm_core.c +++ b/drivers/macintosh/windfarm_core.c @@ -52,7 +52,7 @@  static LIST_HEAD(wf_controls);  static LIST_HEAD(wf_sensors);  static DEFINE_MUTEX(wf_lock); -static struct notifier_block *wf_client_list; +static BLOCKING_NOTIFIER_HEAD(wf_client_list);  static int wf_client_count;  static unsigned int wf_overtemp;  static unsigned int wf_overtemp_counter; @@ -68,7 +68,7 @@ static struct platform_device wf_platform_device = {  static inline void wf_notify(int event, void *param)  { -	notifier_call_chain(&wf_client_list, event, param); +	blocking_notifier_call_chain(&wf_client_list, event, param);  }  int wf_critical_overtemp(void) @@ -398,7 +398,7 @@ int wf_register_client(struct notifier_block *nb)  	struct wf_sensor *sr;  	mutex_lock(&wf_lock); -	rc = notifier_chain_register(&wf_client_list, nb); +	rc = blocking_notifier_chain_register(&wf_client_list, nb);  	if (rc != 0)  		goto bail;  	wf_client_count++; @@ -417,7 +417,7 @@ EXPORT_SYMBOL_GPL(wf_register_client);  int wf_unregister_client(struct notifier_block *nb)  {  	mutex_lock(&wf_lock); -	notifier_chain_unregister(&wf_client_list, nb); +	blocking_notifier_chain_unregister(&wf_client_list, nb);  	wf_client_count++;  	if (wf_client_count == 0)  		wf_stop_thread(); diff --git a/drivers/misc/ibmasm/heartbeat.c b/drivers/misc/ibmasm/heartbeat.c index f295401fac2..7fd7a43e38d 100644 --- a/drivers/misc/ibmasm/heartbeat.c +++ b/drivers/misc/ibmasm/heartbeat.c @@ -52,12 +52,13 @@ static struct notifier_block panic_notifier = { panic_happened, NULL, 1 };  void ibmasm_register_panic_notifier(void)  { -	notifier_chain_register(&panic_notifier_list, &panic_notifier); +	atomic_notifier_chain_register(&panic_notifier_list, &panic_notifier);  }  void ibmasm_unregister_panic_notifier(void)  { -	notifier_chain_unregister(&panic_notifier_list, &panic_notifier); +	atomic_notifier_chain_unregister(&panic_notifier_list, +			&panic_notifier);  } diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 2d0ac169a86..f13a539dc16 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -3159,7 +3159,7 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave   * bond_netdev_event: handle netdev notifier chain events.   *   * This function receives events for the netdev chain.  The caller (an - * ioctl handler calling notifier_call_chain) holds the necessary + * ioctl handler calling blocking_notifier_call_chain) holds the necessary   * locks for us to safely manipulate the slave devices (RTNL lock,   * dev_probe_lock).   */ diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c index 3627a2d7f79..298f2ddb2c1 100644 --- a/drivers/parisc/led.c +++ b/drivers/parisc/led.c @@ -499,11 +499,16 @@ static int led_halt(struct notifier_block *, unsigned long, void *);  static struct notifier_block led_notifier = {  	.notifier_call = led_halt,  }; +static int notifier_disabled = 0;  static int led_halt(struct notifier_block *nb, unsigned long event, void *buf)   {  	char *txt; -	 + +	if (notifier_disabled) +		return NOTIFY_OK; + +	notifier_disabled = 1;  	switch (event) {  	case SYS_RESTART:	txt = "SYSTEM RESTART";  				break; @@ -527,7 +532,6 @@ static int led_halt(struct notifier_block *nb, unsigned long event, void *buf)  		if (led_func_ptr)  			led_func_ptr(0xff); /* turn all LEDs ON */ -	unregister_reboot_notifier(&led_notifier);  	return NOTIFY_OK;  } @@ -758,6 +762,12 @@ not_found:  	return 1;  } +static void __exit led_exit(void) +{ +	unregister_reboot_notifier(&led_notifier); +	return; +} +  #ifdef CONFIG_PROC_FS  module_init(led_create_procfs)  #endif diff --git a/drivers/parisc/power.c b/drivers/parisc/power.c index 54b2b7f20b9..0bcab83b408 100644 --- a/drivers/parisc/power.c +++ b/drivers/parisc/power.c @@ -251,7 +251,8 @@ static int __init power_init(void)  	}  	/* Register a call for panic conditions. */ -	notifier_chain_register(&panic_notifier_list, &parisc_panic_block); +	atomic_notifier_chain_register(&panic_notifier_list, +			&parisc_panic_block);  	tasklet_enable(&power_tasklet); @@ -264,7 +265,8 @@ static void __exit power_exit(void)  		return;  	tasklet_disable(&power_tasklet); -	notifier_chain_unregister(&panic_notifier_list, &parisc_panic_block); +	atomic_notifier_chain_unregister(&panic_notifier_list, +			&parisc_panic_block);  	power_tasklet.func = NULL;  	pdc_soft_power_button(0);  } diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 62e3cda859a..7f7013e80a8 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c @@ -671,7 +671,7 @@ static struct file_operations gdth_fops = {  static struct notifier_block gdth_notifier = {      gdth_halt, NULL, 0  }; - +static int notifier_disabled = 0;  static void gdth_delay(int milliseconds)  { @@ -4595,13 +4595,13 @@ static int __init gdth_detect(struct scsi_host_template *shtp)          add_timer(&gdth_timer);  #endif          major = register_chrdev(0,"gdth",&gdth_fops); +        notifier_disabled = 0;          register_reboot_notifier(&gdth_notifier);      }      gdth_polling = FALSE;      return gdth_ctr_vcount;  } -  static int gdth_release(struct Scsi_Host *shp)  {      int hanum; @@ -5632,10 +5632,14 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)      char            cmnd[MAX_COMMAND_SIZE];     #endif +    if (notifier_disabled) +    	return NOTIFY_OK; +      TRACE2(("gdth_halt() event %d\n",(int)event));      if (event != SYS_RESTART && event != SYS_HALT && event != SYS_POWER_OFF)          return NOTIFY_DONE; +    notifier_disabled = 1;      printk("GDT-HA: Flushing all host drives .. ");      for (hanum = 0; hanum < gdth_ctr_count; ++hanum) {          gdth_flush(hanum); @@ -5679,7 +5683,6 @@ static int gdth_halt(struct notifier_block *nb, ulong event, void *buf)  #ifdef GDTH_STATISTICS      del_timer(&gdth_timer);  #endif -    unregister_reboot_notifier(&gdth_notifier);      return NOTIFY_OK;  } diff --git a/drivers/usb/core/notify.c b/drivers/usb/core/notify.c index 4b55285de9a..fe0ed54fa0a 100644 --- a/drivers/usb/core/notify.c +++ b/drivers/usb/core/notify.c @@ -16,57 +16,7 @@  #include <linux/mutex.h>  #include "usb.h" - -static struct notifier_block *usb_notifier_list; -static DEFINE_MUTEX(usb_notifier_lock); - -static void usb_notifier_chain_register(struct notifier_block **list, -					struct notifier_block *n) -{ -	mutex_lock(&usb_notifier_lock); -	while (*list) { -		if (n->priority > (*list)->priority) -			break; -		list = &((*list)->next); -	} -	n->next = *list; -	*list = n; -	mutex_unlock(&usb_notifier_lock); -} - -static void usb_notifier_chain_unregister(struct notifier_block **nl, -				   struct notifier_block *n) -{ -	mutex_lock(&usb_notifier_lock); -	while ((*nl)!=NULL) { -		if ((*nl)==n) { -			*nl = n->next; -			goto exit; -		} -		nl=&((*nl)->next); -	} -exit: -	mutex_unlock(&usb_notifier_lock); -} - -static int usb_notifier_call_chain(struct notifier_block **n, -				   unsigned long val, void *v) -{ -	int ret=NOTIFY_DONE; -	struct notifier_block *nb = *n; - -	mutex_lock(&usb_notifier_lock); -	while (nb) { -		ret = nb->notifier_call(nb,val,v); -		if (ret&NOTIFY_STOP_MASK) { -			goto exit; -		} -		nb = nb->next; -	} -exit: -	mutex_unlock(&usb_notifier_lock); -	return ret; -} +static BLOCKING_NOTIFIER_HEAD(usb_notifier_list);  /**   * usb_register_notify - register a notifier callback whenever a usb change happens @@ -76,7 +26,7 @@ exit:   */  void usb_register_notify(struct notifier_block *nb)  { -	usb_notifier_chain_register(&usb_notifier_list, nb); +	blocking_notifier_chain_register(&usb_notifier_list, nb);  }  EXPORT_SYMBOL_GPL(usb_register_notify); @@ -89,27 +39,28 @@ EXPORT_SYMBOL_GPL(usb_register_notify);   */  void usb_unregister_notify(struct notifier_block *nb)  { -	usb_notifier_chain_unregister(&usb_notifier_list, nb); +	blocking_notifier_chain_unregister(&usb_notifier_list, nb);  }  EXPORT_SYMBOL_GPL(usb_unregister_notify);  void usb_notify_add_device(struct usb_device *udev)  { -	usb_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev); +	blocking_notifier_call_chain(&usb_notifier_list, USB_DEVICE_ADD, udev);  }  void usb_notify_remove_device(struct usb_device *udev)  { -	usb_notifier_call_chain(&usb_notifier_list, USB_DEVICE_REMOVE, udev); +	blocking_notifier_call_chain(&usb_notifier_list, +			USB_DEVICE_REMOVE, udev);  }  void usb_notify_add_bus(struct usb_bus *ubus)  { -	usb_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus); +	blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_ADD, ubus);  }  void usb_notify_remove_bus(struct usb_bus *ubus)  { -	usb_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus); +	blocking_notifier_call_chain(&usb_notifier_list, USB_BUS_REMOVE, ubus);  } diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c index 07d882b1439..b1a8dca7643 100644 --- a/drivers/video/fbmem.c +++ b/drivers/video/fbmem.c @@ -55,7 +55,7 @@  #define FBPIXMAPSIZE	(1024 * 8) -static struct notifier_block *fb_notifier_list; +static BLOCKING_NOTIFIER_HEAD(fb_notifier_list);  struct fb_info *registered_fb[FB_MAX];  int num_registered_fb; @@ -784,7 +784,7 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)  		    event.info = info;  		    event.data = &mode1; -		    ret = notifier_call_chain(&fb_notifier_list, +		    ret = blocking_notifier_call_chain(&fb_notifier_list,  					      FB_EVENT_MODE_DELETE, &event);  		} @@ -830,8 +830,8 @@ fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)  				info->flags &= ~FBINFO_MISC_USEREVENT;  				event.info = info; -				notifier_call_chain(&fb_notifier_list, evnt, -						    &event); +				blocking_notifier_call_chain(&fb_notifier_list, +						evnt, &event);  			}  		}  	} @@ -854,7 +854,8 @@ fb_blank(struct fb_info *info, int blank)  		event.info = info;  		event.data = ␣ -		notifier_call_chain(&fb_notifier_list, FB_EVENT_BLANK, &event); +		blocking_notifier_call_chain(&fb_notifier_list, +				FB_EVENT_BLANK, &event);  	}   	return ret; @@ -925,7 +926,7 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,  		con2fb.framebuffer = -1;  		event.info = info;  		event.data = &con2fb; -		notifier_call_chain(&fb_notifier_list, +		blocking_notifier_call_chain(&fb_notifier_list,  				    FB_EVENT_GET_CONSOLE_MAP, &event);  		return copy_to_user(argp, &con2fb,  				    sizeof(con2fb)) ? -EFAULT : 0; @@ -944,7 +945,7 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,  		    return -EINVAL;  		event.info = info;  		event.data = &con2fb; -		return notifier_call_chain(&fb_notifier_list, +		return blocking_notifier_call_chain(&fb_notifier_list,  					   FB_EVENT_SET_CONSOLE_MAP,  					   &event);  	case FBIOBLANK: @@ -1324,7 +1325,7 @@ register_framebuffer(struct fb_info *fb_info)  	devfs_mk_cdev(MKDEV(FB_MAJOR, i),  			S_IFCHR | S_IRUGO | S_IWUGO, "fb/%d", i);  	event.info = fb_info; -	notifier_call_chain(&fb_notifier_list, +	blocking_notifier_call_chain(&fb_notifier_list,  			    FB_EVENT_FB_REGISTERED, &event);  	return 0;  } @@ -1366,7 +1367,7 @@ unregister_framebuffer(struct fb_info *fb_info)   */  int fb_register_client(struct notifier_block *nb)  { -	return notifier_chain_register(&fb_notifier_list, nb); +	return blocking_notifier_chain_register(&fb_notifier_list, nb);  }  /** @@ -1375,7 +1376,7 @@ int fb_register_client(struct notifier_block *nb)   */  int fb_unregister_client(struct notifier_block *nb)  { -	return notifier_chain_unregister(&fb_notifier_list, nb); +	return blocking_notifier_chain_unregister(&fb_notifier_list, nb);  }  /** @@ -1393,11 +1394,13 @@ void fb_set_suspend(struct fb_info *info, int state)  	event.info = info;  	if (state) { -		notifier_call_chain(&fb_notifier_list, FB_EVENT_SUSPEND, &event); +		blocking_notifier_call_chain(&fb_notifier_list, +				FB_EVENT_SUSPEND, &event);  		info->state = FBINFO_STATE_SUSPENDED;  	} else {  		info->state = FBINFO_STATE_RUNNING; -		notifier_call_chain(&fb_notifier_list, FB_EVENT_RESUME, &event); +		blocking_notifier_call_chain(&fb_notifier_list, +				FB_EVENT_RESUME, &event);  	}  } @@ -1469,7 +1472,7 @@ int fb_new_modelist(struct fb_info *info)  	if (!list_empty(&info->modelist)) {  		event.info = info; -		err = notifier_call_chain(&fb_notifier_list, +		err = blocking_notifier_call_chain(&fb_notifier_list,  					   FB_EVENT_NEW_MODELIST,  					   &event);  	} @@ -1495,7 +1498,7 @@ int fb_con_duit(struct fb_info *info, int event, void *data)  	evnt.info = info;  	evnt.data = data; -	return notifier_call_chain(&fb_notifier_list, event, &evnt); +	return blocking_notifier_call_chain(&fb_notifier_list, event, &evnt);  }  EXPORT_SYMBOL(fb_con_duit);  |