Linux compat 2.6.39: security_inode_init_security()
[zfs.git] / module / zfs / zpl_xattr.c
index 82787cb..f274407 100644 (file)
@@ -191,6 +191,7 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
        cred_t *cr = CRED();
        ssize_t wrote;
        int error;
+       const int xattr_mode = S_IFREG | 0644;
 
        crhold(cr);
 
@@ -230,7 +231,7 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
        /* Lookup failed create a new xattr. */
        if (xip == NULL) {
                vap = kmem_zalloc(sizeof(vattr_t), KM_SLEEP);
-               vap->va_mode = S_IFREG | 0644;
+               vap->va_mode = xattr_mode;
                vap->va_mask = ATTR_MODE;
                vap->va_uid = crgetfsuid(cr);
                vap->va_gid = crgetfsgid(cr);
@@ -242,6 +243,11 @@ zpl_xattr_set(struct inode *ip, const char *name, const void *value,
        }
 
        ASSERT(xip != NULL);
+
+       error = -zfs_freesp(ITOZ(xip), 0, 0, xattr_mode, TRUE);
+       if (error)
+               goto out;
+
        wrote = zpl_write_common(xip, value, size, 0, UIO_SYSSPACE, 0, cr);
        if (wrote < 0)
                error = wrote;
@@ -398,14 +404,16 @@ __zpl_xattr_security_set(struct inode *ip, const char *name,
 ZPL_XATTR_SET_WRAPPER(zpl_xattr_security_set);
 
 int
-zpl_xattr_security_init(struct inode *ip, struct inode *dip)
+zpl_xattr_security_init(struct inode *ip, struct inode *dip,
+    const struct qstr *qstr)
 {
         int error;
         size_t len;
         void *value;
         char *name;
 
-        error = security_inode_init_security(ip, dip, &name, &value, &len);
+        error = zpl_security_inode_init_security(ip, dip, qstr,
+           &name, &value, &len);
         if (error) {
                 if (error == -EOPNOTSUPP)
                         return 0;