UBIFS: fix a couple bugs in UBIFS xattr length calculation
authorSubodh Nijsure <snijsure@grid-net.com>
Fri, 31 Oct 2014 18:50:28 +0000 (13:50 -0500)
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
Fri, 7 Nov 2014 10:32:22 +0000 (12:32 +0200)
The journal update function did not work for extended attributes properly,
because extended attribute inodes carry the xattr data, and the size of this
data was not taken into account.

Artem: improved commit message, amended the patch a bit.

Signed-off-by: Subodh Nijsure <snijsure@grid-net.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Ben Shelton <ben.shelton@ni.com>
Acked-by: Brad Mouring <brad.mouring@ni.com>
Acked-by: Gratian Crisan <gratian.crisan@ni.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
fs/ubifs/journal.c

index fb166e204441d880662e213cc07974c6b4380e89..f6ac3f29323cdacd7a72e92c7c0babcd4fc8642f 100644 (file)
@@ -571,7 +571,11 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
 
        aligned_dlen = ALIGN(dlen, 8);
        aligned_ilen = ALIGN(ilen, 8);
+
        len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
+       /* Make sure to also account for extended attributes */
+       len += host_ui->data_len;
+
        dent = kmalloc(len, GFP_NOFS);
        if (!dent)
                return -ENOMEM;
@@ -648,7 +652,8 @@ int ubifs_jnl_update(struct ubifs_info *c, const struct inode *dir,
 
        ino_key_init(c, &ino_key, dir->i_ino);
        ino_offs += aligned_ilen;
-       err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, UBIFS_INO_NODE_SZ);
+       err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs,
+                           UBIFS_INO_NODE_SZ + host_ui->data_len);
        if (err)
                goto out_ro;