xfs
[Top] [All Lists]

Re: [PATCH 3/4] XFS: Return case-insensitive match for dentry cache

To: Christoph Hellwig <hch@xxxxxxxxxxxxx>
Subject: Re: [PATCH 3/4] XFS: Return case-insensitive match for dentry cache
From: Sunil Mushran <Sunil.Mushran@xxxxxxxxxx>
Date: Tue, 20 May 2008 13:50:03 -0700
Cc: Barry Naujok <bnaujok@xxxxxxx>, Anton Altaparmakov <aia21@xxxxxxxxx>, xfs@xxxxxxxxxxx, linux-fsdevel <linux-fsdevel@xxxxxxxxxxxxxxx>
In-reply-to: <20080520182315.GA8456@infradead.org>
References: <20080513075749.477238845@chook.melbourne.sgi.com> <20080513080152.911303131@chook.melbourne.sgi.com> <20080513085724.GC21919@infradead.org> <op.ua4wa7t03jf8g2@pc-bnaujok.melbourne.sgi.com> <20080515045700.GA4328@infradead.org> <op.ua6ji4r93jf8g2@pc-bnaujok.melbourne.sgi.com> <DCB15FFF-F942-47BD-B8FB-38AADC24B9D6@cam.ac.uk> <op.ubfkzvjx3jf8g2@pc-bnaujok.melbourne.sgi.com> <20080520182315.GA8456@infradead.org>
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Thunderbird 1.5.0.14ubu (X11/20080505)
Christoph Hellwig wrote:
The cond_resched_lock here is not safe here, because the pointer you
are going to dereference in list_for_each_entry might not be valid
anymore.  This should look more like:

void d_drop_negative_children(struct dentry *parent)
{
        struct dentry *dentry;

 again:
        spin_lock(&dcache_lock);
        list_for_each_entry(dentry, &parent->d_subdirs, d_u.d_child) {
                if !(dentry->d_inode)
                        continue;

                spin_lock(&dentry->d_lock);
                __d_drop(dentry);
                spin_unlock(&dentry->d_lock);

if (need_resched()) {
spin_unlock(&dcache_lock);
cond_resched();
goto again;
}
}
spin_unlock(&dcache_lock);
}
Yes, we have been bitten by the same issue.

Instead of need_resched(), it may be better if you do:

                if (cond_resched_lock(&dcache_lock))
                        goto again;



<Prev in Thread] Current Thread [Next in Thread>