El Tue, Apr 01, 2008 at 07:38:05AM -0400 Robert P. J. Day ha dit:
>
> regarding the routine "chrdev_open()" in fs/char_dev.c:
>
> On Tue, 1 Apr 2008, Matthias Kaehlcke wrote:
>
> > El Mon, Mar 31, 2008 at 10:10:41PM -0400 Robert P. J. Day ha dit:
>
> > > p.s. i am a bit confused as to why there are two tests for whether
> > > inode->i_cdev is non-NULL:
> > >
> > > p = inode->i_cdev;
> > > if (!p) { <-- first test of p
> > > struct kobject *kobj;
> > > int idx;
> > > spin_unlock(&cdev_lock);
> > > kobj = kobj_lookup(cdev_map, inode->i_rdev, &idx);
> > > if (!kobj)
> > > return -ENXIO;
> > > new = container_of(kobj, struct cdev, kobj);
> > > spin_lock(&cdev_lock);
> > > p = inode->i_cdev;
> > > if (!p) { <-- second test of p
> > > inode->i_cdev = p = new;
> > >
> > >
> > > why is that first test being repeated further down? if p was NULL
> > > at that first test, how could it possibly have changed before that
> > > second test? isn't that second test redundant? or am i missing
> > > something?
> >
> > if i understand that piece of code correctly inode->i_cdev could
> > have changed (probably by a concurrent invocation of the same
> > function) while cdev_lock is not hold and inode->i_cdev is
> > reassigned to p.
>
> possibly, but wouldn't that create an ugly synchronization scenario?
> say, if two invocations of that routine both arrived at that second
> test of "p" simultaneously, both found it NULL, and both then tried to
> set it? and, in any event, both would technically need to set it to
> the *same* value, anyway. so it's still not clear what that second
> test is for.
they can't arrive at the second test simultaneously cause cdev_lock is
used for synchronization.
yes, they would set it to the same value, but two calls to
list_add(&inode->i_devices, &p->list) would result in inode->i_devices
being added twice to p->list.
--
Matthias Kaehlcke
Linux System Developer
Barcelona
Insanity: doing the same thing over and over
again and expecting different results
(Albert Einstein)
.''`.
using free software / Debian GNU/Linux | http://debian.org : :' :
`. `'`
gpg --keyserver pgp.mit.edu --recv-keys 47D8E5D4 `-
--
To unsubscribe from this list: send an email with
"unsubscribe kernelnewbies" to [EMAIL PROTECTED]
Please read the FAQ at http://kernelnewbies.org/FAQ