Re: [PATCH] remove BKL from drivers' release functions

Jeff Garzik
2001-11-29T00:38:03Z

"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 structs
have an 'owner' member......

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