Re: [2.4.13] [devfs 0.119 (20011009)] base.c: devfsd_ioctl

Richard Gooch (rgooch@atnf.csiro.au)
Mon, 29 Oct 2001 16:22:26 +1100


Kari Hurtta writes:
>
> Can you say where I have wrong?
>
> Code on devfsd_ioctl() [base.c]:
>
> if (fs_info->devfsd_task == NULL)
> {
> if ( !spin_trylock (&lock) ) return -EBUSY;
> fs_info->devfsd_task = current;
> spin_unlock (&lock);
>
> To me that spinlock looks like it is useless.
> Either
>
> 1) If it is mean that lock protects two CPUs settting
> fs_info->devfsd_task when another is set it,
> then test about fs_info->devfsd_task == NULL
> should be inside of locked code
> or 2) this is protected with some other lock as comment
> perhaps indicates:
>
> /* Ensure only one reader has access to the queue. This scheme will
> work even if the global kernel lock were to be removed, because it
> doesn't matter who gets in first, as long as only one gets it
> */
> if (fs_info->devfsd_task == NULL)
> {
> if ( !spin_trylock (&lock) ) return -EBUSY;
>
> Should this be:
>
> --- fs/devfs/base.c.old Thu Oct 11 09:23:24 2001
> +++ fs/devfs/base.c Sun Oct 28 14:59:03 2001
> @@ -3227,6 +3227,11 @@
> if (fs_info->devfsd_task == NULL)
> {
> if ( !spin_trylock (&lock) ) return -EBUSY;
> + if (fs_info->devfsd_task != NULL) {
> + /* We lost race ... */
> + spin_unlock (&lock);
> + return -EBUSY;
> + }
> fs_info->devfsd_task = current;
> spin_unlock (&lock);
> fs_info->devfsd_file = file;

Damn! You're right. I broke that when I simplified the anti-race code
back in June and replaced the #ifdef CONFIG_SMP bits with plain
spinlocks. Unfortunately I didn't put back in a critcal line.
Cut-and-paste error without the paste :-(

OK, I've updated my both my trees. I'll feed this to Linus in my next
release.

Regards,

Richard....
Permanent: rgooch@atnf.csiro.au
Current: rgooch@ras.ucalgary.ca
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/