FAILED: patch "[PATCH] smb: client: fix atomic open with O_DIRECT & O_SYNC" failed to apply to 5.10-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 5.10-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.10.y
git checkout FETCH_HEAD
git cherry-pick -x 4a7d2729dc99437dbb880a64c47828c0d191b308
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026031706-baritone-circle-1085@gregkh' --subject-prefix 'PATCH 5.10.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 4a7d2729dc99437dbb880a64c47828c0d191b308 Mon Sep 17 00:00:00 2001
From: Paulo Alcantara <[email protected]>
Date: Sat, 7 Mar 2026 18:20:16 -0300
Subject: [PATCH] smb: client: fix atomic open with O_DIRECT & O_SYNC
When user application requests O_DIRECT|O_SYNC along with O_CREAT on open(2), CREATE_NO_BUFFER and CREATE_WRITE_THROUGH bits were missed in CREATE request when performing an atomic open, thus leading to potentially data integrity issues.
Fix this by setting those missing bits in CREATE request when O_DIRECT|O_SYNC has been specified in cifs_do_create().
fs/smb/client/cifsglob.h +11 -0
@@ -20,6 +20,7 @@#include <linux/utsname.h> #include <linux/sched/mm.h> #include <linux/netfs.h> +#include <linux/fcntl.h> #include "cifs_fs_sb.h" #include "cifsacl.h" #include <crypto/internal/hash.h>
@@ -2375,4 +2376,14 @@ static inline bool cifs_forced_shutdown(const struct cifs_sb_info *sbi) return cifs_sb_flags(sbi) & CIFS_MOUNT_SHUTDOWN; } +static inline int cifs_open_create_options (unsigned int oflags,int opts) +{ +/* O_SYNC also has bit for O_DSYNC so following check picks up either */ +if (oflags &O_SYNC ) + opts |=CREATE_WRITE_THROUGH ; +if (oflags &O_DIRECT ) + opts |=CREATE_NO_BUFFER ; +return opts; +} +#endif /* _CIFS_GLOB_H */
fs/smb/client/dir.c +1 -0
@@ -308,6 +308,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned goto out; } + create_options |=cifs_open_create_options (oflags, create_options);/* * if we're not using unix extensions, see if we need to set * ATTR_READONLY on the create call
fs/smb/client/file.c +3 -15
@@ -584,15 +584,8 @@ static int cifs_nt_open(const char *full_path, struct inode *inode, struct cifs_*********************************************************************/ disposition =cifs_get_disposition (f_flags); -/* BB pass O_SYNC flag through on file attributes .. BB */ - -/* O_SYNC also has bit for O_DSYNC so following check picks up either */ -if (f_flags &O_SYNC ) - create_options |=CREATE_WRITE_THROUGH ; - -if (f_flags &O_DIRECT ) - create_options |=CREATE_NO_BUFFER ; + create_options |=cifs_open_create_options (f_flags, create_options); retry_open: oparms = (struct cifs_open_parms ) {
@@ -1314,13 +1307,8 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) rdwr_for_fscache =1 ; desired_access =cifs_convert_flags (cfile->f_flags, rdwr_for_fscache); - -/* O_SYNC also has bit for O_DSYNC so following check picks up either */ -if (cfile->f_flags &O_SYNC ) - create_options |=CREATE_WRITE_THROUGH ; - -if (cfile->f_flags &O_DIRECT ) - create_options |=CREATE_NO_BUFFER ; + create_options |=cifs_open_create_options (cfile->f_flags, + create_options);if (server->ops->get_lease_key) server->ops->get_lease_key (inode, &cfile->fid);
Sasha Levin
maintainerPATCH 1/1 smb: client: fix atomic open with O_DIRECT & O_SYNC
From: Paulo Alcantara <[email protected]>
[ Upstream commit 4a7d2729dc99437dbb880a64c47828c0d191b308 ]
When user application requests O_DIRECT|O_SYNC along with O_CREAT on open(2), CREATE_NO_BUFFER and CREATE_WRITE_THROUGH bits were missed in CREATE request when performing an atomic open, thus leading to potentially data integrity issues.
Fix this by setting those missing bits in CREATE request when O_DIRECT|O_SYNC has been specified in cifs_do_create().
--- fs/cifs/cifsglob.h | 11 +++++++++++ fs/cifs/dir.c | 1 + fs/cifs/file.c | 17 +++-------------- 3 files changed, 15 insertions(+), 14 deletions(-)
fs/cifs/cifsglob.h +11 -0
@@ -26,6 +26,7 @@#include <linux/mm.h> #include <linux/mempool.h> #include <linux/workqueue.h> +#include <linux/fcntl.h> #include "cifs_fs_sb.h" #include "cifsacl.h" #include <crypto/internal/hash.h>
@@ -2124,4 +2125,14 @@ static inline bool cifs_ses_exiting(struct cifs_ses *ses) return ret; } +static inline int cifs_open_create_options (unsigned int oflags,int opts) +{ +/* O_SYNC also has bit for O_DSYNC so following check picks up either */ +if (oflags &O_SYNC ) + opts |=CREATE_WRITE_THROUGH ; +if (oflags &O_DIRECT ) + opts |=CREATE_NO_BUFFER ; +return opts; +} +#endif /* _CIFS_GLOB_H */
fs/cifs/dir.c +1 -0
@@ -348,6 +348,7 @@ cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned int xid, goto out; } + create_options |=cifs_open_create_options (oflags, create_options);/* * if we're not using unix extensions, see if we need to set * ATTR_READONLY on the create call
fs/cifs/file.c +3 -14
@@ -216,19 +216,13 @@ cifs_nt_open(char *full_path, struct inode *inode, struct cifs_sb_info *cifs_sb,*********************************************************************/ disposition =cifs_get_disposition (f_flags); -/* BB pass O_SYNC flag through on file attributes .. BB */ buf =kmalloc (sizeof (FILE_ALL_INFO ),GFP_KERNEL );if (!buf)return -ENOMEM ; -/* O_SYNC also has bit for O_DSYNC so following check picks up either */ -if (f_flags &O_SYNC ) - create_options |=CREATE_WRITE_THROUGH ; - -if (f_flags &O_DIRECT ) - create_options |=CREATE_NO_BUFFER ; + create_options |=cifs_open_create_options (f_flags, create_options); oparms.tcon = tcon; oparms.cifs_sb = cifs_sb;
@@ -750,13 +744,8 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) } desired_access =cifs_convert_flags (cfile->f_flags); - -/* O_SYNC also has bit for O_DSYNC so following check picks up either */ -if (cfile->f_flags &O_SYNC ) - create_options |=CREATE_WRITE_THROUGH ; - -if (cfile->f_flags &O_DIRECT ) - create_options |=CREATE_NO_BUFFER ; + create_options |=cifs_open_create_options (cfile->f_flags, + create_options);if (server->ops->get_lease_key) server->ops->get_lease_key (inode, &cfile->fid);
Signature · 1 line
2.51.0