lkml.org 
[lkml]   [2012]   [Mar]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[ 085/108] vfs: fix d_ancestor() case in d_materialize_unique
    3.0-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Michel Lespinasse <walken@google.com>

    commit b18dafc86bb879d2f38a1743985d7ceb283c2f4d upstream.

    In d_materialise_unique() there are 3 subcases to the 'aliased dentry'
    case; in two subcases the inode i_lock is properly released but this
    does not occur in the -ELOOP subcase.

    This seems to have been introduced by commit 1836750115f2 ("fix loop
    checks in d_materialise_unique()").

    Signed-off-by: Michel Lespinasse <walken@google.com>
    [ Added a comment, and moved the unlock to where we generate the -ELOOP,
    which seems to be more natural.

    You probably can't actually trigger this without a buggy network file
    server - d_materialize_unique() is for finding aliases on non-local
    filesystems, and the d_ancestor() case is for a hardlinked directory
    loop.

    But we should be robust in the case of such buggy servers anyway. ]
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/dcache.c | 3 ++-
    1 file changed, 2 insertions(+), 1 deletion(-)

    --- a/fs/dcache.c
    +++ b/fs/dcache.c
    @@ -2433,6 +2433,7 @@ struct dentry *d_materialise_unique(stru
    if (d_ancestor(alias, dentry)) {
    /* Check for loops */
    actual = ERR_PTR(-ELOOP);
    + spin_unlock(&inode->i_lock);
    } else if (IS_ROOT(alias)) {
    /* Is this an anonymous mountpoint that we
    * could splice into our tree? */
    @@ -2442,7 +2443,7 @@ struct dentry *d_materialise_unique(stru
    goto found;
    } else {
    /* Nope, but we must(!) avoid directory
    - * aliasing */
    + * aliasing. This drops inode->i_lock */
    actual = __d_unalias(inode, dentry, alias);
    }
    write_sequnlock(&rename_lock);



    \
     
     \ /
      Last update: 2012-03-30 23:11    [W:0.027 / U:1.012 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site