diff options
| author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2003-02-10 22:58:04 -0800 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.transmeta.com> | 2003-02-10 22:58:04 -0800 |
| commit | 43fea1be12abf52dc12a61eef6059beed55c2df8 (patch) | |
| tree | 61be163e2e6f5367fc61d76f8bcabde48a2acc24 /drivers | |
| parent | f0bec55fe38773d2022f1b585067a7a773942769 (diff) | |
Sanitize kernel daemon signal handling and process naming.
Add a name argument to daemonize() (va_arg) to avoid all the
kernel threads having to duplicate the name setting over and
over again.
Make daemonize() disable all signals by default, and add a
"allow_signal()" function to let daemons say they explicitly
want to support a signal.
Make flush_signal() take the signal lock, so that callers do
not need to.
Diffstat (limited to 'drivers')
32 files changed, 56 insertions, 155 deletions
diff --git a/drivers/block/loop.c b/drivers/block/loop.c index 71ae15a0c6fd..85636a00c3c6 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -577,18 +577,12 @@ static int loop_thread(void *data) struct loop_device *lo = data; struct bio *bio; - daemonize(); + daemonize("loop%d", lo->lo_number); - sprintf(current->comm, "loop%d", lo->lo_number); current->flags |= PF_IOTHREAD; /* loop can be used in an encrypted device hence, it mustn't be stopped at all because it could be indirectly used during suspension */ - spin_lock_irq(¤t->sighand->siglock); - sigfillset(¤t->blocked); - flush_signals(current); - spin_unlock_irq(¤t->sighand->siglock); - set_user_nice(current, -20); lo->lo_state = Lo_bound; diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c index b3fe12431691..fb2ee72e6db2 100644 --- a/drivers/char/hvc_console.c +++ b/drivers/char/hvc_console.c @@ -233,9 +233,7 @@ int khvcd(void *unused) { int i; - daemonize(); - strcpy(current->comm, "khvcd"); - sigfillset(¤t->blocked); + daemonize("khvcd"); for (;;) { if (!cpus_in_xmon) { diff --git a/drivers/hotplug/cpci_hotplug_core.c b/drivers/hotplug/cpci_hotplug_core.c index 0b109d2aa9cc..e8981f780b62 100644 --- a/drivers/hotplug/cpci_hotplug_core.c +++ b/drivers/hotplug/cpci_hotplug_core.c @@ -622,8 +622,7 @@ event_thread(void *data) struct list_head *tmp; lock_kernel(); - daemonize(); - strcpy(current->comm, "cpci_hp_eventd"); + daemonize("cpci_hp_eventd"); unlock_kernel(); dbg("%s - event thread started", __FUNCTION__); @@ -682,8 +681,7 @@ poll_thread(void *data) struct list_head *tmp; lock_kernel(); - daemonize(); - strcpy(current->comm, "cpci_hp_polld"); + daemonize("cpci_hp_polld"); unlock_kernel(); while(1) { diff --git a/drivers/hotplug/cpqphp_ctrl.c b/drivers/hotplug/cpqphp_ctrl.c index deb229539165..b9a8432487f4 100644 --- a/drivers/hotplug/cpqphp_ctrl.c +++ b/drivers/hotplug/cpqphp_ctrl.c @@ -1709,10 +1709,7 @@ static int event_thread(void* data) { struct controller *ctrl; lock_kernel(); - daemonize(); - - // New name - strcpy(current->comm, "phpd_event"); + daemonize("phpd_event"); unlock_kernel(); diff --git a/drivers/hotplug/ibmphp_hpc.c b/drivers/hotplug/ibmphp_hpc.c index ae959809e8a8..0bc95c57056b 100644 --- a/drivers/hotplug/ibmphp_hpc.c +++ b/drivers/hotplug/ibmphp_hpc.c @@ -1125,13 +1125,9 @@ static int process_changeinlatch (u8 old, u8 new, struct controller *ctrl) static int hpc_poll_thread (void *data) { debug ("%s - Entry\n", __FUNCTION__); - lock_kernel (); - daemonize (); - // New name - strcpy (current->comm, "hpc_poll"); - - unlock_kernel (); + daemonize("hpc_poll"); + allow_signal(SIGKILL); poll_hpc (); diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c index 0f5440f9966b..b0ad6ca47ec1 100644 --- a/drivers/ieee1394/nodemgr.c +++ b/drivers/ieee1394/nodemgr.c @@ -1216,10 +1216,9 @@ static int nodemgr_host_thread(void *__hi) struct host_info *hi = (struct host_info *)__hi; /* No userlevel access needed */ - daemonize(); + daemonize("knodemgrd"); + allow_signal(SIGTERM); - strcpy(current->comm, "knodemgrd"); - /* Sit and wait for a signal to probe the nodes on the bus. This * happens when we get a bus reset. */ while (!down_interruptible(&hi->reset_sem) && diff --git a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c index da245d5c13ab..bf29f0becf61 100644 --- a/drivers/input/serio/serio.c +++ b/drivers/input/serio/serio.c @@ -105,8 +105,8 @@ void serio_handle_events(void) static int serio_thread(void *nothing) { lock_kernel(); - daemonize(); - strcpy(current->comm, "kseriod"); + daemonize("kseriod"); + allow_signal(SIGTERM); do { serio_handle_events(); diff --git a/drivers/isdn/hardware/eicon/i4lididrv.c b/drivers/isdn/hardware/eicon/i4lididrv.c index 38cf7c984607..b3be96a6d625 100644 --- a/drivers/isdn/hardware/eicon/i4lididrv.c +++ b/drivers/isdn/hardware/eicon/i4lididrv.c @@ -326,10 +326,7 @@ divad_thread(void * data) if(!(atomic_read(&thread_running))) break; if(signal_pending(current)) { - /* we may want to do something on signals here */ - spin_lock_irq(¤t->sigmask_lock); flush_signals(current); - spin_unlock_irq(¤t->sigmask_lock); } else { run_task_queue(&tq_divad); } diff --git a/drivers/macintosh/adb.c b/drivers/macintosh/adb.c index 6e994acf13b6..a5a983fdbede 100644 --- a/drivers/macintosh/adb.c +++ b/drivers/macintosh/adb.c @@ -244,12 +244,13 @@ static int adb_scan_bus(void) static int adb_probe_task(void *x) { + sigset_t blocked; + strcpy(current->comm, "kadbprobe"); - - spin_lock_irq(¤t->sighand->siglock); - sigfillset(¤t->blocked); + + sigfillset(&blocked); + sicprocmask(SIG_BLOCK, &blocked, NULL); flush_signals(current); - spin_unlock_irq(¤t->sighand->siglock); printk(KERN_INFO "adb: starting probe task...\n"); do_adb_reset_bus(); diff --git a/drivers/md/md.c b/drivers/md/md.c index 9f1d5d0878e5..3f4f379b0bc3 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -2444,9 +2444,7 @@ static struct block_device_operations md_fops = static inline void flush_curr_signals(void) { - spin_lock(¤t->sighand->siglock); flush_signals(current); - spin_unlock(¤t->sighand->siglock); } int md_thread(void * arg) @@ -2459,12 +2457,10 @@ int md_thread(void * arg) * Detach thread */ - daemonize(); + daemonize(thread->name); - sprintf(current->comm, thread->name); current->exit_signal = SIGCHLD; - siginitsetinv(¤t->blocked, sigmask(SIGKILL)); - flush_curr_signals(); + allow_signal(SIGKILL); thread->tsk = current; /* diff --git a/drivers/media/dvb/av7110/av7110.c b/drivers/media/dvb/av7110/av7110.c index f0178c18e0e5..9a1dc9f5ea7d 100644 --- a/drivers/media/dvb/av7110/av7110.c +++ b/drivers/media/dvb/av7110/av7110.c @@ -349,13 +349,13 @@ static int arm_thread(void *data) lock_kernel(); #if 0 - daemonize(); + daemonize("arm_mon"); #else exit_mm(current); current->session=current->pgrp=1; -#endif sigfillset(¤t->blocked); strcpy(current->comm, "arm_mon"); +#endif av7110->arm_thread = current; unlock_kernel(); diff --git a/drivers/media/dvb/dvb-core/dvb_frontend.c b/drivers/media/dvb/dvb-core/dvb_frontend.c index 344621653fea..2c18162a6665 100644 --- a/drivers/media/dvb/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb/dvb-core/dvb_frontend.c @@ -482,9 +482,7 @@ int dvb_frontend_thread (void *data) dprintk ("%s\n", __FUNCTION__); lock_kernel (); - daemonize (); - sigfillset (¤t->blocked); - strncpy (current->comm, "kdvb-fe", sizeof (current->comm)); + daemonize("kdvb-fe"); fe->thread = current; unlock_kernel (); diff --git a/drivers/media/video/msp3400.c b/drivers/media/video/msp3400.c index bdae961c265b..d91d04f97f4f 100644 --- a/drivers/media/video/msp3400.c +++ b/drivers/media/video/msp3400.c @@ -755,9 +755,7 @@ static int msp3400c_thread(void *data) lock_kernel(); #endif - daemonize(); - sigfillset(¤t->blocked); - strcpy(current->comm,"msp3400"); + daemonize("msp3400"); msp->thread = current; @@ -1011,9 +1009,7 @@ static int msp3410d_thread(void *data) lock_kernel(); #endif - daemonize(); - sigfillset(¤t->blocked); - strcpy(current->comm,"msp3410 [auto]"); + daemonize("msp3410 [auto]"); msp->thread = current; diff --git a/drivers/media/video/saa7134/saa7134-tvaudio.c b/drivers/media/video/saa7134/saa7134-tvaudio.c index 89e53cc5ace5..11949b018afc 100644 --- a/drivers/media/video/saa7134/saa7134-tvaudio.c +++ b/drivers/media/video/saa7134/saa7134-tvaudio.c @@ -393,9 +393,7 @@ static int tvaudio_thread(void *data) int i,max,carrier,audio; lock_kernel(); - daemonize(); - sigfillset(¤t->blocked); - sprintf(current->comm, "%s", dev->name); + daemonize("%s", dev->name); dev->thread.task = current; unlock_kernel(); if (dev->thread.notify != NULL) diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c index b46752742a60..b077e42ef792 100644 --- a/drivers/media/video/tvaudio.c +++ b/drivers/media/video/tvaudio.c @@ -272,9 +272,7 @@ static int chip_thread(void *data) #ifdef CONFIG_SMP lock_kernel(); #endif - daemonize(); - sigfillset(¤t->blocked); - strcpy(current->comm,chip->c.name); + daemonize("%s", chip->c.name); chip->thread = current; #ifdef CONFIG_SMP unlock_kernel(); diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index 05406290dde8..61fe2369e8f4 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c @@ -629,11 +629,9 @@ static int i2ob_evt(void *dummy) u8 data[16]; } *evt_local; - lock_kernel(); - daemonize(); - unlock_kernel(); + daemonize("i2oblock"); + allow_signal(SIGKILL); - strcpy(current->comm, "i2oblock"); evt_running = 1; while(1) diff --git a/drivers/message/i2o/i2o_core.c b/drivers/message/i2o/i2o_core.c index d4f15436a380..93ce837e421c 100644 --- a/drivers/message/i2o/i2o_core.c +++ b/drivers/message/i2o/i2o_core.c @@ -879,11 +879,9 @@ static int i2o_core_evt(void *reply_data) struct i2o_controller *c = NULL; unsigned long flags; - lock_kernel(); - daemonize(); - unlock_kernel(); + daemonize("i2oevtd"); + allow_signal(SIGKILL); - strcpy(current->comm, "i2oevtd"); evt_running = 1; while(1) @@ -1047,15 +1045,10 @@ static int i2o_dyn_lct(void *foo) int found = 0; int entries; void *tmp; - char name[16]; - lock_kernel(); - daemonize(); - unlock_kernel(); + daemonize("iop%d_lctd", c->unit); + allow_signal(SIGKILL); - sprintf(name, "iop%d_lctd", c->unit); - strcpy(current->comm, name); - c->lct_running = 1; while(1) diff --git a/drivers/mtd/devices/blkmtd.c b/drivers/mtd/devices/blkmtd.c index 7d738397f667..9b2438f01e5e 100644 --- a/drivers/mtd/devices/blkmtd.c +++ b/drivers/mtd/devices/blkmtd.c @@ -303,12 +303,7 @@ static int write_queue_task(void *data) DECLARE_WAITQUEUE(wait, tsk); DEBUG(1, "blkmtd: writetask: starting (pid = %d)\n", tsk->pid); - daemonize(); - strcpy(tsk->comm, "blkmtdd"); - spin_lock_irq(&tsk->sighand->siglock); - sigfillset(&tsk->blocked); - recalc_sigpending(); - spin_unlock_irq(&tsk->sighand->siglock); + daemonize("blkmtdd"); if(alloc_kiovec(1, &iobuf)) { printk("blkmtd: write_queue_task cant allocate kiobuf\n"); diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c index 0aec2e6709e7..af065e4af4cf 100644 --- a/drivers/mtd/mtdblock.c +++ b/drivers/mtd/mtdblock.c @@ -452,12 +452,7 @@ int mtdblock_thread(void *dummy) /* we might get involved when memory gets low, so use PF_MEMALLOC */ tsk->flags |= PF_MEMALLOC; - strcpy(tsk->comm, "mtdblockd"); - spin_lock_irq(&tsk->sighand->siglock); - sigfillset(&tsk->blocked); - recalc_sigpending(); - spin_unlock_irq(&tsk->sighand->siglock); - daemonize(); + daemonize("mtdblockd"); while (!leaving) { add_wait_queue(&thr_wq, &wait); diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index e1e8d997983e..084ff5219678 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c @@ -1588,14 +1588,8 @@ static int rtl8139_thread (void *data) struct rtl8139_private *tp = dev->priv; unsigned long timeout; - daemonize(); - spin_lock_irq(¤t->sighand->siglock); - sigemptyset(¤t->blocked); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - - strncpy (current->comm, dev->name, sizeof(current->comm) - 1); - current->comm[sizeof(current->comm) - 1] = '\0'; + daemonize("%s", dev->name); + allow_signal(SIGKILL); while (1) { timeout = next_tick; @@ -1604,9 +1598,7 @@ static int rtl8139_thread (void *data) } while (!signal_pending (current) && (timeout > 0)); if (signal_pending (current)) { - spin_lock_irq(¤t->sighand->siglock); flush_signals(current); - spin_unlock_irq(¤t->sighand->siglock); } if (tp->time_to_die) diff --git a/drivers/net/irda/sir_kthread.c b/drivers/net/irda/sir_kthread.c index 3f2a538981d9..cf292968b241 100644 --- a/drivers/net/irda/sir_kthread.c +++ b/drivers/net/irda/sir_kthread.c @@ -113,13 +113,7 @@ static int irda_thread(void *startup) { DECLARE_WAITQUEUE(wait, current); - daemonize(); - strcpy(current->comm, "kIrDAd"); - - spin_lock_irq(¤t->sighand->siglock); - sigfillset(¤t->blocked); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); + daemonize("kIrDAd"); set_fs(KERNEL_DS); diff --git a/drivers/pnp/pnpbios/core.c b/drivers/pnp/pnpbios/core.c index d9e2092dbbb9..82944c33a021 100644 --- a/drivers/pnp/pnpbios/core.c +++ b/drivers/pnp/pnpbios/core.c @@ -615,8 +615,8 @@ static int pnp_dock_thread(void * unused) { static struct pnp_docking_station_info now; int docked = -1, d = 0; - daemonize(); - strcpy(current->comm, "kpnpbiosd"); + daemonize("kpnpbiosd"); + allow_signal(SIGKILL); while(!unloading && !signal_pending(current)) { int status; diff --git a/drivers/s390/net/lcs.c b/drivers/s390/net/lcs.c index 97e4bb6a40ff..3386baf5f604 100644 --- a/drivers/s390/net/lcs.c +++ b/drivers/s390/net/lcs.c @@ -908,7 +908,7 @@ lcs_fix_multicast_list(void *data) card = (struct lcs_card *) data; - daemonize(); + daemonize("fixipm"); LCS_DBF_TEXT(5, trace, "fixipm"); spin_lock(&card->lock); list_for_each_safe(l, n, &card->ipm_list) { @@ -1370,7 +1370,7 @@ lcs_lgw_startlan_thread(void *data) struct lcs_card *card; card = (struct lcs_card *) data; - daemonize(); + daemonize("lgwstpln"); LCS_DBF_TEXT(4, trace, "lgwstpln"); if (card->dev) netif_stop_queue(card->dev); @@ -1397,7 +1397,7 @@ lcs_lgw_startup_thread(void *data) struct lcs_card *card; card = (struct lcs_card *) data; - daemonize(); + daemonize("lgwstpln"); LCS_DBF_TEXT(4, trace, "lgwstpln"); if (card->dev) netif_stop_queue(card->dev); @@ -1436,7 +1436,7 @@ lcs_lgw_stoplan_thread(void *data) struct lcs_card *card; card = (struct lcs_card *) data; - daemonize(); + daemonize("lgwstop"); LCS_DBF_TEXT(4, trace, "lgwstop"); if (card->dev) netif_stop_queue(card->dev); diff --git a/drivers/sbus/char/bbc_envctrl.c b/drivers/sbus/char/bbc_envctrl.c index a5ac67cc498f..d0a545010b1e 100644 --- a/drivers/sbus/char/bbc_envctrl.c +++ b/drivers/sbus/char/bbc_envctrl.c @@ -457,8 +457,8 @@ static struct task_struct *kenvctrld_task; static int kenvctrld(void *__unused) { - daemonize(); - strcpy(current->comm, "kenvctrld"); + daemonize("kenvctrld"); + allow_signal(SIGKILL); kenvctrld_task = current; printk(KERN_INFO "bbc_envctrl: kenvctrld starting...\n"); diff --git a/drivers/sbus/char/envctrl.c b/drivers/sbus/char/envctrl.c index f953eaf73d32..bf97d2efafa5 100644 --- a/drivers/sbus/char/envctrl.c +++ b/drivers/sbus/char/envctrl.c @@ -1016,8 +1016,9 @@ static int kenvctrld(void *__unused) poll_interval = 5 * HZ; /* TODO env_mon_interval */ - daemonize(); - strcpy(current->comm, "kenvctrld"); + daemonize("kenvctrld"); + allow_signal(SIGKILL); + kenvctrld_task = current; printk(KERN_INFO "envctrl: %s starting...\n", current->comm); diff --git a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c index 55c36b8bed90..d5e9408cebd7 100644 --- a/drivers/scsi/aacraid/commsup.c +++ b/drivers/scsi/aacraid/commsup.c @@ -816,8 +816,8 @@ int aac_command_thread(struct aac_dev * dev) * Set up the name that will appear in 'ps' * stored in task_struct.comm[16]. */ - sprintf(current->comm, "aacraid"); - daemonize(); + daemonize("aacraid"); + allow_signal(SIGKILL); /* * Let the DPC know it has a place to send the AIF's to. */ diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c index a397ed69b47a..7b03b6e1f15a 100644 --- a/drivers/scsi/aic7xxx/aic79xx_osm.c +++ b/drivers/scsi/aic7xxx/aic79xx_osm.c @@ -2854,8 +2854,7 @@ ahd_linux_dv_thread(void *data) * Complete thread creation. */ lock_kernel(); - daemonize(); - sprintf(current->comm, "ahd_dv_%d", ahd->unit); + daemonize("ahd_dv_%d", ahd->unit); unlock_kernel(); while (1) { diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c index a12ad53ec289..bff5a2eabb1b 100644 --- a/drivers/scsi/aic7xxx/aic7xxx_osm.c +++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c @@ -2355,16 +2355,10 @@ ahc_linux_dv_thread(void *data) #endif /* - * Don't care about any signals. - */ - siginitsetinv(¤t->blocked, 0); - - /* * Complete thread creation. */ lock_kernel(); - daemonize(); - sprintf(current->comm, "ahc_dv_%d", ahc->unit); + daemonize("ahc_dv_%d", ahc->unit); unlock_kernel(); while (1) { diff --git a/drivers/scsi/cpqfcTSworker.c b/drivers/scsi/cpqfcTSworker.c index 7bec5d1091f7..a45c448dc40b 100644 --- a/drivers/scsi/cpqfcTSworker.c +++ b/drivers/scsi/cpqfcTSworker.c @@ -165,15 +165,10 @@ void cpqfcTSWorkerThread( void *host) ENTER("WorkerThread"); lock_kernel(); - daemonize(); + daemonize("cpqfcTS_wt_%d", HostAdapter->host_no); siginitsetinv(¤t->blocked, SHUTDOWN_SIGS); - /* - * Set the name of this process. - */ - sprintf(current->comm, "cpqfcTS_wt_%d", HostAdapter->host_no); - cpqfcHBAdata->fcQueReady = &fcQueReady; // primary wait point cpqfcHBAdata->TYOBcomplete = &fcTYOBcomplete; cpqfcHBAdata->TachFrozen = &TachFrozen; diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index c0bb52aaa3bd..7f8d47677aff 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c @@ -1579,24 +1579,14 @@ void scsi_error_handler(void *data) int rtn; DECLARE_MUTEX_LOCKED(sem); - spin_lock_irq(¤t->sighand->siglock); - sigfillset(¤t->blocked); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - lock_kernel(); /* * Flush resources */ - daemonize(); - - /* - * Set the name of this process. - */ + daemonize("scsi_eh_%d", shost->host_no); - sprintf(current->comm, "scsi_eh_%d", shost->host_no); current->flags |= PF_IOTHREAD; shost->eh_wait = &sem; diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index f23744d8749b..ba2713a23e24 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -1083,10 +1083,8 @@ static int usb_hub_thread(void *__hub) * so get rid of all our resources */ - daemonize(); - - /* Setup a nice name */ - strcpy(current->comm, "khubd"); + daemonize("khubd"); + allow_signal(SIGKILL); /* Send me a signal to get me die (for debugging) */ do { diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index e4a98569d058..4c2b6de50c91 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c @@ -298,18 +298,9 @@ static int usb_stor_control_thread(void * __us) * This thread doesn't need any user-level access, * so get rid of all our resources.. */ - daemonize(); + daemonize("usb-storage"); - /* avoid getting signals */ - spin_lock_irq(¤t->sighand->siglock); - flush_signals(current); current->flags |= PF_IOTHREAD; - sigfillset(¤t->blocked); - recalc_sigpending(); - spin_unlock_irq(¤t->sighand->siglock); - - /* set our name for identification purposes */ - sprintf(current->comm, "usb-storage"); unlock_kernel(); |
