patch-2.4.0-test11 linux/fs/nfs/write.c

Next file: linux/fs/nfsd/vfs.c
Previous file: linux/fs/nfs/symlink.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test10/linux/fs/nfs/write.c linux/fs/nfs/write.c
@@ -184,7 +184,7 @@
 		dentry->d_parent->d_name.name, dentry->d_name.name,
 		count, (long long)(page_offset(page) + offset));
 
-	buffer = (u8 *) kmap(page) + offset;
+	buffer = kmap(page) + offset;
 	base = page_offset(page) + offset;
 
 	flags = ((IS_SWAPFILE(inode)) ? NFS_RW_SWAP : 0) | NFS_RW_SYNC;
@@ -601,14 +601,10 @@
 {
 	struct inode	*inode = req->wb_dentry->d_inode;
         struct rpc_clnt	*clnt = NFS_CLIENT(inode);
-        int retval;
 
 	if (!NFS_WBACK_BUSY(req))
 		return 0;
-	req->wb_count++;
-	retval = nfs_wait_event(clnt, req->wb_wait, !NFS_WBACK_BUSY(req));
-	nfs_release_request(req);
-        return retval;
+	return nfs_wait_event(clnt, req->wb_wait, !NFS_WBACK_BUSY(req));
 }
 
 /*
@@ -1065,7 +1061,7 @@
 		struct nfs_page *req = nfs_list_entry(head->next);
 		nfs_list_remove_request(req);
 		nfs_list_add_request(req, &data->pages);
-		iov->iov_base = (void *)(kmap(req->wb_page) + req->wb_offset);
+		iov->iov_base = kmap(req->wb_page) + req->wb_offset;
 		iov->iov_len = req->wb_bytes;
 		count += req->wb_bytes;
 		iov++;
@@ -1239,6 +1235,13 @@
 	}
 #endif
 
+	/*
+	 * Update attributes as result of writeback.
+	 * FIXME: There is an inherent race with invalidate_inode_pages and
+	 *	  writebacks since the page->count is kept > 1 for as long
+	 *	  as the page has a write request pending.
+	 */
+	nfs_write_attributes(inode, resp->fattr);
 	while (!list_empty(&data->pages)) {
 		req = nfs_list_entry(data->pages.next);
 		nfs_list_remove_request(req);
@@ -1278,9 +1281,6 @@
 	next:
 		nfs_unlock_request(req);
 	}
-	/* Update attributes as result of writeback. */
-	nfs_write_attributes(inode, resp->fattr);
-
 }
 
 
@@ -1395,6 +1395,7 @@
         dprintk("NFS: %4d nfs_commit_done (status %d)\n",
                                 task->tk_pid, task->tk_status);
 
+	nfs_write_attributes(inode, resp->fattr);
 	while (!list_empty(&data->pages)) {
 		req = nfs_list_entry(data->pages.next);
 		nfs_list_remove_request(req);
@@ -1426,8 +1427,6 @@
 	next:
 		nfs_unlock_request(req);
 	}
-
-	nfs_write_attributes(inode, resp->fattr);
 }
 #endif
 

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)