[PATCH] sysfs-iattr: attach sysfs_dirent before new inode

From: Greg KH (gregkh_at_suse.de)
Date: 06/21/05

  • Next message: Greg KH: "[PATCH] INPUT: move to use the new class code, instead of class_simple"
    Date:	Mon, 20 Jun 2005 15:59:29 -0700
    To: linux-kernel@vger.kernel.org
    
    

    [PATCH] sysfs-iattr: attach sysfs_dirent before new inode

    o The following patch makes sure to attach sysfs_dirent to the dentry before
      allocation a new inode through sysfs_create(). This change is done as
      preparatory work for implementing ->i_op->setattr() functionality for
      sysfs objects.

    Signed-off-by: Maneesh Soni <maneesh@in.ibm.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    commit 6fa5c828c7fb6beef7035864bd2b18e7386fbdd5
    tree 88c7c0a03fe13ad802721dcd54b9b93733e964fe
    parent 050480f12aeab62d39a1a07546606a47217ebefa
    author Maneesh Soni <maneesh@in.ibm.com> Tue, 31 May 2005 10:38:12 +0530
    committer Greg Kroah-Hartman <gregkh@suse.de> Mon, 20 Jun 2005 15:15:36 -0700
     fs/sysfs/dir.c |   25 +++++++++++++++----------
     1 files changed, 15 insertions(+), 10 deletions(-)
    diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
    --- a/fs/sysfs/dir.c
    +++ b/fs/sysfs/dir.c
    @@ -101,18 +101,19 @@ static int create_dir(struct kobject * k
     	down(&p->d_inode->i_sem);
     	*d = sysfs_get_dentry(p,n);
     	if (!IS_ERR(*d)) {
    -		error = sysfs_create(*d, mode, init_dir);
    +		error = sysfs_make_dirent(p->d_fsdata, *d, k, mode, SYSFS_DIR);
     		if (!error) {
    -			error = sysfs_make_dirent(p->d_fsdata, *d, k, mode,
    -						SYSFS_DIR);
    +			error = sysfs_create(*d, mode, init_dir);
     			if (!error) {
     				p->d_inode->i_nlink++;
     				(*d)->d_op = &sysfs_dentry_ops;
     				d_rehash(*d);
     			}
     		}
    -		if (error && (error != -EEXIST))
    +		if (error && (error != -EEXIST)) {
    +			sysfs_put((*d)->d_fsdata);
     			d_drop(*d);
    +		}
     		dput(*d);
     	} else
     		error = PTR_ERR(*d);
    @@ -171,17 +172,19 @@ static int sysfs_attach_attr(struct sysf
                     init = init_file;
             }
     
    +	dentry->d_fsdata = sysfs_get(sd);
    +	sd->s_dentry = dentry;
     	error = sysfs_create(dentry, (attr->mode & S_IALLUGO) | S_IFREG, init);
    -	if (error)
    +	if (error) {
    +		sysfs_put(sd);
     		return error;
    +	}
     
             if (bin_attr) {
     		dentry->d_inode->i_size = bin_attr->size;
     		dentry->d_inode->i_fop = &bin_fops;
     	}
     	dentry->d_op = &sysfs_dentry_ops;
    -	dentry->d_fsdata = sysfs_get(sd);
    -	sd->s_dentry = dentry;
     	d_rehash(dentry);
     
     	return 0;
    @@ -191,13 +194,15 @@ static int sysfs_attach_link(struct sysf
     {
     	int err = 0;
     
    +	dentry->d_fsdata = sysfs_get(sd);
    +	sd->s_dentry = dentry;
     	err = sysfs_create(dentry, S_IFLNK|S_IRWXUGO, init_symlink);
     	if (!err) {
     		dentry->d_op = &sysfs_dentry_ops;
    -		dentry->d_fsdata = sysfs_get(sd);
    -		sd->s_dentry = dentry;
     		d_rehash(dentry);
    -	}
    +	} else
    +		sysfs_put(sd);
    +
     	return err;
     }
     
    -
    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/
    

  • Next message: Greg KH: "[PATCH] INPUT: move to use the new class code, instead of class_simple"

    Relevant Pages