diff options
author | Jaegeuk Kim <jaegeuk@kernel.org> | 2023-10-19 15:51:08 -0700 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@google.com> | 2023-10-23 21:16:28 +0000 |
commit | dfb1120f912b54476997aefadd7a862382d53e0a (patch) | |
tree | b3e89930a04b6a4b1f2976e3541a228b76d7ae38 | |
parent | 82a50afac392bf8c4c909064d1015892a8b34cf0 (diff) | |
download | common-android-gs-lynx-android14-release.tar.gz |
FROMGIT: f2fs: do not return EFSCORRUPTED, but try to run online repairandroid13-5.10-2023-03_r22android-14.0.0_r0.17android-14.0.0_r0.16android-14.0.0_r0.15android-14.0.0_r0.14android-14.0.0_r0.13android-14.0.0_r0.11deprecated/android13-5.10-2023-03android13-5.10-2023-03android-gs-tangorpro-android14-releaseandroid-gs-raviole-android14-releaseandroid-gs-pantah-android14-releaseandroid-gs-lynx-android14-releaseandroid-gs-felix-android14-releaseandroid-gs-bluejay-android14-release
If we return the error, there's no way to recover the status as of now, since
fsck does not fix the xattr boundary issue.
Bug: 307367469
Bug: 305658663
Cc: stable@vger.kernel.org
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
(cherry picked from commit 50a472bbc79ff9d5a88be8019a60e936cadf9f13
https://git.kernel.org/pub/scm/linux/kernel/git/jaegeuk/f2fs.git dev)
Change-Id: Ia95ef8ba177a27d7a5efcc873c5dca10de38ae5e
Signed-off-by: Jaegeuk Kim <jaegeuk@google.com>
(cherry picked from commit 168918a65c9aaba6d573f45c578d7800f89ecbea)
-rw-r--r-- | fs/f2fs/node.c | 4 | ||||
-rw-r--r-- | fs/f2fs/xattr.c | 20 |
2 files changed, 16 insertions, 8 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 7f637b7c34cd..8df5cfcc3ab1 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -2741,7 +2741,9 @@ recover_xnid: f2fs_update_inode_page(inode); /* 3: update and set xattr node page dirty */ - memcpy(F2FS_NODE(xpage), F2FS_NODE(page), VALID_XATTR_BLOCK_SIZE); + if (page) + memcpy(F2FS_NODE(xpage), F2FS_NODE(page), + VALID_XATTR_BLOCK_SIZE); set_page_dirty(xpage); f2fs_put_page(xpage, 1); diff --git a/fs/f2fs/xattr.c b/fs/f2fs/xattr.c index edd803b70232..6eb47b7445b4 100644 --- a/fs/f2fs/xattr.c +++ b/fs/f2fs/xattr.c @@ -361,10 +361,10 @@ static int lookup_all_xattrs(struct inode *inode, struct page *ipage, *xe = __find_xattr(cur_addr, last_txattr_addr, NULL, index, len, name); if (!*xe) { - f2fs_err(F2FS_I_SB(inode), "inode (%lu) has corrupted xattr", + f2fs_err(F2FS_I_SB(inode), "lookup inode (%lu) has corrupted xattr", inode->i_ino); set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); - err = -EFSCORRUPTED; + err = -ENODATA; goto out; } check: @@ -579,11 +579,10 @@ ssize_t f2fs_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size) if ((void *)(entry) + sizeof(__u32) > last_base_addr || (void *)XATTR_NEXT_ENTRY(entry) > last_base_addr) { - f2fs_err(F2FS_I_SB(inode), "inode (%lu) has corrupted xattr", + f2fs_err(F2FS_I_SB(inode), "list inode (%lu) has corrupted xattr", inode->i_ino); set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); - error = -EFSCORRUPTED; - goto cleanup; + break; } if (!handler || (handler->list && !handler->list(dentry))) @@ -644,7 +643,7 @@ static int __f2fs_setxattr(struct inode *inode, int index, if (size > MAX_VALUE_LEN(inode)) return -E2BIG; - +retry: error = read_all_xattrs(inode, ipage, &base_addr); if (error) return error; @@ -654,7 +653,14 @@ static int __f2fs_setxattr(struct inode *inode, int index, /* find entry with wanted name. */ here = __find_xattr(base_addr, last_base_addr, NULL, index, len, name); if (!here) { - f2fs_err(F2FS_I_SB(inode), "inode (%lu) has corrupted xattr", + if (!F2FS_I(inode)->i_xattr_nid) { + f2fs_notice(F2FS_I_SB(inode), + "recover xattr in inode (%lu)", inode->i_ino); + f2fs_recover_xattr_data(inode, NULL); + kfree(base_addr); + goto retry; + } + f2fs_err(F2FS_I_SB(inode), "set inode (%lu) has corrupted xattr", inode->i_ino); set_sbi_flag(F2FS_I_SB(inode), SBI_NEED_FSCK); error = -EFSCORRUPTED; |