"David C. Hansen" wrote:> > Russell King wrote:> > >On Wed, Nov 28, 2001 at 03:32:32PM -0800, David C. Hansen wrote:> >> >>Nothing, because the BKL is not held for all opens anymore. In most of> >>the cases that we addressed, the BKL was in release _only_, not in open> >>at all. There were quite a few drivers where we added a spinlock, or> >>used atomic operations to keep open from racing with release.> >>> >> >All char and block devs are opened with the BKL held - see chrdev_open in> >fs/devices.c and do_open in fs/block_dev.c> >> I wrote a quick and dirty char device driver to see if this happened.> If I run two tasks doing a bunch of opens and closes, the -EBUSY> condition in the open function does happen. Is my driver doing> something wrong?> > Here is the meat of the driver:> > static int Device_Open = 0;> > int testdev_open(struct inode *inode, struct file *file)> {> if ( test_and_set_bit(0,&Device_Open) ) {> printk( "attempt to open testdev more than once\n" );> return -EBUSY;> }> MOD_INC_USE_COUNT;> return SUCCESS;> }> > int testdev_release(struct inode *inode, struct file *file)> {> clear_bit(0,&Device_Open);> MOD_DEC_USE_COUNT;> return 0;> }

it is still racy, that's why struct file_operations and other structshave an 'owner' member......

-- Jeff Garzik | Only so many songs can be sungBuilding 1024 | with two lips, two lungs, and one tongue.MandrakeSoft | - nomeansno