Linux CIFS filesystem development
 help / color / mirror / Atom feed
* [PATCH 2/6] CIFS: Make read call work with strict cache mode (try #3)
@ 2010-11-29 13:36 Pavel Shilovsky
       [not found] ` <1291037804-4000-1-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 10+ messages in thread
From: Pavel Shilovsky @ 2010-11-29 13:36 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

Add cifs_file_aio_read where we read from the cache if we have at least
Level II oplock - otherwise read from the server.

Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 fs/cifs/cifsfs.c |   42 ++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 40 insertions(+), 2 deletions(-)

diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 9c37897..431c46e 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -568,6 +568,44 @@ cifs_do_mount(struct file_system_type *fs_type,
 	return dget(sb->s_root);
 }
 
+static ssize_t cifs_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
+				  unsigned long nr_segs, loff_t pos)
+{
+	struct inode *inode;
+	struct cifs_sb_info *cifs_sb;
+	ssize_t read = 0, retval;
+	unsigned long i;
+
+	inode = iocb->ki_filp->f_path.dentry->d_inode;
+	cifs_sb = CIFS_SB(iocb->ki_filp->f_path.dentry->d_sb);
+
+	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) == 0 ||
+	    CIFS_I(inode)->clientCanCacheRead)
+		return generic_file_aio_read(iocb, iov, nr_segs, pos);
+
+	/* In strict cache mode we need to read from the server all the time
+	 * if we don't have level II oplock because the server can delay mtime
+	 * change - so we can't make a decision about inode invalidating.
+	 * And we can also fail with pagereading if there are mandatory locks
+	 * on pages affected by this read but not on the region from pos to
+	 * pos+len-1. */
+
+	for (i = 0; i < nr_segs; i++) {
+		retval = cifs_user_read(iocb->ki_filp, iov[i].iov_base,
+					iov[i].iov_len, &pos);
+		if (retval < 0) {
+			read = read ? read : retval;
+			break;
+		}
+
+		read += retval;
+	}
+
+	iocb->ki_pos = pos;
+
+	return read;
+}
+
 static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 				   unsigned long nr_segs, loff_t pos)
 {
@@ -690,7 +728,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
 const struct file_operations cifs_file_ops = {
 	.read = do_sync_read,
 	.write = do_sync_write,
-	.aio_read = generic_file_aio_read,
+	.aio_read = cifs_file_aio_read,
 	.aio_write = cifs_file_aio_write,
 	.open = cifs_open,
 	.release = cifs_close,
@@ -727,7 +765,7 @@ const struct file_operations cifs_file_direct_ops = {
 const struct file_operations cifs_file_nobrl_ops = {
 	.read = do_sync_read,
 	.write = do_sync_write,
-	.aio_read = generic_file_aio_read,
+	.aio_read = cifs_file_aio_read,
 	.aio_write = cifs_file_aio_write,
 	.open = cifs_open,
 	.release = cifs_close,
-- 
1.7.3.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 3/6] CIFS: Make write call work with strict cache mode (try #3)
       [not found] ` <1291037804-4000-1-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2010-11-29 13:36   ` Pavel Shilovsky
       [not found]     ` <1291037804-4000-2-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2010-11-29 13:36   ` [PATCH 4/6] CIFS: Make cifs_fsync " Pavel Shilovsky
                     ` (2 subsequent siblings)
  3 siblings, 1 reply; 10+ messages in thread
From: Pavel Shilovsky @ 2010-11-29 13:36 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

On strict cache mode if we don't have Exclusive oplock we write a data to
the server through cifs_user_write. Also set inode invalid_mapping flag if
we have written anything to the server.

Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 fs/cifs/cifsfs.c |   49 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 44 insertions(+), 5 deletions(-)

diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
index 431c46e..0732538 100644
--- a/fs/cifs/cifsfs.c
+++ b/fs/cifs/cifsfs.c
@@ -609,12 +609,51 @@ static ssize_t cifs_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
 static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
 				   unsigned long nr_segs, loff_t pos)
 {
-	struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
-	ssize_t written;
+	struct inode *inode;
+	struct cifs_sb_info *cifs_sb;
+	ssize_t written = 0, retval;
+	unsigned long i;
+
+	inode = iocb->ki_filp->f_path.dentry->d_inode;
+
+	if (CIFS_I(inode)->clientCanCacheAll)
+		return generic_file_aio_write(iocb, iov, nr_segs, pos);
+
+	cifs_sb = CIFS_SB(iocb->ki_filp->f_path.dentry->d_sb);
+
+	if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) == 0) {
+		int rc;
+
+		written = generic_file_aio_write(iocb, iov, nr_segs, pos);
+
+		rc = filemap_fdatawrite(inode->i_mapping);
+		if (rc)
+			cFYI(1, "cifs_file_aio_write: %d rc on %p inode",
+			     rc, inode);
+		return written;
+	}
+
+	/* In strict cache mode we need to write the data to the server exactly
+	 * from the pos to pos+len-1 rather than flush all affected pages
+	 * because it may cause a error with mandatory locks on these pages but
+	 * not on the region from pos to ppos+len-1. */
+
+	for (i = 0; i < nr_segs; i++) {
+		retval = cifs_user_write(iocb->ki_filp, iov[i].iov_base,
+					 iov[i].iov_len, &pos);
+		if (retval < 0) {
+			written = written ? written : retval;
+			break;
+		}
+
+		written += retval;
+	}
+
+	iocb->ki_pos = pos;
+
+	if (written > 0)
+		CIFS_I(inode)->invalid_mapping = true;
 
