68 lines
2.0 KiB
Diff
68 lines
2.0 KiB
Diff
--- a/fs/ubifs/file.c
|
|
+++ b/fs/ubifs/file.c
|
|
@@ -1577,6 +1577,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
|
|
@@ -209,12 +209,12 @@ static int change_xattr(struct ubifs_inf
|
|
goto out_free;
|
|
}
|
|
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
|