linux/3.2: add symlink xattr support to ubifs
authorGabor Juhos <juhosg@openwrt.org>
Fri, 2 Mar 2012 23:09:00 +0000 (23:09 +0000)
committerGabor Juhos <juhosg@openwrt.org>
Fri, 2 Mar 2012 23:09:00 +0000 (23:09 +0000)
SVN-Revision: 30794

target/linux/generic/patches-3.2/550-ubifs-symlink-xattr-support.patch [new file with mode: 0644]

diff --git a/target/linux/generic/patches-3.2/550-ubifs-symlink-xattr-support.patch b/target/linux/generic/patches-3.2/550-ubifs-symlink-xattr-support.patch
new file mode 100644 (file)
index 0000000..1b11fe7
--- /dev/null
@@ -0,0 +1,67 @@
+--- a/fs/ubifs/file.c
++++ b/fs/ubifs/file.c
+@@ -1575,6 +1575,12 @@ const struct inode_operations ubifs_syml
+       .follow_link = ubifs_follow_link,
+       .setattr     = ubifs_setattr,
+       .getattr     = ubifs_getattr,
++#ifdef CONFIG_UBIFS_FS_XATTR
++      .setxattr    = ubifs_setxattr,
++      .getxattr    = ubifs_getxattr,
++      .listxattr   = ubifs_listxattr,
++      .removexattr = ubifs_removexattr,
++#endif
+ };
+ const struct file_operations ubifs_file_operations = {
+--- a/fs/ubifs/journal.c
++++ b/fs/ubifs/journal.c
+@@ -553,7 +553,8 @@ int ubifs_jnl_update(struct ubifs_info *
+       dbg_jnl("ino %lu, dent '%.*s', data len %d in dir ino %lu",
+               inode->i_ino, nm->len, nm->name, ui->data_len, dir->i_ino);
+-      ubifs_assert(dir_ui->data_len == 0);
++      if (!xent)
++              ubifs_assert(dir_ui->data_len == 0);
+       ubifs_assert(mutex_is_locked(&dir_ui->ui_mutex));
+       dlen = UBIFS_DENT_NODE_SZ + nm->len + 1;
+@@ -573,6 +574,13 @@ int ubifs_jnl_update(struct ubifs_info *
+       aligned_dlen = ALIGN(dlen, 8);
+       aligned_ilen = ALIGN(ilen, 8);
+       len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
++      if (xent) {
++              /*
++               * Make sure to account for dir_ui->data_len in
++               * length calculation in case there is extended attribute.
++               */
++              len += dir_ui->data_len;
++      }
+       dent = kmalloc(len, GFP_NOFS);
+       if (!dent)
+               return -ENOMEM;
+@@ -649,7 +657,8 @@ int ubifs_jnl_update(struct ubifs_info *
+       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 + dir_ui->data_len);
+       if (err)
+               goto out_ro;
+--- a/fs/ubifs/xattr.c
++++ b/fs/ubifs/xattr.c
+@@ -211,12 +211,12 @@ static int change_xattr(struct ubifs_inf
+       }
+       memcpy(ui->data, value, size);
+       inode->i_size = ui->ui_size = size;
+-      ui->data_len = size;
+       mutex_lock(&host_ui->ui_mutex);
+       host->i_ctime = ubifs_current_time(host);
+       host_ui->xattr_size -= CALC_XATTR_BYTES(ui->data_len);
+       host_ui->xattr_size += CALC_XATTR_BYTES(size);
++      ui->data_len = size;
+       /*
+        * It is important to write the host inode after the xattr inode