[Pvfs2-developers] kernel module copy attrs race
Sam Lang
slang at mcs.anl.gov
Tue Mar 25 15:10:42 EST 2008
On Mar 25, 2008, at 2:40 PM, Pete Wyckoff wrote:
> slang at mcs.anl.gov wrote on Tue, 25 Mar 2008 14:01 -0500:
>> Attached patch adds the lock around the getattr for revalidate. It
>> also
>> includes some cleanup to the d_revalidate function for my sanity.
>
> Looks good to me. I didn't study all the whitespace changes in
> detail.
>
>> Index: src/kernel/linux-2.6/dcache.c
>> [..]
>> + gossip_debug(GOSSIP_DCACHE_DEBUG, "%s: parent not found.
>> \n", __func__);
>> + return 0; /* not valid */
>
> I see that 0 is bad a few places here.
>
>> + gossip_debug(GOSSIP_DCACHE_DEBUG,
>> + "%s: getattr %s (ret = %d), returning %s for
>> dentry\n",
>> + __func__,
>> + (ret == 0 ? "succeeded" : "failed"),
>> + ret,
>> + (ret == 0 ? "valid" : "INVALID"));
>> +
>> + return ((ret == 0) ? 1 : 0);
>
> But now 0 is good and 1 is bad. As long as you have it all
> straight in your head. Maybe some "goto out" would help to
> clean all this up, or not.
Yeah getattr returns 0 on success. If getattr succeeds, we want to
say that the inode was revalidated (return 1). I agree its a bit
confusing, but I think its correct. I can add gotos.
>
>
> I certainly enjoy that it will tell you "failed" and "INVALID" in
> the same error message. Way to reinforce those negatives. :)
In fact our error handling here looks to be a little wrong. When we
return 0 from d_revalidate, the kernel assumes the file has been
removed and populates the dcache with a negative dentry (then tries to
create the file in the open case). But if getattr fails after lookup
succeeds, we may have more than an invalid dentry.
In most cases where getattr returns an error we probably want to push
that error all the way back up the stack, instead of just populating
the dcache with a negative dentry. We could check for ENOENT from
getattr and return 0, otherwise return the errno? Do the same for
lookup failure?
Also, if the kernel gives us a null dentry, do we really want to
return invalid dentry, or EINVAL with a big hairy gossip_err message
to the log? At least in the current kernel, d_revalidate is never
called with a null dentry.
-sam
>
>
> -- Pete
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2417 bytes
Desc: not available
Url : http://www.beowulf-underground.org/pipermail/pvfs2-developers/attachments/20080325/281c450a/smime.bin
More information about the Pvfs2-developers
mailing list