|
@@ -0,0 +1,96 @@
|
|
|
+From a99708737f566c70651015332e89d0d3b1eb5529 Mon Sep 17 00:00:00 2001
|
|
|
+From: Koen Vandeputte <[email protected]>
|
|
|
+Date: Mon, 17 Sep 2018 10:13:09 +0200
|
|
|
+Subject: [PATCH] Revert "ubifs: xattr: Don't operate on deleted inodes"
|
|
|
+
|
|
|
+This reverts commit 8a23348d76a1e7716da6e76383281ac82fc071cf.
|
|
|
+
|
|
|
+UBIFS wants to assert that xattr operations are only issued on files
|
|
|
+with positive link count. The said patch made this operations return
|
|
|
+-ENOENT for unlinked files such that the asserts will no longer trigger.
|
|
|
+This was wrong since xattr operations are perfectly fine on unlinked
|
|
|
+files.
|
|
|
+Instead the assertions need to be fixed/removed.
|
|
|
+
|
|
|
+Fixes: 11a6fc3dc743 ("ubifs: xattr: Don't operate on deleted inodes")
|
|
|
+Reported-by: Koen Vandeputte <[email protected]>
|
|
|
+Signed-off-by: Richard Weinberger <[email protected]>
|
|
|
+---
|
|
|
+ fs/ubifs/xattr.c | 24 ------------------------
|
|
|
+ 1 file changed, 24 deletions(-)
|
|
|
+
|
|
|
+--- a/fs/ubifs/xattr.c
|
|
|
++++ b/fs/ubifs/xattr.c
|
|
|
+@@ -152,12 +152,6 @@ static int create_xattr(struct ubifs_inf
|
|
|
+ ui->data_len = size;
|
|
|
+
|
|
|
+ mutex_lock(&host_ui->ui_mutex);
|
|
|
+-
|
|
|
+- if (!host->i_nlink) {
|
|
|
+- err = -ENOENT;
|
|
|
+- goto out_noent;
|
|
|
+- }
|
|
|
+-
|
|
|
+ host->i_ctime = current_time(host);
|
|
|
+ host_ui->xattr_cnt += 1;
|
|
|
+ host_ui->xattr_size += CALC_DENT_SIZE(fname_len(nm));
|
|
|
+@@ -189,7 +183,6 @@ out_cancel:
|
|
|
+ host_ui->xattr_size -= CALC_XATTR_BYTES(size);
|
|
|
+ host_ui->xattr_names -= fname_len(nm);
|
|
|
+ host_ui->flags &= ~UBIFS_CRYPT_FL;
|
|
|
+-out_noent:
|
|
|
+ mutex_unlock(&host_ui->ui_mutex);
|
|
|
+ out_free:
|
|
|
+ make_bad_inode(inode);
|
|
|
+@@ -241,12 +234,6 @@ static int change_xattr(struct ubifs_inf
|
|
|
+ mutex_unlock(&ui->ui_mutex);
|
|
|
+
|
|
|
+ mutex_lock(&host_ui->ui_mutex);
|
|
|
+-
|
|
|
+- if (!host->i_nlink) {
|
|
|
+- err = -ENOENT;
|
|
|
+- goto out_noent;
|
|
|
+- }
|
|
|
+-
|
|
|
+ host->i_ctime = current_time(host);
|
|
|
+ host_ui->xattr_size -= CALC_XATTR_BYTES(old_size);
|
|
|
+ host_ui->xattr_size += CALC_XATTR_BYTES(size);
|
|
|
+@@ -268,7 +255,6 @@ static int change_xattr(struct ubifs_inf
|
|
|
+ out_cancel:
|
|
|
+ host_ui->xattr_size -= CALC_XATTR_BYTES(size);
|
|
|
+ host_ui->xattr_size += CALC_XATTR_BYTES(old_size);
|
|
|
+-out_noent:
|
|
|
+ mutex_unlock(&host_ui->ui_mutex);
|
|
|
+ make_bad_inode(inode);
|
|
|
+ out_free:
|
|
|
+@@ -497,12 +483,6 @@ static int remove_xattr(struct ubifs_inf
|
|
|
+ return err;
|
|
|
+
|
|
|
+ mutex_lock(&host_ui->ui_mutex);
|
|
|
+-
|
|
|
+- if (!host->i_nlink) {
|
|
|
+- err = -ENOENT;
|
|
|
+- goto out_noent;
|
|
|
+- }
|
|
|
+-
|
|
|
+ host->i_ctime = current_time(host);
|
|
|
+ host_ui->xattr_cnt -= 1;
|
|
|
+ host_ui->xattr_size -= CALC_DENT_SIZE(fname_len(nm));
|
|
|
+@@ -522,7 +502,6 @@ out_cancel:
|
|
|
+ host_ui->xattr_size += CALC_DENT_SIZE(fname_len(nm));
|
|
|
+ host_ui->xattr_size += CALC_XATTR_BYTES(ui->data_len);
|
|
|
+ host_ui->xattr_names += fname_len(nm);
|
|
|
+-out_noent:
|
|
|
+ mutex_unlock(&host_ui->ui_mutex);
|
|
|
+ ubifs_release_budget(c, &req);
|
|
|
+ make_bad_inode(inode);
|
|
|
+@@ -562,9 +541,6 @@ static int ubifs_xattr_remove(struct ino
|
|
|
+
|
|
|
+ ubifs_assert(inode_is_locked(host));
|
|
|
+
|
|
|
+- if (!host->i_nlink)
|
|
|
+- return -ENOENT;
|
|
|
+-
|
|
|
+ if (fname_len(&nm) > UBIFS_MAX_NLEN)
|
|
|
+ return -ENAMETOOLONG;
|
|
|
+
|