cifs: Allow directIO read/write during cache=strict
Subsystems (2)
PATCH v2 1/1 cifs: Allow directIO read/write during cache=strict
Currently cifs have all or nothing approach for directIO operations. cache=strict mode does not allow directIO while cache=none mode performs all the operations as directIO even when user does not specify O_DIRECT flag. This patch enables strict cache mode to honour directIO semantics.
---
*Changelog
v2:
- Also consider CIFS_MOUNT_NO_BRL flag.
fs/cifs/dir.c | 8 ++++++++ fs/cifs/file.c | 8 ++++++++ 2 files changed, 16 insertions(+), 0 deletions(-)
fs/cifs/dir.c +8 -0
@@ -497,6 +497,14 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry, goto out; } +if (file->f_flags &O_DIRECT && +CIFS_SB (inode->i_sb)->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) { +if (CIFS_SB (inode->i_sb)->mnt_cifs_flags &CIFS_MOUNT_NO_BRL ) + file->f_op = &cifs_file_direct_nobrl_ops; +else + file->f_op = &cifs_file_direct_ops; + } + file_info =cifs_new_fileinfo (&fid, file, tlink, oplock);if (file_info ==NULL ) {if (server->ops->close)
fs/cifs/file.c +8 -0
@@ -467,6 +467,14 @@ int cifs_open(struct inode *inode, struct file *file)cifs_dbg (FYI ,"inode = 0x%p file flags are 0x%x for %s\n" , inode, file->f_flags, full_path); +if (file->f_flags &O_DIRECT && + cifs_sb->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) { +if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_BRL ) + file->f_op = &cifs_file_direct_nobrl_ops; +else + file->f_op = &cifs_file_direct_ops; + } +if (server->oplocks) oplock =REQ_OPLOCK ;else
Signature · 1 line
1.7.7
Steve French
Appliedmerged into cifs-2.6.git
Quoted 57 lines · Namjae Jeon
Currently cifs have all or nothing approach for directIO operations. cache=strict mode does not allow directIO while cache=none mode performs all the operations as directIO even when user does not specify
O_DIRECTflag. This patch enables strict cache mode to honour directIO semantics.Signed-off-by Namjae Jeon <[email protected]>Signed-off-by Ashish Sangwan <[email protected]>---
*Changelog
v2:
- Also considerCIFS_MOUNT_NO_BRLflag.fs/cifs/dir.c | 8 ++++++++ fs/cifs/file.c | 8 ++++++++ 2 files changed, 16 insertions(+), 0 deletions(-)fs/cifs/dir.c +8
-0@@ -497,6 +497,14 @@ cifs_atomic_open(struct inode *inode, struct dentry *direntry, goto out; } +if (file->f_flags &O_DIRECT && +CIFS_SB (inode->i_sb)->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) { +if (CIFS_SB (inode->i_sb)->mnt_cifs_flags &CIFS_MOUNT_NO_BRL ) + file->f_op = &cifs_file_direct_nobrl_ops; +else + file->f_op = &cifs_file_direct_ops; + } + file_info =cifs_new_fileinfo (&fid, file, tlink, oplock);if (file_info ==NULL ) {if (server->ops->close)fs/cifs/file.c +8
-1@@ -467,6 +467,14 @@ int cifs_open(struct inode *inode, struct file *file)cifs_dbg (FYI ,"inode = 0x%p file flags are 0x%x for %s\n" , inode, file->f_flags, full_path); +if (file->f_flags &O_DIRECT && + cifs_sb->mnt_cifs_flags &CIFS_MOUNT_STRICT_IO ) { +if (cifs_sb->mnt_cifs_flags &CIFS_MOUNT_NO_BRL ) + file->f_op = &cifs_file_direct_nobrl_ops; +else + file->f_op = &cifs_file_direct_ops; + } +if (server->oplocks) oplock =REQ_OPLOCK ;else --1.7.7
Signature · 3 lines
Thanks, Steve