-	written = generic_file_aio_write(iocb, iov, nr_segs, pos);
-	if (!CIFS_I(inode)->clientCanCacheAll)
-		filemap_fdatawrite(inode->i_mapping);
 	return written;
 }
 
-- 
1.7.3.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 4/6] CIFS: Make cifs_fsync work with strict cache mode (try #3)
       [not found] ` <1291037804-4000-1-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2010-11-29 13:36   ` [PATCH 3/6] CIFS: Make write " Pavel Shilovsky
@ 2010-11-29 13:36   ` Pavel Shilovsky
       [not found]     ` <1291037804-4000-3-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2010-11-29 13:36   ` [PATCH 5/6] CIFS: Make cifs_file_map " Pavel Shilovsky
  2010-11-30  7:43   ` [PATCH 2/6] CIFS: Make read call " Pavel Shilovsky
  3 siblings, 1 reply; 10+ messages in thread
From: Pavel Shilovsky @ 2010-11-29 13:36 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

Remove filemap_write_and_wait call because it is previously called from
vfs_fsync_range and invalidate inode if we don't have at least Level II
oplock and strcit cache mode switched on.

Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 fs/cifs/cifsfs.h |    1 +
 fs/cifs/file.c   |   14 +++++++-------
 fs/cifs/inode.c  |    2 +-
 3 files changed, 9 insertions(+), 8 deletions(-)

diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
index 897b2b2..b8d783c 100644
--- a/fs/cifs/cifsfs.h
+++ b/fs/cifs/cifsfs.h
@@ -61,6 +61,7 @@ extern int cifs_rename(struct inode *, struct dentry *, struct inode *,
 		       struct dentry *);
 extern int cifs_revalidate_file(struct file *filp);
 extern int cifs_revalidate_dentry(struct dentry *);
+extern void cifs_invalidate_mapping(struct inode *inode);
 extern int cifs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
 extern int cifs_setattr(struct dentry *, struct iattr *);
 
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index f853bf0..d216879 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1595,20 +1595,20 @@ int cifs_fsync(struct file *file, int datasync)
 	struct cifsTconInfo *tcon;
 	struct cifsFileInfo *smbfile = file->private_data;
 	struct inode *inode = file->f_path.dentry->d_inode;
+	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 
 	xid = GetXid();
 
 	cFYI(1, "Sync file - name: %s datasync: 0x%x",
 		file->f_path.dentry->d_name.name, datasync);
 
-	rc = filemap_write_and_wait(inode->i_mapping);
-	if (rc == 0) {
-		struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
+	if (!CIFS_I(inode)->clientCanCacheRead &&
+	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO))
+		cifs_invalidate_mapping(inode);
 
-		tcon = tlink_tcon(smbfile->tlink);
-		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
-			rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
-	}
+	tcon = tlink_tcon(smbfile->tlink);
+	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
+		rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
 
 	FreeXid(xid);
 	return rc;
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index ff7d299..f90a40a 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -1671,7 +1671,7 @@ cifs_inode_needs_reval(struct inode *inode)
 }
 
 /* check invalid_mapping flag and zap the cache if it's set */
