cifs: call cifs_update_eof with i_lock held

cifs_update_eof has the potential to be racy if multiple threads are
trying to modify it at the same time. Protect modifications of the
server_eof value with the inode->i_lock.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 58ac0f0..6883b08 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -1399,7 +1399,10 @@
 	return rc;
 }
 
-/* update the file size (if needed) after a write */
+/*
+ * update the file size (if needed) after a write. Should be called with
+ * the inode->i_lock held
+ */
 void
 cifs_update_eof(struct cifsInodeInfo *cifsi, loff_t offset,
 		      unsigned int bytes_written)
@@ -1471,7 +1474,9 @@
 				return rc;
 			}
 		} else {
+			spin_lock(&dentry->d_inode->i_lock);
 			cifs_update_eof(cifsi, *poffset, bytes_written);
+			spin_unlock(&dentry->d_inode->i_lock);
 			*poffset += bytes_written;
 		}
 	}
@@ -2197,7 +2202,9 @@
 		if (written) {
 			len -= written;
 			total_written += written;
+			spin_lock(&inode->i_lock);
 			cifs_update_eof(CIFS_I(inode), *poffset, written);
+			spin_unlock(&inode->i_lock);
 			*poffset += written;
 		} else if (rc < 0) {
 			if (!total_written)