fix setattr error handling in sysfs, configfs
authorNick Piggin <npiggin@suse.de>
Mon, 31 May 2010 07:58:02 +0000 (17:58 +1000)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 4 Jun 2010 20:27:53 +0000 (13:27 -0700)
sysfs and configfs setattr functions have error cases after the generic inode's
attributes have been changed. Fix consistency by changing the generic inode
attributes only when it is guaranteed to succeed.

Signed-off-by: Nick Piggin <npiggin@suse.de>
Acked-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
fs/configfs/inode.c
fs/sysfs/inode.c

index 41645142b88b4698300cc89bbad15c613e10d6fd..cf78d44a8d6a8bcff1a546e3606058de97e90722 100644 (file)
@@ -72,10 +72,6 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr)
        if (!sd)
                return -EINVAL;
 
-       error = simple_setattr(dentry, iattr);
-       if (error)
-               return error;
-
        sd_iattr = sd->s_iattr;
        if (!sd_iattr) {
                /* setting attributes for the first time, allocate now */
@@ -89,9 +85,12 @@ int configfs_setattr(struct dentry * dentry, struct iattr * iattr)
                sd_iattr->ia_atime = sd_iattr->ia_mtime = sd_iattr->ia_ctime = CURRENT_TIME;
                sd->s_iattr = sd_iattr;
        }
-
        /* attributes were changed atleast once in past */
 
+       error = simple_setattr(dentry, iattr);
+       if (error)
+               return error;
+
        if (ia_valid & ATTR_UID)
                sd_iattr->ia_uid = iattr->ia_uid;
        if (ia_valid & ATTR_GID)
index bde1a4c3679a3c38bb5005a473fce4c8e3037e54..0835a3b70e03b01738a8ef18493e1c6180432acd 100644 (file)
@@ -117,11 +117,13 @@ int sysfs_setattr(struct dentry *dentry, struct iattr *iattr)
        if (error)
                goto out;
 
+       error = sysfs_sd_setattr(sd, iattr);
+       if (error)
+               goto out;
+
        /* this ignores size changes */
        generic_setattr(inode, iattr);
 
-       error = sysfs_sd_setattr(sd, iattr);
-
 out:
        mutex_unlock(&sysfs_mutex);
        return error;