[PATCH] i2c-viapro: Some adjustments
[pandora-kernel.git] / fs / xattr.c
index dc8bc76..a9db225 100644 (file)
@@ -74,8 +74,7 @@ setxattr(struct dentry *d, char __user *name, void __user *value,
        }
 out:
        up(&d->d_inode->i_sem);
-       if (kvalue)
-               kfree(kvalue);
+       kfree(kvalue);
        return error;
 }
 
@@ -143,7 +142,7 @@ getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
        if (size) {
                if (size > XATTR_SIZE_MAX)
                        size = XATTR_SIZE_MAX;
-               kvalue = kmalloc(size, GFP_KERNEL);
+               kvalue = kzalloc(size, GFP_KERNEL);
                if (!kvalue)
                        return -ENOMEM;
        }
@@ -154,11 +153,15 @@ getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
        error = -EOPNOTSUPP;
        if (d->d_inode->i_op && d->d_inode->i_op->getxattr)
                error = d->d_inode->i_op->getxattr(d, kname, kvalue, size);
-       else if (!strncmp(kname, XATTR_SECURITY_PREFIX,
-                         sizeof XATTR_SECURITY_PREFIX - 1)) {
+
+       if (!strncmp(kname, XATTR_SECURITY_PREFIX,
+                    sizeof XATTR_SECURITY_PREFIX - 1)) {
                const char *suffix = kname + sizeof XATTR_SECURITY_PREFIX - 1;
-               error = security_inode_getsecurity(d->d_inode, suffix, kvalue,
-                                                  size);
+               int rv = security_inode_getsecurity(d->d_inode, suffix, kvalue,
+                                                   size, error);
+               /* Security module active: overwrite error value */
+               if (rv != -EOPNOTSUPP)
+                       error = rv;
        }
        if (error > 0) {
                if (size && copy_to_user(value, kvalue, error))
@@ -169,8 +172,7 @@ getxattr(struct dentry *d, char __user *name, void __user *value, size_t size)
                error = -E2BIG;
        }
 out:
-       if (kvalue)
-               kfree(kvalue);
+       kfree(kvalue);
        return error;
 }
 
@@ -255,8 +257,7 @@ listxattr(struct dentry *d, char __user *list, size_t size)
                error = -E2BIG;
        }
 out:
-       if (klist)
-               kfree(klist);
+       kfree(klist);
        return error;
 }
 
@@ -325,6 +326,8 @@ removexattr(struct dentry *d, char __user *name)
                down(&d->d_inode->i_sem);
                error = d->d_inode->i_op->removexattr(d, kname);
                up(&d->d_inode->i_sem);
+               if (!error)
+                       fsnotify_xattr(d);
        }
 out:
        return error;