| From f061c1cc404a618858a77aea233fde0aeaad2f2d Mon Sep 17 00:00:00 2001 |
| From: Richard Weinberger <richard@nod.at> |
| Date: Sun, 16 Sep 2018 23:57:35 +0200 |
| Subject: Revert "ubifs: xattr: Don't operate on deleted inodes" |
| |
| From: Richard Weinberger <richard@nod.at> |
| |
| commit f061c1cc404a618858a77aea233fde0aeaad2f2d upstream. |
| |
| This reverts commit 11a6fc3dc743e22fb50f2196ec55bee5140d3c52. |
| 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: 11a6fc3dc743 ("ubifs: xattr: Don't operate on deleted inodes") |
| Reported-by: Koen Vandeputte <koen.vandeputte@ncentric.com> |
| Tested-by: Joel Stanley <joel@jms.id.au> |
| Signed-off-by: Richard Weinberger <richard@nod.at> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| 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; |
| |