-static void
+void
 cifs_invalidate_mapping(struct inode *inode)
 {
 	int rc;
-- 
1.7.3.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCH 5/6] CIFS: Make cifs_file_map work with strict cache mode (try #3)
       [not found] ` <1291037804-4000-1-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2010-11-29 13:36   ` [PATCH 3/6] CIFS: Make write " Pavel Shilovsky
  2010-11-29 13:36   ` [PATCH 4/6] CIFS: Make cifs_fsync " Pavel Shilovsky
@ 2010-11-29 13:36   ` Pavel Shilovsky
       [not found]     ` <1291037804-4000-4-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  2010-11-30  7:43   ` [PATCH 2/6] CIFS: Make read call " Pavel Shilovsky
  3 siblings, 1 reply; 10+ messages in thread
From: Pavel Shilovsky @ 2010-11-29 13:36 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

Invalidate inode if we don't have at least Level II oplock and strict
cache mode switched on.

Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
 fs/cifs/file.c |   20 +++++++++++++++-----
 1 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index d216879..e9f2fae 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1812,14 +1812,24 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
 int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
 {
 	int rc, xid;
+	struct inode *inode = file->f_path.dentry->d_inode;
+	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
 
 	xid = GetXid();
-	rc = cifs_revalidate_file(file);
-	if (rc) {
-		cFYI(1, "Validation prior to mmap failed, error=%d", rc);
-		FreeXid(xid);
-		return rc;
+
+	if (!CIFS_I(inode)->clientCanCacheRead &&
+	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO))
+		cifs_invalidate_mapping(inode);
+	else {
+		rc = cifs_revalidate_file(file);
+		if (rc) {
+			cFYI(1, "Validation prior to mmap failed, error=%d",
+			     rc);
+			FreeXid(xid);
+			return rc;
+		}
 	}
+
 	rc = generic_file_mmap(file, vma);
 	FreeXid(xid);
 	return rc;
-- 
1.7.3.2

^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCH 2/6] CIFS: Make read call work with strict cache mode (try #3)
       [not found] ` <1291037804-4000-1-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
                     ` (2 preceding siblings ...)
  2010-11-29 13:36   ` [PATCH 5/6] CIFS: Make cifs_file_map " Pavel Shilovsky
@ 2010-11-30  7:43   ` Pavel Shilovsky
  3 siblings, 0 replies; 10+ messages in thread
From: Pavel Shilovsky @ 2010-11-30  7:43 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

2010/11/29 Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:
> Add cifs_file_aio_read where we read from the cache if we have at least
> Level II oplock - otherwise read from the server.
>
> Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>  fs/cifs/cifsfs.c |   42 ++++++++++++++++++++++++++++++++++++++++--
>  1 files changed, 40 insertions(+), 2 deletions(-)
>
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index 9c37897..431c46e 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -568,6 +568,44 @@ cifs_do_mount(struct file_system_type *fs_type,
>        return dget(sb->s_root);
>  }
>
> +static ssize_t cifs_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
> +                                 unsigned long nr_segs, loff_t pos)
> +{
> +       struct inode *inode;
> +       struct cifs_sb_info *cifs_sb;
> +       ssize_t read = 0, retval;
> +       unsigned long i;
> +
> +       inode = iocb->ki_filp->f_path.dentry->d_inode;
> +       cifs_sb = CIFS_SB(iocb->ki_filp->f_path.dentry->d_sb);
> +
> +       if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) == 0 ||
> +           CIFS_I(inode)->clientCanCacheRead)
> +               return generic_file_aio_read(iocb, iov, nr_segs, pos);
> +
> +       /* In strict cache mode we need to read from the server all the time
> +        * if we don't have level II oplock because the server can delay mtime
> +        * change - so we can't make a decision about inode invalidating.
> +        * And we can also fail with pagereading if there are mandatory locks
> +        * on pages affected by this read but not on the region from pos to
> +        * pos+len-1. */
> +
> +       for (i = 0; i < nr_segs; i++) {
> +               retval = cifs_user_read(iocb->ki_filp, iov[i].iov_base,
> +                                       iov[i].iov_len, &pos);
> +               if (retval < 0) {
> +                       read = read ? read : retval;
> +                       break;
> +               }
> +
> +               read += retval;
> +       }
> +
> +       iocb->ki_pos = pos;
> +
> +       return read;
> +}
> +
>  static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
>                                   unsigned long nr_segs, loff_t pos)
>  {
> @@ -690,7 +728,7 @@ const struct inode_operations cifs_symlink_inode_ops = {
>  const struct file_operations cifs_file_ops = {
>        .read = do_sync_read,
>        .write = do_sync_write,
> -       .aio_read = generic_file_aio_read,
> +       .aio_read = cifs_file_aio_read,
>        .aio_write = cifs_file_aio_write,
>        .open = cifs_open,
>        .release = cifs_close,
> @@ -727,7 +765,7 @@ const struct file_operations cifs_file_direct_ops = {
>  const struct file_operations cifs_file_nobrl_ops = {
>        .read = do_sync_read,
>        .write = do_sync_write,
> -       .aio_read = generic_file_aio_read,
> +       .aio_read = cifs_file_aio_read,
>        .aio_write = cifs_file_aio_write,
>        .open = cifs_open,
>        .release = cifs_close,
> --
> 1.7.3.2
>
>

Just found out that comment style don't match CodingStyle again. Let's
drop with version. The same for write patch.

-- 
Best regards,
Pavel Shilovsky.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 3/6] CIFS: Make write call work with strict cache mode (try #3)
       [not found]     ` <1291037804-4000-2-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2010-11-30  7:56       ` Pavel Shilovsky
  0 siblings, 0 replies; 10+ messages in thread
From: Pavel Shilovsky @ 2010-11-30  7:56 UTC (permalink / raw)
  To: linux-cifs-u79uwXL29TY76Z2rM5mHXA

2010/11/29 Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>:
> On strict cache mode if we don't have Exclusive oplock we write a data to
> the server through cifs_user_write. Also set inode invalid_mapping flag if
> we have written anything to the server.
>
> Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>  fs/cifs/cifsfs.c |   49 ++++++++++++++++++++++++++++++++++++++++++++-----
>  1 files changed, 44 insertions(+), 5 deletions(-)
>
> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
> index 431c46e..0732538 100644
> --- a/fs/cifs/cifsfs.c
> +++ b/fs/cifs/cifsfs.c
> @@ -609,12 +609,51 @@ static ssize_t cifs_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
>  static ssize_t cifs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
>                                   unsigned long nr_segs, loff_t pos)
>  {
> -       struct inode *inode = iocb->ki_filp->f_path.dentry->d_inode;
> -       ssize_t written;
> +       struct inode *inode;
> +       struct cifs_sb_info *cifs_sb;
> +       ssize_t written = 0, retval;
> +       unsigned long i;
> +
> +       inode = iocb->ki_filp->f_path.dentry->d_inode;
> +
> +       if (CIFS_I(inode)->clientCanCacheAll)
> +               return generic_file_aio_write(iocb, iov, nr_segs, pos);
> +
> +       cifs_sb = CIFS_SB(iocb->ki_filp->f_path.dentry->d_sb);
> +
> +       if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO) == 0) {
> +               int rc;
> +
> +               written = generic_file_aio_write(iocb, iov, nr_segs, pos);
> +
> +               rc = filemap_fdatawrite(inode->i_mapping);
> +               if (rc)
> +                       cFYI(1, "cifs_file_aio_write: %d rc on %p inode",
> +                            rc, inode);
> +               return written;
> +       }
> +
> +       /* In strict cache mode we need to write the data to the server exactly
> +        * from the pos to pos+len-1 rather than flush all affected pages
> +        * because it may cause a error with mandatory locks on these pages but
> +        * not on the region from pos to ppos+len-1. */
> +
> +       for (i = 0; i < nr_segs; i++) {
> +               retval = cifs_user_write(iocb->ki_filp, iov[i].iov_base,
> +                                        iov[i].iov_len, &pos);
> +               if (retval < 0) {
> +                       written = written ? written : retval;
> +                       break;
> +               }
> +
> +               written += retval;
> +       }
> +
> +       iocb->ki_pos = pos;
> +
> +       if (written > 0)
> +               CIFS_I(inode)->invalid_mapping = true;
>
> -       written = generic_file_aio_write(iocb, iov, nr_segs, pos);
> -       if (!CIFS_I(inode)->clientCanCacheAll)
> -               filemap_fdatawrite(inode->i_mapping);
>        return written;
>  }
>
> --
> 1.7.3.2
>
>

See correct one in try #4.


-- 
Best regards,
Pavel Shilovsky.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 4/6] CIFS: Make cifs_fsync work with strict cache mode (try #3)
       [not found]     ` <1291037804-4000-3-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2010-12-07 12:52       ` Jeff Layton
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Layton @ 2010-12-07 12:52 UTC (permalink / raw)
  To: Pavel Shilovsky; +Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA

On Mon, 29 Nov 2010 16:36:43 +0300
Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

> Remove filemap_write_and_wait call because it is previously called from
> vfs_fsync_range and invalidate inode if we don't have at least Level II
> oplock and strcit cache mode switched on.
> 
> Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>  fs/cifs/cifsfs.h |    1 +
>  fs/cifs/file.c   |   14 +++++++-------
>  fs/cifs/inode.c  |    2 +-
>  3 files changed, 9 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/cifs/cifsfs.h b/fs/cifs/cifsfs.h
> index 897b2b2..b8d783c 100644
> --- a/fs/cifs/cifsfs.h
> +++ b/fs/cifs/cifsfs.h
> @@ -61,6 +61,7 @@ extern int cifs_rename(struct inode *, struct dentry *, struct inode *,
>  		       struct dentry *);
>  extern int cifs_revalidate_file(struct file *filp);
>  extern int cifs_revalidate_dentry(struct dentry *);
> +extern void cifs_invalidate_mapping(struct inode *inode);
>  extern int cifs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
>  extern int cifs_setattr(struct dentry *, struct iattr *);
>  
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index f853bf0..d216879 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -1595,20 +1595,20 @@ int cifs_fsync(struct file *file, int datasync)
>  	struct cifsTconInfo *tcon;
>  	struct cifsFileInfo *smbfile = file->private_data;
>  	struct inode *inode = file->f_path.dentry->d_inode;
> +	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
>  
>  	xid = GetXid();
>  
>  	cFYI(1, "Sync file - name: %s datasync: 0x%x",
>  		file->f_path.dentry->d_name.name, datasync);
>  
> -	rc = filemap_write_and_wait(inode->i_mapping);
> -	if (rc == 0) {
> -		struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
> +	if (!CIFS_I(inode)->clientCanCacheRead &&
> +	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO))
> +		cifs_invalidate_mapping(inode);
>  
> -		tcon = tlink_tcon(smbfile->tlink);
> -		if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
> -			rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
> -	}
> +	tcon = tlink_tcon(smbfile->tlink);
> +	if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_NOSSYNC))
> +		rc = CIFSSMBFlush(xid, tcon, smbfile->netfid);
>  
>  	FreeXid(xid);
>  	return rc;
> diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
> index ff7d299..f90a40a 100644
> --- a/fs/cifs/inode.c
> +++ b/fs/cifs/inode.c
> @@ -1671,7 +1671,7 @@ cifs_inode_needs_reval(struct inode *inode)
>  }
>  
>  /* check invalid_mapping flag and zap the cache if it's set */
> -static void
> +void
>  cifs_invalidate_mapping(struct inode *inode)
>  {
>  	int rc;

Looks reasonable, but I'll withhold the reviewed-by until the previous
patches are fixed.

-- 
Jeff Layton <jlayton-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 5/6] CIFS: Make cifs_file_map work with strict cache mode (try #3)
       [not found]     ` <1291037804-4000-4-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2010-12-07 12:56       ` Jeff Layton
       [not found]         ` <20101207075635.6f9c1c5f-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
  0 siblings, 1 reply; 10+ messages in thread
From: Jeff Layton @ 2010-12-07 12:56 UTC (permalink / raw)
  To: Pavel Shilovsky; +Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA

On Mon, 29 Nov 2010 16:36:44 +0300
Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

> Invalidate inode if we don't have at least Level II oplock and strict
> cache mode switched on.
> 
> Signed-off-by: Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
> ---
>  fs/cifs/file.c |   20 +++++++++++++++-----
>  1 files changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index d216879..e9f2fae 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -1812,14 +1812,24 @@ static ssize_t cifs_read(struct file *file, char *read_data, size_t read_size,
>  int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
>  {
>  	int rc, xid;
> +	struct inode *inode = file->f_path.dentry->d_inode;
> +	struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
>  
>  	xid = GetXid();
> -	rc = cifs_revalidate_file(file);
> -	if (rc) {
> -		cFYI(1, "Validation prior to mmap failed, error=%d", rc);
> -		FreeXid(xid);
> -		return rc;
> +
> +	if (!CIFS_I(inode)->clientCanCacheRead &&
> +	    (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_STRICT_IO))
> +		cifs_invalidate_mapping(inode);
> +	else {
> +		rc = cifs_revalidate_file(file);
> +		if (rc) {
> +			cFYI(1, "Validation prior to mmap failed, error=%d",
> +			     rc);
> +			FreeXid(xid);
> +			return rc;
> +		}
>  	}
> +
>  	rc = generic_file_mmap(file, vma);
>  	FreeXid(xid);
>  	return rc;

Looks reasonable, though all of this special-casing sure is gross...

Might it be better to have a set of cifs_strict_file/inode_ops and use
those rather than all of these if/else conditions?

-- 
Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 5/6] CIFS: Make cifs_file_map work with strict cache mode (try #3)
       [not found]         ` <20101207075635.6f9c1c5f-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
@ 2010-12-08 20:53           ` Pavel Shilovsky
       [not found]             ` <AANLkTineJVVgK6aihGBLWJfEnEOuz67CcHncwBUpdvt0-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
  0 siblings, 1 reply; 10+ messages in thread
From: Pavel Shilovsky @ 2010-12-08 20:53 UTC (permalink / raw)
  To: Jeff Layton; +Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA

2010/12/7 Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>:
> Looks reasonable, though all of this special-casing sure is gross...
>
> Might it be better to have a set of cifs_strict_file/inode_ops and use
> those rather than all of these if/else conditions?
>

Good idea. So, do you mean to split all these aio_read, aio_write,
fsync and mmap into strict and non-strict calls as we have in direct
i/o case?

-- 
Best regards,
Pavel Shilovsky.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 5/6] CIFS: Make cifs_file_map work with strict cache mode (try #3)
       [not found]             ` <AANLkTineJVVgK6aihGBLWJfEnEOuz67CcHncwBUpdvt0-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
@ 2010-12-08 20:59               ` Jeff Layton
  0 siblings, 0 replies; 10+ messages in thread
From: Jeff Layton @ 2010-12-08 20:59 UTC (permalink / raw)
  To: Pavel Shilovsky; +Cc: linux-cifs-u79uwXL29TY76Z2rM5mHXA

On Wed, 8 Dec 2010 23:53:12 +0300
Pavel Shilovsky <piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:

> 2010/12/7 Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>:
> > Looks reasonable, though all of this special-casing sure is gross...
> >
> > Might it be better to have a set of cifs_strict_file/inode_ops and use
> > those rather than all of these if/else conditions?
> >
> 
> Good idea. So, do you mean to split all these aio_read, aio_write,
> fsync and mmap into strict and non-strict calls as we have in direct
> i/o case?
> 

Right. Once a mount is declared "strictcache" it won't ever change, so
you might as well set the ops appropriately.

-- 
Jeff Layton <jlayton-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2010-12-08 20:59 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-11-29 13:36 [PATCH 2/6] CIFS: Make read call work with strict cache mode (try #3) Pavel Shilovsky
     [not found] ` <1291037804-4000-1-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-11-29 13:36   ` [PATCH 3/6] CIFS: Make write " Pavel Shilovsky
     [not found]     ` <1291037804-4000-2-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-11-30  7:56       ` Pavel Shilovsky
2010-11-29 13:36   ` [PATCH 4/6] CIFS: Make cifs_fsync " Pavel Shilovsky
     [not found]     ` <1291037804-4000-3-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-12-07 12:52       ` Jeff Layton
2010-11-29 13:36   ` [PATCH 5/6] CIFS: Make cifs_file_map " Pavel Shilovsky
     [not found]     ` <1291037804-4000-4-git-send-email-piastryyy-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2010-12-07 12:56       ` Jeff Layton
     [not found]         ` <20101207075635.6f9c1c5f-9yPaYZwiELC+kQycOl6kW4xkIHaj4LzF@public.gmane.org>
2010-12-08 20:53           ` Pavel Shilovsky
     [not found]             ` <AANLkTineJVVgK6aihGBLWJfEnEOuz67CcHncwBUpdvt0-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2010-12-08 20:59               ` Jeff Layton
2010-11-30  7:43   ` [PATCH 2/6] CIFS: Make read call " Pavel Shilovsky

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox