From 4722b345392a4e794dd6b01a13df2f7290f181cb Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Sun, 28 Nov 2021 22:16:55 -0500 Subject: [PATCH] Fixes for 5.4 Signed-off-by: Sasha Levin --- ...d_fsck-flag-when-inconsistent-node-b.patch | 38 ++++++++ queue-5.4/series | 2 + ...-do-not-error-on-fsync-when-readonly.patch | 94 +++++++++++++++++++ 3 files changed, 134 insertions(+) create mode 100644 queue-5.4/f2fs-set-sbi_need_fsck-flag-when-inconsistent-node-b.patch create mode 100644 queue-5.4/smb3-do-not-error-on-fsync-when-readonly.patch diff --git a/queue-5.4/f2fs-set-sbi_need_fsck-flag-when-inconsistent-node-b.patch b/queue-5.4/f2fs-set-sbi_need_fsck-flag-when-inconsistent-node-b.patch new file mode 100644 index 00000000000..4499eccf509 --- /dev/null +++ b/queue-5.4/f2fs-set-sbi_need_fsck-flag-when-inconsistent-node-b.patch @@ -0,0 +1,38 @@ +From f839bffbc12fb6aef730154d7d06072fb66110be Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 18 Sep 2021 20:46:36 +0800 +Subject: f2fs: set SBI_NEED_FSCK flag when inconsistent node block found + +From: Weichao Guo + +[ Upstream commit 6663b138ded1a59e630c9e605e42aa7fde490cdc ] + +Inconsistent node block will cause a file fail to open or read, +which could make the user process crashes or stucks. Let's mark +SBI_NEED_FSCK flag to trigger a fix at next fsck time. After +unlinking the corrupted file, the user process could regenerate +a new one and work correctly. + +Signed-off-by: Weichao Guo +Reviewed-by: Chao Yu +Signed-off-by: Jaegeuk Kim +Signed-off-by: Sasha Levin +--- + fs/f2fs/node.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c +index 4cb182c20eedd..0cd1d51dde06d 100644 +--- a/fs/f2fs/node.c ++++ b/fs/f2fs/node.c +@@ -1385,6 +1385,7 @@ static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid, + nid, nid_of_node(page), ino_of_node(page), + ofs_of_node(page), cpver_of_node(page), + next_blkaddr_of_node(page)); ++ set_sbi_flag(sbi, SBI_NEED_FSCK); + err = -EINVAL; + out_err: + ClearPageUptodate(page); +-- +2.33.0 + diff --git a/queue-5.4/series b/queue-5.4/series index a1acb6e93b4..8d5d6c3f4b0 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -73,3 +73,5 @@ net-smc-don-t-call-clcsock-shutdown-twice-when-smc-s.patch net-hns3-fix-vf-rss-failed-problem-after-pf-enable-m.patch net-mscc-ocelot-don-t-downgrade-timestamping-rx-filt.patch net-mscc-ocelot-correctly-report-the-timestamping-rx.patch +f2fs-set-sbi_need_fsck-flag-when-inconsistent-node-b.patch +smb3-do-not-error-on-fsync-when-readonly.patch diff --git a/queue-5.4/smb3-do-not-error-on-fsync-when-readonly.patch b/queue-5.4/smb3-do-not-error-on-fsync-when-readonly.patch new file mode 100644 index 00000000000..36025acfbaa --- /dev/null +++ b/queue-5.4/smb3-do-not-error-on-fsync-when-readonly.patch @@ -0,0 +1,94 @@ +From d71a74c56f782ac90af402eda47068938309cab0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Nov 2021 01:47:48 -0600 +Subject: smb3: do not error on fsync when readonly + +From: Steve French + +[ Upstream commit 71e6864eacbef0b2645ca043cdfbac272cb6cea3 ] + +Linux allows doing a flush/fsync on a file open for read-only, +but the protocol does not allow that. If the file passed in +on the flush is read-only try to find a writeable handle for +the same inode, if that is not possible skip sending the +fsync call to the server to avoid breaking the apps. + +Reported-by: Julian Sikorski +Tested-by: Julian Sikorski +Suggested-by: Jeremy Allison +Reviewed-by: Paulo Alcantara (SUSE) +Signed-off-by: Steve French +Signed-off-by: Sasha Levin +--- + fs/cifs/file.c | 35 +++++++++++++++++++++++++++++------ + 1 file changed, 29 insertions(+), 6 deletions(-) + +diff --git a/fs/cifs/file.c b/fs/cifs/file.c +index a9746af5a44db..03c85beecec10 100644 +--- a/fs/cifs/file.c ++++ b/fs/cifs/file.c +@@ -2577,12 +2577,23 @@ int cifs_strict_fsync(struct file *file, loff_t start, loff_t end, + tcon = tlink_tcon(smbfile->tlink); + if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) { + server = tcon->ses->server; +- if (server->ops->flush) +- rc = server->ops->flush(xid, tcon, &smbfile->fid); +- else ++ if (server->ops->flush == NULL) { + rc = -ENOSYS; ++ goto strict_fsync_exit; ++ } ++ ++ if ((OPEN_FMODE(smbfile->f_flags) & FMODE_WRITE) == 0) { ++ smbfile = find_writable_file(CIFS_I(inode), FIND_WR_ANY); ++ if (smbfile) { ++ rc = server->ops->flush(xid, tcon, &smbfile->fid); ++ cifsFileInfo_put(smbfile); ++ } else ++ cifs_dbg(FYI, "ignore fsync for file not open for write\n"); ++ } else ++ rc = server->ops->flush(xid, tcon, &smbfile->fid); + } + ++strict_fsync_exit: + free_xid(xid); + return rc; + } +@@ -2594,6 +2605,7 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) + struct cifs_tcon *tcon; + struct TCP_Server_Info *server; + struct cifsFileInfo *smbfile = file->private_data; ++ struct inode *inode = file_inode(file); + struct cifs_sb_info *cifs_sb = CIFS_FILE_SB(file); + + rc = file_write_and_wait_range(file, start, end); +@@ -2608,12 +2620,23 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) + tcon = tlink_tcon(smbfile->tlink); + if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC)) { + server = tcon->ses->server; +- if (server->ops->flush) +- rc = server->ops->flush(xid, tcon, &smbfile->fid); +- else ++ if (server->ops->flush == NULL) { + rc = -ENOSYS; ++ goto fsync_exit; ++ } ++ ++ if ((OPEN_FMODE(smbfile->f_flags) & FMODE_WRITE) == 0) { ++ smbfile = find_writable_file(CIFS_I(inode), FIND_WR_ANY); ++ if (smbfile) { ++ rc = server->ops->flush(xid, tcon, &smbfile->fid); ++ cifsFileInfo_put(smbfile); ++ } else ++ cifs_dbg(FYI, "ignore fsync for file not open for write\n"); ++ } else ++ rc = server->ops->flush(xid, tcon, &smbfile->fid); + } + ++fsync_exit: + free_xid(xid); + return rc; + } +-- +2.33.0 + -- 2.47.2