Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f061c1cc authored by Richard Weinberger's avatar Richard Weinberger
Browse files

Revert "ubifs: xattr: Don't operate on deleted inodes"



This reverts commit 11a6fc3d.
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.

Cc: <stable@vger.kernel.org>
Fixes: 11a6fc3d ("ubifs: xattr: Don't operate on deleted inodes")
Reported-by: default avatarKoen Vandeputte <koen.vandeputte@ncentric.com>
Tested-by: default avatarJoel Stanley <joel@jms.id.au>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent d3bdc016
Loading
Loading
Loading
Loading
+0 −24
Original line number Diff line number Diff line
@@ -152,12 +152,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
	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));
@@ -190,7 +184,6 @@ static int create_xattr(struct ubifs_info *c, struct inode *host,
	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);
@@ -242,12 +235,6 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
	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);
@@ -269,7 +256,6 @@ static int change_xattr(struct ubifs_info *c, struct inode *host,
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:
@@ -496,12 +482,6 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
		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));
@@ -521,7 +501,6 @@ static int remove_xattr(struct ubifs_info *c, struct inode *host,
	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);
@@ -561,9 +540,6 @@ static int ubifs_xattr_remove(struct inode *host, const char *name)

	ubifs_assert(c, inode_is_locked(host));

	if (!host->i_nlink)
		return -ENOENT;

	if (fname_len(&nm) > UBIFS_MAX_NLEN)
		return -ENAMETOOLONG;