From 09c8e8033662fcca60f35ec43d0c23d3e3f7f496 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:25:00 -0500 Subject: [PATCH] Import 2.3.1pre2 --- drivers/block/acsi.c | 2 +- drivers/block/acsi_slm.c | 4 +-- drivers/block/amiflop.c | 8 ++--- drivers/block/ataflop.c | 4 +-- drivers/block/ps2esdi.c | 4 ++- drivers/block/raid5.c | 4 +-- drivers/block/swim3.c | 3 +- drivers/block/xd.c | 5 +-- drivers/misc/parport_share.c | 2 +- drivers/sound/dev_table.c | 6 ++-- drivers/sound/dmasound.c | 6 ++-- drivers/sound/es1370.c | 26 +++++++------- drivers/sound/es1371.c | 26 +++++++------- drivers/sound/gus_wave.c | 4 +-- drivers/sound/midibuf.c | 8 ++--- drivers/sound/msnd_pinnacle.c | 6 ++-- drivers/sound/sequencer.c | 8 ++--- drivers/sound/sonicvibes.c | 22 ++++++------ drivers/sound/wavfront.c | 4 +-- drivers/usb/hub.c | 2 +- drivers/usb/mouse.c | 8 +++-- drivers/usb/ohci-hcd.c | 6 ++-- drivers/usb/ohci.c | 6 ++-- drivers/usb/uhci.c | 6 ++-- fs/coda/cnode.c | 17 ++------- fs/coda/upcall.c | 4 +-- fs/devices.c | 18 ++++++++++ fs/ext2/inode.c | 16 +++------ fs/ext2/namei.c | 82 ++++++++++++++----------------------------- fs/fat/misc.c | 2 +- fs/hfs/dir.c | 25 ------------- fs/hfs/dir_cap.c | 2 +- fs/hfs/dir_dbl.c | 25 +------------ fs/hfs/dir_nat.c | 2 +- fs/isofs/inode.c | 9 ++--- fs/minix/inode.c | 28 +++++---------- fs/minix/namei.c | 13 +------ fs/namei.c | 68 ++++++++++++++++++++++++----------- fs/ncpfs/dir.c | 2 +- fs/nfs/inode.c | 10 +----- fs/nfsd/export.c | 2 +- fs/proc/omirr.c | 4 +-- fs/qnx4/inode.c | 31 +++++----------- fs/sysv/CHANGES | 5 +++ fs/sysv/inode.c | 10 ++---- fs/sysv/namei.c | 13 +------ fs/ufs/inode.c | 14 ++++---- fs/ufs/namei.c | 13 +------ fs/umsdos/inode.c | 10 ++---- include/linux/fs.h | 1 + include/linux/hfs_fs.h | 1 - include/linux/lp.h | 2 +- kernel/ksyms.c | 1 + 53 files changed, 248 insertions(+), 362 deletions(-) diff --git a/drivers/block/acsi.c b/drivers/block/acsi.c index b1433046f..d9598fb73 100644 --- a/drivers/block/acsi.c +++ b/drivers/block/acsi.c @@ -245,7 +245,7 @@ static int acsi_blocksizes[MAX_DEV<<4] = { 0, }; static struct hd_struct acsi_part[MAX_DEV<<4] = { {0,0}, }; static int access_count[MAX_DEV] = { 0, }; static char busy[MAX_DEV] = { 0, }; -static struct wait_queue *busy_wait; +static DECLARE_WAIT_QUEUE_HEAD(busy_wait); static int CurrentNReq; static int CurrentNSect; diff --git a/drivers/block/acsi_slm.c b/drivers/block/acsi_slm.c index 1f5d31b88..b341c39c4 100644 --- a/drivers/block/acsi_slm.c +++ b/drivers/block/acsi_slm.c @@ -143,8 +143,8 @@ static unsigned long SLMSliceSize; /* size of one DMA chunk */ static int SLMError; /* wait queues */ -static struct wait_queue *slm_wait; /* waiting for buffer */ -static struct wait_queue *print_wait; /* waiting for printing finished */ +static DECLARE_WAIT_QUEUE_HEAD(slm_wait); /* waiting for buffer */ +static DECLARE_WAIT_QUEUE_HEAD(print_wait); /* waiting for printing finished */ /* status codes */ #define SLMSTAT_OK 0x00 diff --git a/drivers/block/amiflop.c b/drivers/block/amiflop.c index cc97d18dd..27ad0ec75 100644 --- a/drivers/block/amiflop.c +++ b/drivers/block/amiflop.c @@ -167,9 +167,9 @@ static int on_attempts; /* request loop (trackbuffer) */ static volatile int fdc_busy = -1; static volatile int fdc_nested = 0; -static struct wait_queue *fdc_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(fdc_wait); -static struct wait_queue *motor_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(motor_wait); static volatile int selected = -1; /* currently selected drive */ @@ -185,7 +185,7 @@ static char *raw_buf; * request. */ static volatile char block_flag = 0; -static struct wait_queue *wait_fd_block = NULL; +static DECLARE_WAIT_QUEUE_HEAD(wait_fd_block); /* MS-Dos MFM Coding tables (should go quick and easy) */ static unsigned char mfmencode[16]={ @@ -196,7 +196,7 @@ static unsigned char mfmdecode[128]; /* floppy internal millisecond timer stuff */ static volatile int ms_busy = -1; -static struct wait_queue *ms_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(ms_wait); #define MS_TICKS ((amiga_eclock+50)/1000) /* diff --git a/drivers/block/ataflop.c b/drivers/block/ataflop.c index 4f22bd609..f06aaccc2 100644 --- a/drivers/block/ataflop.c +++ b/drivers/block/ataflop.c @@ -314,8 +314,8 @@ MODULE_PARM(UserSteprate, "1-" __MODULE_STRING(FD_MAX_UNITS) "i"); /* Synchronization of FDC access. */ static volatile int fdc_busy = 0; -static struct wait_queue *fdc_wait = NULL; -static struct wait_queue *format_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(fdc_wait); +static DECLARE_WAIT_QUEUE_HEAD(format_wait); static unsigned int changed_floppies = 0xff, fake_change = 0; #define CHECK_CHANGE_DELAY HZ/2 diff --git a/drivers/block/ps2esdi.c b/drivers/block/ps2esdi.c index 7c2d36c72..015c9468b 100644 --- a/drivers/block/ps2esdi.c +++ b/drivers/block/ps2esdi.c @@ -108,7 +108,9 @@ void ps2esdi_reset_timer(unsigned long unused); u_int dma_arb_level; /* DMA arbitration level */ -static struct wait_queue *ps2esdi_int = NULL, *ps2esdi_wait_open = NULL; +static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_int); +static DECLARE_WAIT_QUEUE_HEAD(ps2esdi_wait_open); + int no_int_yet; static int access_count[MAX_HD] = {0,}; static char ps2esdi_valid[MAX_HD] = {0,}; diff --git a/drivers/block/raid5.c b/drivers/block/raid5.c index 66713a84b..3c5701b3e 100644 --- a/drivers/block/raid5.c +++ b/drivers/block/raid5.c @@ -91,7 +91,7 @@ static inline void finish_stripe(struct stripe_head *sh) void __wait_on_stripe(struct stripe_head *sh) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); PRINTK(("wait_on_stripe %lu\n", sh->sector)); sh->count++; @@ -1395,7 +1395,7 @@ static int raid5_run (int minor, struct md_dev *mddev) goto abort; memset(raid_conf->stripe_hashtbl, 0, HASH_PAGES * PAGE_SIZE); - init_waitqueue(&raid_conf->wait_for_stripe); + init_waitqueue_head(&raid_conf->wait_for_stripe); PRINTK(("raid5_run(%d) called.\n", minor)); for (i = 0; i < mddev->nb_dev; i++) { diff --git a/drivers/block/swim3.c b/drivers/block/swim3.c index 246405aff..cee5493da 100644 --- a/drivers/block/swim3.c +++ b/drivers/block/swim3.c @@ -193,7 +193,7 @@ struct floppy_state { struct timer_list timeout; int timeout_pending; int ejected; - struct wait_queue *wait; + wait_queue_head_t wait; int wanted; struct device_node* media_bay; /* NULL when not in bay */ char dbdma_cmd_space[5 * sizeof(struct dbdma_cmd)]; @@ -1132,6 +1132,7 @@ static int swim3_add_device(struct device_node *swim) fs->secpertrack = 18; fs->total_secs = 2880; fs->media_bay = mediabay; + init_waitqueue_head(&fs->wait); fs->dma_cmd = (struct dbdma_cmd *) DBDMA_ALIGN(fs->dbdma_cmd_space); memset(fs->dma_cmd, 0, 2 * sizeof(struct dbdma_cmd)); diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 8adc37fcb..9c1c2d7b1 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -159,7 +159,8 @@ static struct file_operations xd_fops = { xd_release, /* release */ block_fsync /* fsync */ }; -static struct wait_queue *xd_wait_int = NULL, *xd_wait_open = NULL; +static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); +static DECLARE_WAIT_QUEUE_HEAD(xd_wait_open); static u_char xd_valid[XD_MAXDRIVES] = { 0,0 }; static u_char xd_drives = 0, xd_irq = 5, xd_dma = 3, xd_maxsectors; static u_char xd_override __initdata = 0, xd_type = 0; @@ -167,7 +168,7 @@ static u_short xd_iobase = 0x320; static int xd_geo[XD_MAXDRIVES*3] __initdata = { 0,0,0,0,0,0 }; static volatile int xdc_busy = 0; -static struct wait_queue *xdc_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(xdc_wait); typedef void (*timeout_fn)(unsigned long); static struct timer_list xd_timer = { NULL, NULL, 0, 0, (timeout_fn) xd_wakeup }, diff --git a/drivers/misc/parport_share.c b/drivers/misc/parport_share.c index 3e9b7ace1..f413c0a65 100644 --- a/drivers/misc/parport_share.c +++ b/drivers/misc/parport_share.c @@ -277,7 +277,7 @@ struct pardevice *parport_register_device(struct parport *port, const char *name inc_parport_count(); port->ops->inc_use_count(); - init_waitqueue(&tmp->wait_q); + init_waitqueue_head(&tmp->wait_q); tmp->timeslice = PARPORT_DEFAULT_TIMESLICE; tmp->waitnext = tmp->waitprev = NULL; diff --git a/drivers/sound/dev_table.c b/drivers/sound/dev_table.c index dd12a0c68..71d820b9e 100644 --- a/drivers/sound/dev_table.c +++ b/drivers/sound/dev_table.c @@ -435,9 +435,9 @@ int sound_install_audiodrv(int vers, char *name, struct audio_driver *driver, return -(ENOMEM); } memset((char *) op, 0, sizeof(struct audio_operations)); - init_waitqueue(&op->in_sleeper); - init_waitqueue(&op->out_sleeper); - init_waitqueue(&op->poll_sleeper); + init_waitqueue_head(&op->in_sleeper); + init_waitqueue_head(&op->out_sleeper); + init_waitqueue_head(&op->poll_sleeper); if (driver_size < sizeof(struct audio_driver)) memset((char *) d, 0, sizeof(struct audio_driver)); diff --git a/drivers/sound/dmasound.c b/drivers/sound/dmasound.c index 5f96b3a42..d95f462f6 100644 --- a/drivers/sound/dmasound.c +++ b/drivers/sound/dmasound.c @@ -809,7 +809,7 @@ struct sound_queue { * Bit 1 is set: a frame is playing */ int playing; - struct wait_queue *write_queue, *open_queue, *sync_queue; + wait_queue_head_t write_queue, open_queue, sync_queue; int open_mode; int busy, syncing; #ifdef CONFIG_ATARI @@ -4623,7 +4623,9 @@ static void __init sq_init(void) if (sq_unit < 0) return; - sq.write_queue = sq.open_queue = sq.sync_queue = 0; + init_waitqueue_head(&sq.write_queue); + init_waitqueue_head(&sq.open_queue); + init_waitqueue_head(&sq.sync_queue); sq.busy = 0; /* whatever you like as startup mode for /dev/dsp, diff --git a/drivers/sound/es1370.c b/drivers/sound/es1370.c index 1ce70dc7b..caacf3f58 100644 --- a/drivers/sound/es1370.c +++ b/drivers/sound/es1370.c @@ -310,7 +310,7 @@ struct es1370_state { spinlock_t lock; struct semaphore open_sem; mode_t open_mode; - struct wait_queue *open_wait; + wait_queue_head_t open_wait; struct dmabuf { void *rawbuf; @@ -321,7 +321,7 @@ struct es1370_state { unsigned total_bytes; int count; unsigned error; /* over/underrun */ - struct wait_queue *wait; + wait_queue_head_t wait; /* redundant, but makes calculations easier */ unsigned fragsize; unsigned dmasize; @@ -339,8 +339,8 @@ struct es1370_state { struct { unsigned ird, iwr, icnt; unsigned ord, owr, ocnt; - struct wait_queue *iwait; - struct wait_queue *owait; + wait_queue_head_t iwait; + wait_queue_head_t owait; unsigned char ibuf[MIDIINBUF]; unsigned char obuf[MIDIOUTBUF]; } midi; @@ -1007,7 +1007,7 @@ static /*const*/ struct file_operations es1370_mixer_fops = { static int drain_dac1(struct es1370_state *s, int nonblock) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; int count, tmo; @@ -1042,7 +1042,7 @@ static int drain_dac1(struct es1370_state *s, int nonblock) static int drain_dac2(struct es1370_state *s, int nonblock) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; int count, tmo; @@ -2191,7 +2191,7 @@ static int es1370_midi_open(struct inode *inode, struct file *file) static int es1370_midi_release(struct inode *inode, struct file *file) { struct es1370_state *s = (struct es1370_state *)file->private_data; - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; unsigned count, tmo; @@ -2308,12 +2308,12 @@ __initfunc(int init_es1370(void)) continue; } memset(s, 0, sizeof(struct es1370_state)); - init_waitqueue(&s->dma_adc.wait); - init_waitqueue(&s->dma_dac1.wait); - init_waitqueue(&s->dma_dac2.wait); - init_waitqueue(&s->open_wait); - init_waitqueue(&s->midi.iwait); - init_waitqueue(&s->midi.owait); + init_waitqueue_head(&s->dma_adc.wait); + init_waitqueue_head(&s->dma_dac1.wait); + init_waitqueue_head(&s->dma_dac2.wait); + init_waitqueue_head(&s->open_wait); + init_waitqueue_head(&s->midi.iwait); + init_waitqueue_head(&s->midi.owait); s->open_sem = MUTEX; s->magic = ES1370_MAGIC; s->io = pcidev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; diff --git a/drivers/sound/es1371.c b/drivers/sound/es1371.c index fa2efd25f..e0882d7ce 100644 --- a/drivers/sound/es1371.c +++ b/drivers/sound/es1371.c @@ -361,7 +361,7 @@ struct es1371_state { spinlock_t lock; struct semaphore open_sem; mode_t open_mode; - struct wait_queue *open_wait; + wait_queue_head_t open_wait; struct dmabuf { void *rawbuf; @@ -372,7 +372,7 @@ struct es1371_state { unsigned total_bytes; int count; unsigned error; /* over/underrun */ - struct wait_queue *wait; + wait_queue_head_t wait; /* redundant, but makes calculations easier */ unsigned fragsize; unsigned dmasize; @@ -390,8 +390,8 @@ struct es1371_state { struct { unsigned ird, iwr, icnt; unsigned ord, owr, ocnt; - struct wait_queue *iwait; - struct wait_queue *owait; + wait_queue_head_t iwait; + wait_queue_head_t owait; unsigned char ibuf[MIDIINBUF]; unsigned char obuf[MIDIOUTBUF]; } midi; @@ -1454,7 +1454,7 @@ static /*const*/ struct file_operations es1371_mixer_fops = { static int drain_dac1(struct es1371_state *s, int nonblock) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; int count, tmo; @@ -1489,7 +1489,7 @@ static int drain_dac1(struct es1371_state *s, int nonblock) static int drain_dac2(struct es1371_state *s, int nonblock) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; int count, tmo; @@ -2625,7 +2625,7 @@ static int es1371_midi_open(struct inode *inode, struct file *file) static int es1371_midi_release(struct inode *inode, struct file *file) { struct es1371_state *s = (struct es1371_state *)file->private_data; - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; unsigned count, tmo; @@ -2745,12 +2745,12 @@ __initfunc(int init_es1371(void)) continue; } memset(s, 0, sizeof(struct es1371_state)); - init_waitqueue(&s->dma_adc.wait); - init_waitqueue(&s->dma_dac1.wait); - init_waitqueue(&s->dma_dac2.wait); - init_waitqueue(&s->open_wait); - init_waitqueue(&s->midi.iwait); - init_waitqueue(&s->midi.owait); + init_waitqueue_head(&s->dma_adc.wait); + init_waitqueue_head(&s->dma_dac1.wait); + init_waitqueue_head(&s->dma_dac2.wait); + init_waitqueue_head(&s->open_wait); + init_waitqueue_head(&s->midi.iwait); + init_waitqueue_head(&s->midi.owait); s->open_sem = MUTEX; s->magic = ES1371_MAGIC; s->io = pcidev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; diff --git a/drivers/sound/gus_wave.c b/drivers/sound/gus_wave.c index b0eacde38..0dddaacaa 100644 --- a/drivers/sound/gus_wave.c +++ b/drivers/sound/gus_wave.c @@ -118,7 +118,7 @@ static int gus_audio_bits; static int gus_audio_bsize; static char bounce_buf[8 * 1024]; /* Must match value set to max_fragment */ -static struct wait_queue *dram_sleeper = NULL; +static DECLARE_WAIT_QUEUE_HEAD(dram_sleeper); /* * Variables and buffers for PCM output @@ -1663,7 +1663,7 @@ static int guswave_open(int dev, int mode) gus_no_dma = 0; } - init_waitqueue(&dram_sleeper); + init_waitqueue_head(&dram_sleeper); gus_busy = 1; active_device = GUS_DEV_WAVE; diff --git a/drivers/sound/midibuf.c b/drivers/sound/midibuf.c index b1c9763e5..426821753 100644 --- a/drivers/sound/midibuf.c +++ b/drivers/sound/midibuf.c @@ -29,8 +29,8 @@ #define MAX_QUEUE_SIZE 4000 -static struct wait_queue *midi_sleeper[MAX_MIDI_DEV] = {NULL}; -static struct wait_queue *input_sleeper[MAX_MIDI_DEV] = {NULL}; +static wait_queue_head_t midi_sleeper[MAX_MIDI_DEV]; +static wait_queue_head_t input_sleeper[MAX_MIDI_DEV]; struct midi_buf { @@ -202,8 +202,8 @@ int MIDIbuf_open(int dev, struct file *file) midi_out_buf[dev]->len = midi_out_buf[dev]->head = midi_out_buf[dev]->tail = 0; open_devs++; - init_waitqueue(&midi_sleeper[dev]); - init_waitqueue(&input_sleeper[dev]); + init_waitqueue_head(&midi_sleeper[dev]); + init_waitqueue_head(&input_sleeper[dev]); if (open_devs < 2) /* This was first open */ { diff --git a/drivers/sound/msnd_pinnacle.c b/drivers/sound/msnd_pinnacle.c index 7bf7364ab..05845cf96 100644 --- a/drivers/sound/msnd_pinnacle.c +++ b/drivers/sound/msnd_pinnacle.c @@ -1913,9 +1913,9 @@ __initfunc(int msnd_pinnacle_init(void)) if (digital) set_bit(F_HAVEDIGITAL, &dev.flags); #endif - init_waitqueue(&dev.writeblock); - init_waitqueue(&dev.readblock); - init_waitqueue(&dev.writeflush); + init_waitqueue_head(&dev.writeblock); + init_waitqueue_head(&dev.readblock); + init_waitqueue_head(&dev.writeflush); msnd_fifo_init(&dev.DAPF); msnd_fifo_init(&dev.DARF); #ifndef LINUX20 diff --git a/drivers/sound/sequencer.c b/drivers/sound/sequencer.c index af40a2117..8fee21c6b 100644 --- a/drivers/sound/sequencer.c +++ b/drivers/sound/sequencer.c @@ -53,8 +53,8 @@ static int max_synthdev = 0; #define SEQ_2 2 static int seq_mode = SEQ_1; -static struct wait_queue *seq_sleeper = NULL; -static struct wait_queue *midi_sleeper = NULL; +static DECLARE_WAIT_QUEUE_HEAD(seq_sleeper); +static DECLARE_WAIT_QUEUE_HEAD(midi_sleeper); static int midi_opened[MAX_MIDI_DEV] = { 0 @@ -1117,8 +1117,8 @@ int sequencer_open(int dev, struct file *file) if (seq_mode == SEQ_2) tmr->open(tmr_no, seq_mode); - init_waitqueue(&seq_sleeper); - init_waitqueue(&midi_sleeper); + init_waitqueue_head(&seq_sleeper); + init_waitqueue_head(&midi_sleeper); output_threshold = SEQ_MAX_QUEUE / 2; return 0; diff --git a/drivers/sound/sonicvibes.c b/drivers/sound/sonicvibes.c index c6d30d43f..76f6c1497 100644 --- a/drivers/sound/sonicvibes.c +++ b/drivers/sound/sonicvibes.c @@ -286,7 +286,7 @@ struct sv_state { spinlock_t lock; struct semaphore open_sem; mode_t open_mode; - struct wait_queue *open_wait; + wait_queue_head_t open_wait; struct dmabuf { void *rawbuf; @@ -297,7 +297,7 @@ struct sv_state { unsigned total_bytes; int count; unsigned error; /* over/underrun */ - struct wait_queue *wait; + wait_queue_head_t wait; /* redundant, but makes calculations easier */ unsigned fragsize; unsigned dmasize; @@ -315,8 +315,8 @@ struct sv_state { struct { unsigned ird, iwr, icnt; unsigned ord, owr, ocnt; - struct wait_queue *iwait; - struct wait_queue *owait; + wait_queue_head_t iwait; + wait_queue_head_t owait; struct timer_list timer; unsigned char ibuf[MIDIINBUF]; unsigned char obuf[MIDIOUTBUF]; @@ -1241,7 +1241,7 @@ static /*const*/ struct file_operations sv_mixer_fops = { static int drain_dac(struct sv_state *s, int nonblock) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; int count, tmo; @@ -2043,7 +2043,7 @@ static int sv_midi_open(struct inode *inode, struct file *file) static int sv_midi_release(struct inode *inode, struct file *file) { struct sv_state *s = (struct sv_state *)file->private_data; - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long flags; unsigned count, tmo; @@ -2344,11 +2344,11 @@ __initfunc(int init_sonicvibes(void)) continue; } memset(s, 0, sizeof(struct sv_state)); - init_waitqueue(&s->dma_adc.wait); - init_waitqueue(&s->dma_dac.wait); - init_waitqueue(&s->open_wait); - init_waitqueue(&s->midi.iwait); - init_waitqueue(&s->midi.owait); + init_waitqueue_head(&s->dma_adc.wait); + init_waitqueue_head(&s->dma_dac.wait); + init_waitqueue_head(&s->open_wait); + init_waitqueue_head(&s->midi.iwait); + init_waitqueue_head(&s->midi.owait); s->open_sem = MUTEX; s->magic = SV_MAGIC; s->iosb = pcidev->base_address[0] & PCI_BASE_ADDRESS_IO_MASK; diff --git a/drivers/sound/wavfront.c b/drivers/sound/wavfront.c index b6ec7c263..ac58b97da 100644 --- a/drivers/sound/wavfront.c +++ b/drivers/sound/wavfront.c @@ -290,7 +290,7 @@ struct wf_config { int samples_used; /* how many */ char interrupts_on; /* h/w MPU interrupts enabled ? */ char rom_samples_rdonly; /* can we write on ROM samples */ - struct wait_queue *interrupt_sleeper; + wait_queue_head_t interrupt_sleeper; } dev; static int detect_wffx(void); @@ -2535,7 +2535,7 @@ __initfunc (static int detect_wavefront (int irq, int io_base)) } - init_waitqueue (&dev.interrupt_sleeper); + init_waitqueue_head (&dev.interrupt_sleeper); if (wavefront_hw_reset ()) { printk (KERN_WARNING LOGNAME "hardware reset failed\n"); diff --git a/drivers/usb/hub.c b/drivers/usb/hub.c index 16789b944..95c65e0cd 100644 --- a/drivers/usb/hub.c +++ b/drivers/usb/hub.c @@ -24,7 +24,7 @@ extern struct usb_operations uhci_device_operations; /* Wakes up khubd */ -static struct wait_queue *usb_hub_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(usb_hub_wait); static spinlock_t hub_event_lock = SPIN_LOCK_UNLOCKED; /* List of hubs needing servicing */ diff --git a/drivers/usb/mouse.c b/drivers/usb/mouse.c index 4d346c41a..59b93bd82 100644 --- a/drivers/usb/mouse.c +++ b/drivers/usb/mouse.c @@ -48,13 +48,17 @@ struct mouse_state { int present; /* this mouse is plugged in */ int active; /* someone is has this mouse's device open */ int ready; /* the mouse has changed state since the last read */ - struct wait_queue *wait; /* for polling */ + wait_queue_head_t wait; /* for polling */ struct fasync_struct *fasync; /* later, add a list here to support multiple mice */ /* but we will also need a list of file pointers to identify it */ }; -static struct mouse_state static_mouse_state; +static struct mouse_state static_mouse_state = { + 0, 0, 0, 0, + 0, 0, 0, + __WAIT_QUEUE_HEAD_INITIALIZER(static_mouse_state.wait), +}; spinlock_t usb_mouse_lock = SPIN_LOCK_UNLOCKED; diff --git a/drivers/usb/ohci-hcd.c b/drivers/usb/ohci-hcd.c index da3ef6657..2dadb9195 100644 --- a/drivers/usb/ohci-hcd.c +++ b/drivers/usb/ohci-hcd.c @@ -63,8 +63,8 @@ static int apm_resume = 0; -static struct wait_queue *control_wakeup; -static struct wait_queue *root_hub = NULL; +static DECLARE_WAIT_QUEUE_HEAD(control_wakeup); +static DECLARE_WAIT_QUEUE_HEAD(root_hub); static __u8 cc_to_status[16] = { /* mapping of the OHCI CC to the UHCI status codes; first guess */ /* Activ, Stalled, Data Buffer Err, Babble Detected : NAK recvd, CRC/Timeout, Bitstuff, reservd */ @@ -145,7 +145,7 @@ static int sohci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_ static int sohci_control_msg(struct usb_device *usb_dev, unsigned int pipe, void *cmd, void *data, int len) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); struct ohci * ohci = usb_dev->bus->hcpriv; int status; union ep_addr_ ep_addr; diff --git a/drivers/usb/ohci.c b/drivers/usb/ohci.c index b12d0114c..a000c015b 100644 --- a/drivers/usb/ohci.c +++ b/drivers/usb/ohci.c @@ -57,7 +57,7 @@ static int handle_apm_event(apm_event_t event); static int apm_resume = 0; #endif -static struct wait_queue *ohci_configure = NULL; +static DECLARE_WAIT_QUEUE_HEAD(ohci_configure); #ifdef OHCI_TIMER static struct timer_list ohci_timer; /* timer for root hub polling */ @@ -476,7 +476,7 @@ static int ohci_request_irq(struct usb_device *usb, unsigned int pipe, /* * Control thread operations: */ -static struct wait_queue *control_wakeup; +static DECLARE_WAIT_QUEUE_HEAD(control_wakeup); /* * This is the handler that gets called when a control transaction @@ -515,7 +515,7 @@ static int ohci_control_msg(struct usb_device *usb, unsigned int pipe, void *cmd */ struct ohci_ed *control_ed = &dev->ohci->root_hub->ed[ED_CONTROL]; struct ohci_td *setup_td, *data_td, *status_td; - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); #if 0 printk(KERN_DEBUG "entering ohci_control_msg %p (ohci_dev: %p) pipe 0x%x, cmd %p, data %p, len %d\n", usb, dev, pipe, cmd, data, len); diff --git a/drivers/usb/uhci.c b/drivers/usb/uhci.c index 3d8ccdb7d..c9a57627a 100644 --- a/drivers/usb/uhci.c +++ b/drivers/usb/uhci.c @@ -47,7 +47,7 @@ static int apm_resume = 0; #define compile_assert(x) do { switch (0) { case 1: case !(x): } } while (0) -static struct wait_queue *uhci_configure = NULL; +static DECLARE_WAIT_QUEUE_HEAD(uhci_configure); /* * Return the result of a TD.. @@ -312,7 +312,7 @@ static int uhci_request_irq(struct usb_device *usb_dev, unsigned int pipe, usb_d * We need to remove the TD from the lists (both interrupt * list and TD lists) by hand if something bad happens! */ -static struct wait_queue *control_wakeup; +static DECLARE_WAIT_QUEUE_HEAD(control_wakeup); static int uhci_control_completed(int status, void *buffer, void *dev_id) { @@ -323,7 +323,7 @@ static int uhci_control_completed(int status, void *buffer, void *dev_id) /* td points to the last td in the list, which interrupts on completion */ static int uhci_run_control(struct uhci_device *dev, struct uhci_td *first, struct uhci_td *last) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); struct uhci_qh *ctrl_qh = uhci_qh_allocate(dev); struct uhci_td *curtd; diff --git a/fs/coda/cnode.c b/fs/coda/cnode.c index 2a099d865..9fc3e9bc6 100644 --- a/fs/coda/cnode.c +++ b/fs/coda/cnode.c @@ -29,21 +29,8 @@ static void coda_fill_inode(struct inode *inode, struct coda_vattr *attr) inode->i_op = &coda_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &coda_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) { - inode->i_op = &chrdev_inode_operations; - inode->i_rdev = to_kdev_t(attr->va_rdev); - } else if (S_ISBLK(inode->i_mode)) { - inode->i_op = &blkdev_inode_operations; - inode->i_rdev = to_kdev_t(attr->va_rdev); - } else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); - else if (S_ISSOCK(inode->i_mode)) - inode->i_op = NULL; - else { - printk ("coda_fill_inode: what's this? i_mode = %o\n", - inode->i_mode); - inode->i_op = NULL; - } + else + init_special_inode(inode, inode->i_mode, attr->va_rdev); } /* this is effectively coda_iget: diff --git a/fs/coda/upcall.c b/fs/coda/upcall.c index d3f0161a3..a0c1092b2 100644 --- a/fs/coda/upcall.c +++ b/fs/coda/upcall.c @@ -587,7 +587,7 @@ int venus_pioctl(struct super_block *sb, struct ViceFid *fid, static inline unsigned long coda_waitfor_upcall(struct upc_req *vmp) { - struct wait_queue wait = { current, NULL }; + DECLARE_WAITQUEUE(wait, current); unsigned long posttime; vmp->uc_posttime = jiffies; @@ -662,7 +662,7 @@ ENTRY; req->uc_outSize = *outSize ? *outSize : inSize; req->uc_opcode = ((union inputArgs *)buffer)->ih.opcode; req->uc_unique = ++vcommp->vc_seq; - req->uc_sleep = NULL; + init_waitqueue_head(&req->uc_sleep); /* Fill in the common input args. */ ((union inputArgs *)buffer)->ih.unique = req->uc_unique; diff --git a/fs/devices.c b/fs/devices.c index 2ff69850a..30db1ace1 100644 --- a/fs/devices.c +++ b/fs/devices.c @@ -370,3 +370,21 @@ char * cdevname(kdev_t dev) sprintf(buffer, "%s(%d,%d)", name, MAJOR(dev), MINOR(dev)); return buffer; } + +void init_special_inode(struct inode *inode, umode_t mode, int rdev) +{ + inode->i_mode = mode; + inode->i_op = NULL; + if (S_ISCHR(mode)) { + inode->i_op = &chrdev_inode_operations; + inode->i_rdev = to_kdev_t(rdev); + } else if (S_ISBLK(mode)) { + inode->i_op = &blkdev_inode_operations; + inode->i_rdev = to_kdev_t(rdev); + } else if (S_ISFIFO(mode)) + init_fifo(inode); + else if (S_ISSOCK(mode)) + ; + else + printk(KERN_DEBUG "init_special_inode: bogus imode (%o)\n", mode); +} diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c index 62fd726ed..693964a80 100644 --- a/fs/ext2/inode.c +++ b/fs/ext2/inode.c @@ -569,15 +569,11 @@ void ext2_read_inode (struct inode * inode) if (inode->u.ext2_i.i_prealloc_count) ext2_error (inode->i_sb, "ext2_read_inode", "New inode has non-zero prealloc count!"); - if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) - inode->i_rdev = to_kdev_t(le32_to_cpu(raw_inode->i_block[0])); - else if (S_ISLNK(inode->i_mode) && !inode->i_blocks) + if (S_ISLNK(inode->i_mode) && !inode->i_blocks) for (block = 0; block < EXT2_N_BLOCKS; block++) inode->u.ext2_i.i_data[block] = raw_inode->i_block[block]; else for (block = 0; block < EXT2_N_BLOCKS; block++) inode->u.ext2_i.i_data[block] = le32_to_cpu(raw_inode->i_block[block]); - brelse (bh); - inode->i_op = NULL; if (inode->i_ino == EXT2_ACL_IDX_INO || inode->i_ino == EXT2_ACL_DATA_INO) /* Nothing to do */ ; @@ -587,12 +583,10 @@ void ext2_read_inode (struct inode * inode) inode->i_op = &ext2_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &ext2_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); + else + init_special_inode(inode, inode->i_mode, + le32_to_cpu(raw_inode->i_block[0])); + brelse (bh); inode->i_attr_flags = 0; if (inode->u.ext2_i.i_flags & EXT2_SYNC_FL) { inode->i_attr_flags |= ATTR_FLAG_SYNCRONOUS; diff --git a/fs/ext2/namei.c b/fs/ext2/namei.c index 4a8c4a7d6..6bfa7041d 100644 --- a/fs/ext2/namei.c +++ b/fs/ext2/namei.c @@ -347,6 +347,25 @@ static int ext2_delete_entry (struct ext2_dir_entry_2 * dir, return -ENOENT; } +static inline void ext2_set_de_type(struct super_block *sb, + struct ext2_dir_entry_2 *de, + umode_t mode) { + if (!EXT2_HAS_INCOMPAT_FEATURE(sb, EXT2_FEATURE_INCOMPAT_FILETYPE)) + return; + if (S_ISCHR(mode)) + de->file_type = EXT2_FT_CHRDEV; + else if (S_ISBLK(mode)) + de->file_type = EXT2_FT_BLKDEV; + else if (S_ISFIFO(mode)) + de->file_type = EXT2_FT_FIFO; + else if (S_ISLNK(mode)) + de->file_type = EXT2_FT_SYMLINK; + else if (S_ISREG(mode)) + de->file_type = EXT2_FT_REG_FILE; + else if (S_ISDIR(mode)) + de->file_type = EXT2_FT_DIR; +} + /* * By the time this is called, we already have created * the directory cache entry for the new file, but it @@ -380,9 +399,7 @@ int ext2_create (struct inode * dir, struct dentry * dentry, int mode) return err; } de->inode = cpu_to_le32(inode->i_ino); - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_REG_FILE; + ext2_set_de_type(dir->i_sb, de, S_IFREG); dir->i_version = ++event; mark_buffer_dirty(bh, 1); if (IS_SYNC(dir)) { @@ -406,36 +423,13 @@ int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) goto out; inode->i_uid = current->fsuid; - inode->i_mode = mode; - inode->i_op = NULL; + init_special_inode(inode, mode, rdev); bh = ext2_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err); if (!bh) goto out_no_entry; de->inode = cpu_to_le32(inode->i_ino); dir->i_version = ++event; - if (S_ISREG(inode->i_mode)) { - inode->i_op = &ext2_file_inode_operations; - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_REG_FILE; - } else if (S_ISCHR(inode->i_mode)) { - inode->i_op = &chrdev_inode_operations; - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_CHRDEV; - } else if (S_ISBLK(inode->i_mode)) { - inode->i_op = &blkdev_inode_operations; - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_BLKDEV; - } else if (S_ISFIFO(inode->i_mode)) { - init_fifo(inode); - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_FIFO; - } - if (S_ISBLK(mode) || S_ISCHR(mode)) - inode->i_rdev = to_kdev_t(rdev); + ext2_set_de_type(dir->i_sb, de, inode->i_mode); mark_inode_dirty(inode); mark_buffer_dirty(bh, 1); if (IS_SYNC(dir)) { @@ -486,17 +480,13 @@ int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) de->name_len = 1; de->rec_len = cpu_to_le16(EXT2_DIR_REC_LEN(de->name_len)); strcpy (de->name, "."); - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_DIR; + ext2_set_de_type(dir->i_sb, de, S_IFDIR); de = (struct ext2_dir_entry_2 *) ((char *) de + le16_to_cpu(de->rec_len)); de->inode = cpu_to_le32(dir->i_ino); de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize - EXT2_DIR_REC_LEN(1)); de->name_len = 2; strcpy (de->name, ".."); - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_DIR; + ext2_set_de_type(dir->i_sb, de, S_IFDIR); inode->i_nlink = 2; mark_buffer_dirty(dir_block, 1); brelse (dir_block); @@ -508,9 +498,7 @@ int ext2_mkdir(struct inode * dir, struct dentry * dentry, int mode) if (!bh) goto out_no_entry; de->inode = cpu_to_le32(inode->i_ino); - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_DIR; + ext2_set_de_type(dir->i_sb, de, S_IFDIR); dir->i_version = ++event; mark_buffer_dirty(bh, 1); if (IS_SYNC(dir)) { @@ -744,9 +732,7 @@ int ext2_symlink (struct inode * dir, struct dentry *dentry, const char * symnam if (!bh) goto out_no_entry; de->inode = cpu_to_le32(inode->i_ino); - if (EXT2_HAS_INCOMPAT_FEATURE(dir->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) - de->file_type = EXT2_FT_SYMLINK; + ext2_set_de_type(dir->i_sb, de, S_IFLNK); dir->i_version = ++event; mark_buffer_dirty(bh, 1); if (IS_SYNC(dir)) { @@ -785,21 +771,7 @@ int ext2_link (struct dentry * old_dentry, return err; de->inode = cpu_to_le32(inode->i_ino); - if (EXT2_HAS_INCOMPAT_FEATURE(inode->i_sb, - EXT2_FEATURE_INCOMPAT_FILETYPE)) { - if (S_ISREG(inode->i_mode)) - de->file_type = EXT2_FT_REG_FILE; - else if (S_ISDIR(inode->i_mode)) - de->file_type = EXT2_FT_DIR; - else if (S_ISLNK(inode->i_mode)) - de->file_type = EXT2_FT_SYMLINK; - else if (S_ISCHR(inode->i_mode)) - de->file_type = EXT2_FT_CHRDEV; - else if (S_ISBLK(inode->i_mode)) - de->file_type = EXT2_FT_BLKDEV; - else if (S_ISFIFO(inode->i_mode)) - de->file_type = EXT2_FT_FIFO; - } + ext2_set_de_type(dir->i_sb, de, inode->i_mode); dir->i_version = ++event; mark_buffer_dirty(bh, 1); if (IS_SYNC(dir)) { diff --git a/fs/fat/misc.c b/fs/fat/misc.c index 1dfddd3c7..22d9d8af9 100644 --- a/fs/fat/misc.c +++ b/fs/fat/misc.c @@ -79,7 +79,7 @@ int fat_is_binary(char conversion,char *extension) /* File creation lock. This is system-wide to avoid deadlocks in rename. */ /* (rename might deadlock before detecting cross-FS moves.) */ -static struct wait_queue *creation_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(creation_wait); static int creation_lock = 0; diff --git a/fs/hfs/dir.c b/fs/hfs/dir.c index b355408c9..6d1110096 100644 --- a/fs/hfs/dir.c +++ b/fs/hfs/dir.c @@ -255,31 +255,6 @@ int hfs_mkdir(struct inode * parent, struct dentry *dentry, int mode) } /* - * hfs_mknod() - * - * This is the mknod() entry in the inode_operations structure for - * regular HFS directories. The purpose is to create a new entry - * in a directory, given the inode for the parent directory and the - * name (and its length) and the mode of the new entry (and the device - * number if the entry is to be a device special file). - * - * HFS only supports regular files and directories and Linux disallows - * using mknod() to create directories. Thus we just check the arguments - * and call hfs_create(). - */ -int hfs_mknod(struct inode *dir, struct dentry *dentry, int mode, int rdev) -{ - if (!dir) - return -ENOENT; - - /* the only thing we currently do. */ - if (S_ISREG(mode)) - return hfs_create(dir, dentry, mode); - - return -EPERM; -} - -/* * hfs_unlink() * * This is the unlink() entry in the inode_operations structure for diff --git a/fs/hfs/dir_cap.c b/fs/hfs/dir_cap.c index 0ab81d966..7460cca62 100644 --- a/fs/hfs/dir_cap.c +++ b/fs/hfs/dir_cap.c @@ -83,7 +83,7 @@ struct inode_operations hfs_cap_ndir_inode_operations = { NULL, /* symlink */ hfs_mkdir, /* mkdir */ hfs_rmdir, /* rmdir */ - hfs_mknod, /* mknod */ + NULL, /* mknod */ hfs_rename, /* rename */ NULL, /* readlink */ NULL, /* follow_link */ diff --git a/fs/hfs/dir_dbl.c b/fs/hfs/dir_dbl.c index 80e990627..e5ad80511 100644 --- a/fs/hfs/dir_dbl.c +++ b/fs/hfs/dir_dbl.c @@ -27,7 +27,6 @@ static struct dentry *dbl_lookup(struct inode *, struct dentry *); static int dbl_readdir(struct file *, void *, filldir_t); static int dbl_create(struct inode *, struct dentry *, int); static int dbl_mkdir(struct inode *, struct dentry *, int); -static int dbl_mknod(struct inode *, struct dentry *, int, int); static int dbl_unlink(struct inode *, struct dentry *); static int dbl_rmdir(struct inode *, struct dentry *); static int dbl_rename(struct inode *, struct dentry *, @@ -83,7 +82,7 @@ struct inode_operations hfs_dbl_dir_inode_operations = { NULL, /* symlink */ dbl_mkdir, /* mkdir */ dbl_rmdir, /* rmdir */ - dbl_mknod, /* mknod */ + NULL, /* mknod */ dbl_rename, /* rename */ NULL, /* readlink */ NULL, /* follow_link */ @@ -323,28 +322,6 @@ static int dbl_mkdir(struct inode * parent, struct dentry *dentry, } /* - * dbl_mknod() - * - * This is the mknod() entry in the inode_operations structure for - * regular HFS directories. The purpose is to create a new entry - * in a directory, given the inode for the parent directory and the - * name (and its length) and the mode of the new entry (and the device - * number if the entry is to be a device special file). - */ -static int dbl_mknod(struct inode *dir, struct dentry *dentry, - int mode, int rdev) -{ - int error; - - if (is_hdr(dir, dentry->d_name.name, dentry->d_name.len)) { - error = -EEXIST; - } else { - error = hfs_mknod(dir, dentry, mode, rdev); - } - return error; -} - -/* * dbl_unlink() * * This is the unlink() entry in the inode_operations structure for diff --git a/fs/hfs/dir_nat.c b/fs/hfs/dir_nat.c index 5cff9d814..f9f131a17 100644 --- a/fs/hfs/dir_nat.c +++ b/fs/hfs/dir_nat.c @@ -89,7 +89,7 @@ struct inode_operations hfs_nat_ndir_inode_operations = { NULL, /* symlink */ hfs_mkdir, /* mkdir */ nat_rmdir, /* rmdir */ - hfs_mknod, /* mknod */ + NULL, /* mknod */ hfs_rename, /* rename */ NULL, /* readlink */ NULL, /* follow_link */ diff --git a/fs/isofs/inode.c b/fs/isofs/inode.c index 3ab20a303..9dc1f7dee 100644 --- a/fs/isofs/inode.c +++ b/fs/isofs/inode.c @@ -1211,12 +1211,9 @@ void isofs_read_inode(struct inode * inode) inode->i_op = &isofs_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &isofs_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); + else + /* XXX - parse_rock_ridge_inode() had already set i_rdev. */ + init_special_inode(inode, inode->i_mode, kdev_t_to_nr(inode->i_rdev)); } return; diff --git a/fs/minix/inode.c b/fs/minix/inode.c index 60032292c..f454c1ead 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c @@ -756,23 +756,17 @@ static void V1_minix_read_inode(struct inode * inode) inode->i_size = raw_inode->i_size; inode->i_mtime = inode->i_atime = inode->i_ctime = raw_inode->i_time; inode->i_blocks = inode->i_blksize = 0; - if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) - inode->i_rdev = to_kdev_t(raw_inode->i_zone[0]); - else for (block = 0; block < 9; block++) + for (block = 0; block < 9; block++) inode->u.minix_i.u.i1_data[block] = raw_inode->i_zone[block]; - brelse(bh); if (S_ISREG(inode->i_mode)) inode->i_op = &minix_file_inode_operations; else if (S_ISDIR(inode->i_mode)) inode->i_op = &minix_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &minix_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); + else + init_special_inode(inode, inode->i_mode, raw_inode->i_zone[0]); + brelse(bh); } /* @@ -812,23 +806,17 @@ static void V2_minix_read_inode(struct inode * inode) inode->i_atime = raw_inode->i_atime; inode->i_ctime = raw_inode->i_ctime; inode->i_blocks = inode->i_blksize = 0; - if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) - inode->i_rdev = to_kdev_t(raw_inode->i_zone[0]); - else for (block = 0; block < 10; block++) + for (block = 0; block < 10; block++) inode->u.minix_i.u.i2_data[block] = raw_inode->i_zone[block]; - brelse(bh); if (S_ISREG(inode->i_mode)) inode->i_op = &minix_file_inode_operations; else if (S_ISDIR(inode->i_mode)) inode->i_op = &minix_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &minix_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); + else + init_special_inode(inode, inode->i_mode, raw_inode->i_zone[0]); + brelse(bh); } /* diff --git a/fs/minix/namei.c b/fs/minix/namei.c index e6d680ecf..c2366ae4b 100644 --- a/fs/minix/namei.c +++ b/fs/minix/namei.c @@ -253,18 +253,7 @@ int minix_mknod(struct inode * dir, struct dentry *dentry, int mode, int rdev) if (!inode) return -ENOSPC; inode->i_uid = current->fsuid; - inode->i_mode = mode; - inode->i_op = NULL; - if (S_ISREG(inode->i_mode)) - inode->i_op = &minix_file_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); - if (S_ISBLK(mode) || S_ISCHR(mode)) - inode->i_rdev = to_kdev_t(rdev); + init_special_inode(inode, mode, rdev); mark_inode_dirty(inode); error = minix_add_entry(dir, dentry->d_name.name, dentry->d_name.len, &bh, &de); if (error) { diff --git a/fs/namei.c b/fs/namei.c index b91b43a1f..93df6705c 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -633,6 +633,24 @@ static inline int lookup_flags(unsigned int f) return retval; } +int vfs_create(struct inode *dir, struct dentry *dentry, int mode) +{ + int error; + + error = may_create(dir, dentry); + if (error) + goto exit_lock; + + error = -EACCES; /* shouldn't it be ENOSYS? */ + if (!dir->i_op || !dir->i_op->create) + goto exit_lock; + + DQUOT_INIT(dir); + error = dir->i_op->create(dir, dentry, mode); +exit_lock: + return error; +} + /* * open_namei() * @@ -695,16 +713,11 @@ struct dentry * open_namei(const char * pathname, int flag, int mode) error = 0; if (flag & O_EXCL) error = -EEXIST; - } else if ((error = may_create(dir->d_inode, dentry)) == 0) { - if (!dir->d_inode->i_op || !dir->d_inode->i_op->create) - error = -EACCES; - else { - DQUOT_INIT(dir->d_inode); - error = dir->d_inode->i_op->create(dir->d_inode, dentry, mode); - /* Don't check for write permission, don't truncate */ - acc_mode = 0; - flag &= ~O_TRUNC; - } + } else { + error = vfs_create(dir->d_inode, dentry,mode); + /* Don't check for write permission, don't truncate */ + acc_mode = 0; + flag &= ~O_TRUNC; } unlock_dir(dir); if (error) @@ -825,32 +838,45 @@ asmlinkage int sys_mknod(const char * filename, int mode, dev_t dev) { int error; char * tmp; + struct dentry * dentry; lock_kernel(); error = -EPERM; if (S_ISDIR(mode) || (!S_ISFIFO(mode) && !capable(CAP_SYS_ADMIN))) goto out; + tmp = getname(filename); + error = PTR_ERR(tmp); + if (IS_ERR(tmp)) + goto out; + error = -EINVAL; switch (mode & S_IFMT) { case 0: - mode |= S_IFREG; - break; - case S_IFREG: case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK: + mode |= S_IFREG; /* fallthrough */ + case S_IFREG: + mode &= ~current->fs->umask; + dentry = lookup_dentry(filename, NULL, LOOKUP_FOLLOW); + if (IS_ERR(dentry)) + error = PTR_ERR(dentry); + else { + struct dentry *dir = lock_parent(dentry); + error = -ENOENT; + if (check_parent(dir, dentry)) + error = vfs_create(dir->d_inode, dentry, mode); + dput(dentry); + } break; - default: - goto out; - } - tmp = getname(filename); - error = PTR_ERR(tmp); - if (!IS_ERR(tmp)) { - struct dentry * dentry = do_mknod(tmp,mode,dev); - putname(tmp); + case S_IFCHR: case S_IFBLK: case S_IFIFO: case S_IFSOCK: + dentry = do_mknod(tmp,mode,dev); error = PTR_ERR(dentry); if (!IS_ERR(dentry)) { dput(dentry); error = 0; } + break; } + putname(tmp); + out: unlock_kernel(); return error; diff --git a/fs/ncpfs/dir.c b/fs/ncpfs/dir.c index cacc0d5c5..8fc3a0994 100644 --- a/fs/ncpfs/dir.c +++ b/fs/ncpfs/dir.c @@ -39,7 +39,7 @@ static int c_seen_eof; static int c_last_returned_index; static struct ncp_dirent *c_entry = NULL; static int c_lock = 0; -static struct wait_queue *c_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(c_wait); static int ncp_read_volume_list(struct ncp_server *, int, int, struct ncp_dirent *); diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index c46eeb57b..3b5931ecc 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -470,16 +470,8 @@ nfs_fill_inode(struct inode *inode, struct nfs_fattr *fattr) inode->i_op = &nfs_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &nfs_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) { - inode->i_op = &chrdev_inode_operations; - inode->i_rdev = to_kdev_t(fattr->rdev); - } else if (S_ISBLK(inode->i_mode)) { - inode->i_op = &blkdev_inode_operations; - inode->i_rdev = to_kdev_t(fattr->rdev); - } else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); else - inode->i_op = NULL; + init_special_inode(inode, inode->i_mode, fattr->rdev); /* * Preset the size and mtime, as there's no need * to invalidate the caches. diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c index eb644935c..f7d2cc551 100644 --- a/fs/nfsd/export.c +++ b/fs/nfsd/export.c @@ -64,7 +64,7 @@ static int initialized = 0; static int hash_lock = 0; static int want_lock = 0; static int hash_count = 0; -static struct wait_queue * hash_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD( hash_wait ); #define READLOCK 0 #define WRITELOCK 1 diff --git a/fs/proc/omirr.c b/fs/proc/omirr.c index 9bde82e82..dbf2b32b9 100644 --- a/fs/proc/omirr.c +++ b/fs/proc/omirr.c @@ -16,8 +16,8 @@ static int cleared_flag = 0; static char * buffer = NULL; static int read_pos, write_pos; static int clip_pos, max_pos; -static struct wait_queue * read_wait = NULL; -static struct wait_queue * write_wait = NULL; +static DECLARE_WAIT_QUEUE_HEAD(read_wait); +static DECLARE_WAIT_QUEUE_HEAD(write_wait); static /*inline*/ int reserve_write_space(int len) { diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 626167044..388593cc1 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c @@ -408,29 +408,16 @@ static void qnx4_read_inode(struct inode *inode) memcpy(&inode->u.qnx4_i, (struct qnx4_inode_info *) raw_inode, QNX4_DIR_ENTRY_SIZE); inode->i_op = &qnx4_file_inode_operations; - if (S_ISREG(inode->i_mode)) { + if (S_ISREG(inode->i_mode)) inode->i_op = &qnx4_file_inode_operations; - } else { - if (S_ISDIR(inode->i_mode)) { - inode->i_op = &qnx4_dir_inode_operations; - } else { - if (S_ISLNK(inode->i_mode)) { - inode->i_op = &qnx4_symlink_inode_operations; - } else { - if (S_ISCHR(inode->i_mode)) { - inode->i_op = &chrdev_inode_operations; - } else { - if (S_ISBLK(inode->i_mode)) { - inode->i_op = &blkdev_inode_operations; - } else { - if (S_ISFIFO(inode->i_mode)) { - init_fifo(inode); - } - } - } - } - } - } + else if (S_ISDIR(inode->i_mode)) + inode->i_op = &qnx4_dir_inode_operations; + else if (S_ISLNK(inode->i_mode)) + inode->i_op = &qnx4_symlink_inode_operations; + else + /* HUH??? Where is device number? Oh, well... */ + init_special_inode(inode, inode->i_mode, 0); + brelse(bh); } diff --git a/fs/sysv/CHANGES b/fs/sysv/CHANGES index 94507925c..3cbcd7b9d 100644 --- a/fs/sysv/CHANGES +++ b/fs/sysv/CHANGES @@ -53,3 +53,8 @@ Sun, 21 Mar 1999 AV _inode()'s job. * ialloc.c: (sysv_free_inode): Fixed race. + +Sun, 30 Apr 1999 AV + * namei.c (sysv_mknod): + Removed dead code (S_IFREG case is now passed to + ->create() by VFS). diff --git a/fs/sysv/inode.c b/fs/sysv/inode.c index f58560996..18f98d353 100644 --- a/fs/sysv/inode.c +++ b/fs/sysv/inode.c @@ -882,7 +882,7 @@ void sysv_read_inode(struct inode * inode) } inode->i_blocks = inode->i_blksize = 0; if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) - inode->i_rdev = to_kdev_t(raw_inode->i_a.i_rdev); + ; else if (sb->sv_convert) for (block = 0; block < 10+1+1+1; block++) @@ -899,12 +899,8 @@ void sysv_read_inode(struct inode * inode) inode->i_op = &sysv_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &sysv_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); + else + init_special_inode(inode, inode->i_mode,raw_inode->i_a.i_rdev); } /* To avoid inconsistencies between inodes in memory and inodes on disk. */ diff --git a/fs/sysv/namei.c b/fs/sysv/namei.c index 8cea266a8..455d34b7a 100644 --- a/fs/sysv/namei.c +++ b/fs/sysv/namei.c @@ -240,18 +240,7 @@ int sysv_mknod(struct inode * dir, struct dentry * dentry, int mode, int rdev) if (!inode) return -ENOSPC; inode->i_uid = current->fsuid; - inode->i_mode = mode; - inode->i_op = NULL; - if (S_ISREG(inode->i_mode)) - inode->i_op = &sysv_file_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); - if (S_ISBLK(mode) || S_ISCHR(mode)) - inode->i_rdev = to_kdev_t(rdev); + init_special_inode(inode, mode, rdev); mark_inode_dirty(inode); error = sysv_add_entry(dir, dentry->d_name.name, dentry->d_name.len, &bh, &de); diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index 84e003d2d..a5a51bac5 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -518,7 +518,7 @@ void ufs_read_inode (struct inode * inode) inode->u.ufs_i.i_lastfrag = howmany (inode->i_size, uspi->s_fsize); if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) - inode->i_rdev = to_kdev_t(SWAB32(ufs_inode->ui_u2.ui_addr.ui_db[0])); + ; else if (inode->i_blocks) { for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++) inode->u.ufs_i.i_u1.i_data[i] = ufs_inode->ui_u2.ui_addr.ui_db[i]; @@ -528,7 +528,6 @@ void ufs_read_inode (struct inode * inode) inode->u.ufs_i.i_u1.i_symlink[i] = ufs_inode->ui_u2.ui_symlink[i]; } - brelse (bh); inode->i_op = NULL; @@ -538,12 +537,11 @@ void ufs_read_inode (struct inode * inode) inode->i_op = &ufs_dir_inode_operations; else if (S_ISLNK(inode->i_mode)) inode->i_op = &ufs_symlink_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); + else + init_special_inode(inode, inode->i_mode, + SWAB32(ufs_inode->ui_u2.ui_addr.ui_db[0])); + + brelse (bh); #ifdef UFS_INODE_DEBUG_MORE ufs_print_inode (inode); diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index 3daf77c57..46c9f8e53 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c @@ -467,18 +467,7 @@ int ufs_mknod (struct inode * dir, struct dentry *dentry, int mode, int rdev) goto out; inode->i_uid = current->fsuid; - inode->i_mode = mode; - inode->i_op = NULL; - if (S_ISREG(inode->i_mode)) - inode->i_op = &ufs_file_inode_operations; - else if (S_ISCHR(inode->i_mode)) - inode->i_op = &chrdev_inode_operations; - else if (S_ISBLK(inode->i_mode)) - inode->i_op = &blkdev_inode_operations; - else if (S_ISFIFO(inode->i_mode)) - init_fifo(inode); - if (S_ISBLK(mode) || S_ISCHR(mode)) - inode->i_rdev = to_kdev_t(rdev); + init_special_inode(inode, mode, rdev); mark_inode_dirty(inode); bh = ufs_add_entry (dir, dentry->d_name.name, dentry->d_name.len, &de, &err); if (!bh) diff --git a/fs/umsdos/inode.c b/fs/umsdos/inode.c index c7c94b558..ad3aff768 100644 --- a/fs/umsdos/inode.c +++ b/fs/umsdos/inode.c @@ -163,13 +163,9 @@ dentry, f_pos)); umsdos_setup_dir(dentry); } else if (S_ISLNK (inode->i_mode)) { inode->i_op = &umsdos_symlink_inode_operations; - } else if (S_ISCHR (inode->i_mode)) { - inode->i_op = &chrdev_inode_operations; - } else if (S_ISBLK (inode->i_mode)) { - inode->i_op = &blkdev_inode_operations; - } else if (S_ISFIFO (inode->i_mode)) { - init_fifo (inode); - } + } else + init_special_inode(inode, inode->i_mode, + kdev_t_to_nr(inode->i_rdev)); } diff --git a/include/linux/fs.h b/include/linux/fs.h index 7124178cb..ef838f573 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -719,6 +719,7 @@ extern struct inode_operations chrdev_inode_operations; extern char * bdevname(kdev_t dev); extern char * cdevname(kdev_t dev); extern char * kdevname(kdev_t dev); +extern void init_special_inode(struct inode *, umode_t, int); extern void init_fifo(struct inode * inode); diff --git a/include/linux/hfs_fs.h b/include/linux/hfs_fs.h index eaae0ecc5..659c1c6d2 100644 --- a/include/linux/hfs_fs.h +++ b/include/linux/hfs_fs.h @@ -225,7 +225,6 @@ extern hfs_rwret_t hfs_dir_read(struct file *, char *, hfs_rwarg_t, loff_t *); extern int hfs_create(struct inode *, struct dentry *, int); extern int hfs_mkdir(struct inode *, struct dentry *, int); -extern int hfs_mknod(struct inode *, struct dentry *, int, int); extern int hfs_unlink(struct inode *, struct dentry *); extern int hfs_rmdir(struct inode *, struct dentry *); extern int hfs_rename(struct inode *, struct dentry *, diff --git a/include/linux/lp.h b/include/linux/lp.h index a60d29860..07219a5a5 100644 --- a/include/linux/lp.h +++ b/include/linux/lp.h @@ -123,7 +123,7 @@ struct lp_struct { unsigned int runchars; struct lp_stats stats; #endif - struct wait_queue *wait_q; + wait_queue_head_t wait_q; unsigned int last_error; volatile unsigned int irq_detected:1; volatile unsigned int irq_missed:1; diff --git a/kernel/ksyms.c b/kernel/ksyms.c index 8fdd18c88..2fcb3c736 100644 --- a/kernel/ksyms.c +++ b/kernel/ksyms.c @@ -358,6 +358,7 @@ EXPORT_SYMBOL(clear_inode); EXPORT_SYMBOL(refile_buffer); EXPORT_SYMBOL(nr_async_pages); EXPORT_SYMBOL(___strtok); +EXPORT_SYMBOL(init_special_inode); EXPORT_SYMBOL(init_fifo); EXPORT_SYMBOL(fifo_inode_operations); EXPORT_SYMBOL(chrdev_inode_operations); -- 2.11.4.GIT