[PATCH 5/5] CIFS: Fix write after setting a read lock for read oplock files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If we have a read oplock and set a read lock in it, we can't write to the
locked area - so, filemap_fdatawrite may fail with a no information for a
userspace application even if we request a write to non-locked area. Fix
this by replacing it with filemap_write_and_wait call and sending non-page
write in a error case.

While this may end up with two write requests to the server, we can be sure
that our data will be the same at the server and the page cache - the next read
on this file gets the valid data.

Signed-off-by: Pavel Shilovsky <piastry@xxxxxxxxxxx>
---
 fs/cifs/file.c |   10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index f8fe1bd..89efd85 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2511,14 +2511,12 @@ cifs_strict_writev(struct kiocb *iocb, const struct iovec *iov,
 	 */
 	if (!cinode->clientCanCacheAll && cinode->clientCanCacheRead) {
 		ssize_t written;
-		int rc;
 
 		written = generic_file_aio_write(iocb, iov, nr_segs, pos);
-		rc = filemap_fdatawrite(inode->i_mapping);
-		if (rc)
-			return (ssize_t)rc;
-
-		return written;
+		/* try page write at first */
+		if (!filemap_write_and_wait(inode->i_mapping))
+			return written;
+		/* page write failed - try from pos to pos+len-1 */
 	}
 #endif
 
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux