aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/nfs/write.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/fs/nfs/write.c b/fs/nfs/write.c
index 30513029c00c..1667e3984418 100644
--- a/fs/nfs/write.c
+++ b/fs/nfs/write.c
@@ -351,15 +351,13 @@ int nfs_writepages(struct address_space *mapping, struct writeback_control *wbc)
351/* 351/*
352 * Insert a write request into an inode 352 * Insert a write request into an inode
353 */ 353 */
354static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req) 354static void nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
355{ 355{
356 struct nfs_inode *nfsi = NFS_I(inode); 356 struct nfs_inode *nfsi = NFS_I(inode);
357 int error; 357 int error;
358 358
359 error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req); 359 error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req);
360 BUG_ON(error == -EEXIST); 360 BUG_ON(error);
361 if (error)
362 return error;
363 if (!nfsi->npages) { 361 if (!nfsi->npages) {
364 igrab(inode); 362 igrab(inode);
365 if (nfs_have_delegation(inode, FMODE_WRITE)) 363 if (nfs_have_delegation(inode, FMODE_WRITE))
@@ -369,8 +367,8 @@ static int nfs_inode_add_request(struct inode *inode, struct nfs_page *req)
369 set_page_private(req->wb_page, (unsigned long)req); 367 set_page_private(req->wb_page, (unsigned long)req);
370 nfsi->npages++; 368 nfsi->npages++;
371 kref_get(&req->wb_kref); 369 kref_get(&req->wb_kref);
372 radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index, NFS_PAGE_TAG_LOCKED); 370 radix_tree_tag_set(&nfsi->nfs_page_tree, req->wb_index,
373 return 0; 371 NFS_PAGE_TAG_LOCKED);
374} 372}
375 373
376/* 374/*
@@ -582,6 +580,13 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
582 /* Loop over all inode entries and see if we find 580 /* Loop over all inode entries and see if we find
583 * A request for the page we wish to update 581 * A request for the page we wish to update
584 */ 582 */
583 if (new) {
584 if (radix_tree_preload(GFP_NOFS)) {
585 nfs_release_request(new);
586 return ERR_PTR(-ENOMEM);
587 }
588 }
589
585 spin_lock(&inode->i_lock); 590 spin_lock(&inode->i_lock);
586 req = nfs_page_find_request_locked(page); 591 req = nfs_page_find_request_locked(page);
587 if (req) { 592 if (req) {
@@ -592,28 +597,27 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
592 error = nfs_wait_on_request(req); 597 error = nfs_wait_on_request(req);
593 nfs_release_request(req); 598 nfs_release_request(req);
594 if (error < 0) { 599 if (error < 0) {
595 if (new) 600 if (new) {
601 radix_tree_preload_end();
596 nfs_release_request(new); 602 nfs_release_request(new);
603 }
597 return ERR_PTR(error); 604 return ERR_PTR(error);
598 } 605 }
599 continue; 606 continue;
600 } 607 }
601 spin_unlock(&inode->i_lock); 608 spin_unlock(&inode->i_lock);
602 if (new) 609 if (new) {
610 radix_tree_preload_end();
603 nfs_release_request(new); 611 nfs_release_request(new);
612 }
604 break; 613 break;
605 } 614 }
606 615
607 if (new) { 616 if (new) {
608 int error;
609 nfs_lock_request_dontget(new); 617 nfs_lock_request_dontget(new);
610 error = nfs_inode_add_request(inode, new); 618 nfs_inode_add_request(inode, new);
611 if (error) {
612 spin_unlock(&inode->i_lock);
613 nfs_unlock_request(new);
614 return ERR_PTR(error);
615 }
616 spin_unlock(&inode->i_lock); 619 spin_unlock(&inode->i_lock);
620 radix_tree_preload_end();
617 req = new; 621 req = new;
618 goto zero_page; 622 goto zero_page;
619 } 623 }