lkml.org 
[lkml]   [2006]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH 4/5] DebugFS : file/directory creation error handling, 2.6.19-rc6
    Correct dentry count to handle creation errors.

    This patch puts a dput at the file creation instead of the file removal :
    lookup_one_len already returns a dentry with reference count of 1. Then,
    the dget() in simple_mknod increments it when the dentry is associated with a
    file. In a scenario where simple_create or simple_mkdir returns an error, this
    would lead to an unwanted increment of the reference counter, therefore making
    file removal impossible.

    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@polymtl.ca>

    ---BEGIN---
    --- a/fs/debugfs/inode.c
    +++ b/fs/debugfs/inode.c
    @@ -161,6 +161,7 @@ static int debugfs_create_by_name(const
    error = debugfs_mkdir(parent->d_inode, *dentry, mode);
    else
    error = debugfs_create(parent->d_inode, *dentry, mode);
    + dput(*dentry);
    } else
    error = PTR_ERR(*dentry);
    mutex_unlock(&parent->d_inode->i_mutex);
    @@ -272,6 +273,7 @@ EXPORT_SYMBOL_GPL(debugfs_create_dir);
    void debugfs_remove(struct dentry *dentry)
    {
    struct dentry *parent;
    + int ret = 0;

    if (!dentry)
    return;
    @@ -283,11 +285,15 @@ void debugfs_remove(struct dentry *dentr
    mutex_lock(&parent->d_inode->i_mutex);
    if (debugfs_positive(dentry)) {
    if (dentry->d_inode) {
    - if (S_ISDIR(dentry->d_inode->i_mode))
    - simple_rmdir(parent->d_inode, dentry);
    - else
    + if (S_ISDIR(dentry->d_inode->i_mode)) {
    + ret = simple_rmdir(parent->d_inode, dentry);
    + if (ret)
    + printk(KERN_ERR
    + "DebugFS rmdir on %s failed : "
    + "directory not empty.\n",
    + dentry->d_name.name);
    + } else
    simple_unlink(parent->d_inode, dentry);
    - dput(dentry);
    }
    }
    mutex_unlock(&parent->d_inode->i_mutex);
    ---END---
    OpenPGP public key: http://krystal.dyndns.org:8080/key/compudj.gpg
    Key fingerprint: 8CD5 52C3 8E3C 4140 715F BA06 3F25 A8FE 3BAE 9A68
    -
    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/

    \
     
     \ /
      Last update: 2006-11-24 19:53    [W:0.023 / U:60.580 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site