diff mbox series

smb: add missing create options for O_DIRECT and O_SYNC flags

Message ID 20230703120709.3610-1-bharathsm@microsoft.com (mailing list archive)
State New, archived
Headers show
Series smb: add missing create options for O_DIRECT and O_SYNC flags | expand

Commit Message

Bharath SM July 3, 2023, 12:07 p.m. UTC
The CREATE_NO_BUFFER and CREATE_WRITE_THROUGH file create options
are correctly set in cifs_nt_open and cifs_reopen functions based
on O_DIRECT and O_SYNC flags. However flags are missing during the
file creation process in cifs_atomic_open, this was leading to
successful write operations with O_DIRECT even in case on un-aligned
size. Fixed by setting create options based on open file flags.

Signed-off-by: Bharath SM <bharathsm@microsoft.com>
---
 fs/smb/client/dir.c | 6 ++++++
 1 file changed, 6 insertions(+)

Comments

Paulo Alcantara July 3, 2023, 4:03 p.m. UTC | #1
Bharath SM <bharathsm.hsk@gmail.com> writes:

> The CREATE_NO_BUFFER and CREATE_WRITE_THROUGH file create options
> are correctly set in cifs_nt_open and cifs_reopen functions based
> on O_DIRECT and O_SYNC flags. However flags are missing during the
> file creation process in cifs_atomic_open, this was leading to
> successful write operations with O_DIRECT even in case on un-aligned
> size. Fixed by setting create options based on open file flags.
>
> Signed-off-by: Bharath SM <bharathsm@microsoft.com>
> ---
>  fs/smb/client/dir.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c
> index 30b1e1bfd204..4178a7fb2ac2 100644
> --- a/fs/smb/client/dir.c
> +++ b/fs/smb/client/dir.c
> @@ -292,6 +292,12 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned
>  	 * ACLs
>  	 */
>  
> +	if (oflags & O_SYNC)
> +		create_options |= CREATE_WRITE_THROUGH;
> +
> +	if (oflags & O_DIRECT)
> +		create_options |= CREATE_NO_BUFFER;
> +

Looks good, thanks.

I see that cifs_nt_open(), cifs_reopen_file() and cifs_do_create() use
cifs_create_options().

I'd rather have those flags set in cifs_create_options() by passing a
new @flags to it, so if we need to make any changes later, only
cifs_create_options() will require it.  What do you think?
Bharath SM July 5, 2023, 6:13 a.m. UTC | #2
On Mon, Jul 3, 2023 at 9:33 PM Paulo Alcantara <pc@manguebit.com> wrote:
>
> Bharath SM <bharathsm.hsk@gmail.com> writes:
>
> > The CREATE_NO_BUFFER and CREATE_WRITE_THROUGH file create options
> > are correctly set in cifs_nt_open and cifs_reopen functions based
> > on O_DIRECT and O_SYNC flags. However flags are missing during the
> > file creation process in cifs_atomic_open, this was leading to
> > successful write operations with O_DIRECT even in case on un-aligned
> > size. Fixed by setting create options based on open file flags.
> >
> > Signed-off-by: Bharath SM <bharathsm@microsoft.com>
> > ---
> >  fs/smb/client/dir.c | 6 ++++++
> >  1 file changed, 6 insertions(+)
> >
> > diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c
> > index 30b1e1bfd204..4178a7fb2ac2 100644
> > --- a/fs/smb/client/dir.c
> > +++ b/fs/smb/client/dir.c
> > @@ -292,6 +292,12 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned
> >        * ACLs
> >        */
> >
> > +     if (oflags & O_SYNC)
> > +             create_options |= CREATE_WRITE_THROUGH;
> > +
> > +     if (oflags & O_DIRECT)
> > +             create_options |= CREATE_NO_BUFFER;
> > +
>
> Looks good, thanks.
>
> I see that cifs_nt_open(), cifs_reopen_file() and cifs_do_create() use
> cifs_create_options().
>
> I'd rather have those flags set in cifs_create_options() by passing a
> new @flags to it, so if we need to make any changes later, only
> cifs_create_options() will require it.  What do you think?

Thanks,
I see there are around 34 places where we call cifs_create_options()
and currently it's taking cifs_sb,create options as arguments. Should
we make another helper function with name
"create_options=cifs_parse_flags(flags)" then pass create_options into
cifs_create_options() ?
I think we can do this cleanup as the next patch. What do you think.?
Paulo Alcantara July 5, 2023, 1:28 p.m. UTC | #3
Bharath SM <bharathsm.hsk@gmail.com> writes:

> On Mon, Jul 3, 2023 at 9:33 PM Paulo Alcantara <pc@manguebit.com> wrote:
>>
>> Bharath SM <bharathsm.hsk@gmail.com> writes:
>>
>> > The CREATE_NO_BUFFER and CREATE_WRITE_THROUGH file create options
>> > are correctly set in cifs_nt_open and cifs_reopen functions based
>> > on O_DIRECT and O_SYNC flags. However flags are missing during the
>> > file creation process in cifs_atomic_open, this was leading to
>> > successful write operations with O_DIRECT even in case on un-aligned
>> > size. Fixed by setting create options based on open file flags.
>> >
>> > Signed-off-by: Bharath SM <bharathsm@microsoft.com>
>> > ---
>> >  fs/smb/client/dir.c | 6 ++++++
>> >  1 file changed, 6 insertions(+)
>> >
>> > diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c
>> > index 30b1e1bfd204..4178a7fb2ac2 100644
>> > --- a/fs/smb/client/dir.c
>> > +++ b/fs/smb/client/dir.c
>> > @@ -292,6 +292,12 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned
>> >        * ACLs
>> >        */
>> >
>> > +     if (oflags & O_SYNC)
>> > +             create_options |= CREATE_WRITE_THROUGH;
>> > +
>> > +     if (oflags & O_DIRECT)
>> > +             create_options |= CREATE_NO_BUFFER;
>> > +
>>
>> Looks good, thanks.
>>
>> I see that cifs_nt_open(), cifs_reopen_file() and cifs_do_create() use
>> cifs_create_options().
>>
>> I'd rather have those flags set in cifs_create_options() by passing a
>> new @flags to it, so if we need to make any changes later, only
>> cifs_create_options() will require it.  What do you think?
>
> I see there are around 34 places where we call cifs_create_options()
> and currently it's taking cifs_sb,create options as arguments. Should
> we make another helper function with name
> "create_options=cifs_parse_flags(flags)" then pass create_options into
> cifs_create_options() ?
> I think we can do this cleanup as the next patch. What do you think.?

Sounds good.  Thanks.
diff mbox series

Patch

diff --git a/fs/smb/client/dir.c b/fs/smb/client/dir.c
index 30b1e1bfd204..4178a7fb2ac2 100644
--- a/fs/smb/client/dir.c
+++ b/fs/smb/client/dir.c
@@ -292,6 +292,12 @@  static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned
 	 * ACLs
 	 */
 
+	if (oflags & O_SYNC)
+		create_options |= CREATE_WRITE_THROUGH;
+
+	if (oflags & O_DIRECT)
+		create_options |= CREATE_NO_BUFFER;
+
 	if (!server->ops->open) {
 		rc = -ENOSYS;
 		goto out;