Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'nfs-for-3.2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs

* 'nfs-for-3.2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (26 commits)
Check validity of cl_rpcclient in nfs_server_list_show
NFS: Get rid of the nfs_rdata_mempool
NFS: Don't rely on PageError in nfs_readpage_release_partial
NFS: Get rid of unnecessary calls to ClearPageError() in read code
NFS: Get rid of nfs_restart_rpc()
NFS: Get rid of the unused nfs_write_data->flags field
NFS: Get rid of the unused nfs_read_data->flags field
NFSv4: Translate NFS4ERR_BADNAME into ENOENT when applied to a lookup
NFS: Remove the unused "lookupfh()" version of nfs4_proc_lookup()
NFS: Use the inode->i_version to cache NFSv4 change attribute information
SUNRPC: Remove unnecessary export of rpc_sockaddr2uaddr
SUNRPC: Fix rpc_sockaddr2uaddr
nfs/super.c: local functions should be static
pnfsblock: fix writeback deadlock
pnfsblock: fix NULL pointer dereference
pnfs: recoalesce when ld read pagelist fails
pnfs: recoalesce when ld write pagelist fails
pnfs: make _set_lo_fail generic
pnfsblock: add missing rpc_put_mount and path_put
SUNRPC/NFS: make rpc pipe upcall generic
...

+238 -309
+31 -27
fs/nfs/blocklayout/blocklayout.c
··· 176 176 return bio; 177 177 } 178 178 179 - static void bl_set_lo_fail(struct pnfs_layout_segment *lseg) 180 - { 181 - if (lseg->pls_range.iomode == IOMODE_RW) { 182 - dprintk("%s Setting layout IOMODE_RW fail bit\n", __func__); 183 - set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags); 184 - } else { 185 - dprintk("%s Setting layout IOMODE_READ fail bit\n", __func__); 186 - set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags); 187 - } 188 - } 189 - 190 179 /* This is basically copied from mpage_end_io_read */ 191 180 static void bl_end_io_read(struct bio *bio, int err) 192 181 { ··· 195 206 if (!uptodate) { 196 207 if (!rdata->pnfs_error) 197 208 rdata->pnfs_error = -EIO; 198 - bl_set_lo_fail(rdata->lseg); 209 + pnfs_set_lo_fail(rdata->lseg); 199 210 } 200 211 bio_put(bio); 201 212 put_parallel(par); ··· 292 303 bl_end_io_read, par); 293 304 if (IS_ERR(bio)) { 294 305 rdata->pnfs_error = PTR_ERR(bio); 306 + bio = NULL; 295 307 goto out; 296 308 } 297 309 } ··· 360 370 if (!uptodate) { 361 371 if (!wdata->pnfs_error) 362 372 wdata->pnfs_error = -EIO; 363 - bl_set_lo_fail(wdata->lseg); 373 + pnfs_set_lo_fail(wdata->lseg); 364 374 } 365 375 bio_put(bio); 366 376 put_parallel(par); ··· 376 386 if (!uptodate) { 377 387 if (!wdata->pnfs_error) 378 388 wdata->pnfs_error = -EIO; 379 - bl_set_lo_fail(wdata->lseg); 389 + pnfs_set_lo_fail(wdata->lseg); 380 390 } 381 391 bio_put(bio); 382 392 put_parallel(par); ··· 533 543 fill_invalid_ext: 534 544 dprintk("%s need to zero %d pages\n", __func__, npg_zero); 535 545 for (;npg_zero > 0; npg_zero--) { 546 + if (bl_is_sector_init(be->be_inval, isect)) { 547 + dprintk("isect %llu already init\n", 548 + (unsigned long long)isect); 549 + goto next_page; 550 + } 536 551 /* page ref released in bl_end_io_write_zero */ 537 552 index = isect >> PAGE_CACHE_SECTOR_SHIFT; 538 553 dprintk("%s zero %dth page: index %lu isect %llu\n", ··· 557 562 * PageUptodate: It was read before 558 563 * sector_initialized: already written out 559 564 */ 560 - if (PageDirty(page) || PageWriteback(page) || 561 - bl_is_sector_init(be->be_inval, isect)) { 565 + if (PageDirty(page) || PageWriteback(page)) { 562 566 print_page(page); 563 567 unlock_page(page); 564 568 page_cache_release(page); ··· 586 592 bl_end_io_write_zero, par); 587 593 if (IS_ERR(bio)) { 588 594 wdata->pnfs_error = PTR_ERR(bio); 595 + bio = NULL; 589 596 goto out; 590 597 } 591 598 /* FIXME: This should be done in bi_end_io */ ··· 635 640 bl_end_io_write, par); 636 641 if (IS_ERR(bio)) { 637 642 wdata->pnfs_error = PTR_ERR(bio); 643 + bio = NULL; 638 644 goto out; 639 645 } 640 646 isect += PAGE_CACHE_SECTORS; ··· 801 805 struct nfs4_deviceid *d_id) 802 806 { 803 807 struct pnfs_device *dev; 804 - struct pnfs_block_dev *rv = NULL; 808 + struct pnfs_block_dev *rv; 805 809 u32 max_resp_sz; 806 810 int max_pages; 807 811 struct page **pages = NULL; ··· 819 823 dev = kmalloc(sizeof(*dev), GFP_NOFS); 820 824 if (!dev) { 821 825 dprintk("%s kmalloc failed\n", __func__); 822 - return NULL; 826 + return ERR_PTR(-ENOMEM); 823 827 } 824 828 825 829 pages = kzalloc(max_pages * sizeof(struct page *), GFP_NOFS); 826 830 if (pages == NULL) { 827 831 kfree(dev); 828 - return NULL; 832 + return ERR_PTR(-ENOMEM); 829 833 } 830 834 for (i = 0; i < max_pages; i++) { 831 835 pages[i] = alloc_page(GFP_NOFS); 832 - if (!pages[i]) 836 + if (!pages[i]) { 837 + rv = ERR_PTR(-ENOMEM); 833 838 goto out_free; 839 + } 834 840 } 835 841 836 842 memcpy(&dev->dev_id, d_id, sizeof(*d_id)); ··· 845 847 dprintk("%s: dev_id: %s\n", __func__, dev->dev_id.data); 846 848 rc = nfs4_proc_getdeviceinfo(server, dev); 847 849 dprintk("%s getdevice info returns %d\n", __func__, rc); 848 - if (rc) 850 + if (rc) { 851 + rv = ERR_PTR(rc); 849 852 goto out_free; 853 + } 850 854 851 855 rv = nfs4_blk_decode_device(server, dev); 852 856 out_free: ··· 866 866 struct pnfs_devicelist *dlist = NULL; 867 867 struct pnfs_block_dev *bdev; 868 868 LIST_HEAD(block_disklist); 869 - int status = 0, i; 869 + int status, i; 870 870 871 871 dprintk("%s enter\n", __func__); 872 872 ··· 898 898 for (i = 0; i < dlist->num_devs; i++) { 899 899 bdev = nfs4_blk_get_deviceinfo(server, fh, 900 900 &dlist->dev_id[i]); 901 - if (!bdev) { 902 - status = -ENODEV; 901 + if (IS_ERR(bdev)) { 902 + status = PTR_ERR(bdev); 903 903 goto out_error; 904 904 } 905 905 spin_lock(&b_mt_id->bm_lock); ··· 960 960 }; 961 961 962 962 static const struct rpc_pipe_ops bl_upcall_ops = { 963 - .upcall = bl_pipe_upcall, 963 + .upcall = rpc_pipe_generic_upcall, 964 964 .downcall = bl_pipe_downcall, 965 965 .destroy_msg = bl_pipe_destroy_msg, 966 966 }; ··· 989 989 mnt, 990 990 NFS_PIPE_DIRNAME, 0, &path); 991 991 if (ret) 992 - goto out_remove; 992 + goto out_putrpc; 993 993 994 994 bl_device_pipe = rpc_mkpipe(path.dentry, "blocklayout", NULL, 995 995 &bl_upcall_ops, 0); 996 + path_put(&path); 996 997 if (IS_ERR(bl_device_pipe)) { 997 998 ret = PTR_ERR(bl_device_pipe); 998 - goto out_remove; 999 + goto out_putrpc; 999 1000 } 1000 1001 out: 1001 1002 return ret; 1002 1003 1004 + out_putrpc: 1005 + rpc_put_mount(); 1003 1006 out_remove: 1004 1007 pnfs_unregister_layoutdriver(&blocklayout_type); 1005 1008 return ret; ··· 1015 1012 1016 1013 pnfs_unregister_layoutdriver(&blocklayout_type); 1017 1014 rpc_unlink(bl_device_pipe); 1015 + rpc_put_mount(); 1018 1016 } 1019 1017 1020 1018 MODULE_ALIAS("nfs-layouttype4-3");
+1 -3
fs/nfs/blocklayout/blocklayout.h
··· 150 150 } 151 151 152 152 struct bl_dev_msg { 153 - int status; 153 + int32_t status; 154 154 uint32_t major, minor; 155 155 }; 156 156 ··· 169 169 #define BL_DEVICE_REQUEST_ERR 0x2 /* User level process fails */ 170 170 171 171 /* blocklayoutdev.c */ 172 - ssize_t bl_pipe_upcall(struct file *, struct rpc_pipe_msg *, 173 - char __user *, size_t); 174 172 ssize_t bl_pipe_downcall(struct file *, const char __user *, size_t); 175 173 void bl_pipe_destroy_msg(struct rpc_pipe_msg *); 176 174 struct block_device *nfs4_blkdev_get(dev_t dev);
+8 -27
fs/nfs/blocklayout/blocklayoutdev.c
··· 79 79 return blkdev_put(bdev, FMODE_READ); 80 80 } 81 81 82 - /* 83 - * Shouldn't there be a rpc_generic_upcall() to do this for us? 84 - */ 85 - ssize_t bl_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, 86 - char __user *dst, size_t buflen) 87 - { 88 - char *data = (char *)msg->data + msg->copied; 89 - size_t mlen = min(msg->len - msg->copied, buflen); 90 - unsigned long left; 91 - 92 - left = copy_to_user(dst, data, mlen); 93 - if (left == mlen) { 94 - msg->errno = -EFAULT; 95 - return -EFAULT; 96 - } 97 - 98 - mlen -= left; 99 - msg->copied += mlen; 100 - msg->errno = 0; 101 - return mlen; 102 - } 103 - 104 82 static struct bl_dev_msg bl_mount_reply; 105 83 106 84 ssize_t bl_pipe_downcall(struct file *filp, const char __user *src, ··· 109 131 nfs4_blk_decode_device(struct nfs_server *server, 110 132 struct pnfs_device *dev) 111 133 { 112 - struct pnfs_block_dev *rv = NULL; 134 + struct pnfs_block_dev *rv; 113 135 struct block_device *bd = NULL; 114 136 struct rpc_pipe_msg msg; 115 137 struct bl_msg_hdr bl_msg = { ··· 119 141 uint8_t *dataptr; 120 142 DECLARE_WAITQUEUE(wq, current); 121 143 struct bl_dev_msg *reply = &bl_mount_reply; 122 - int offset, len, i; 144 + int offset, len, i, rc; 123 145 124 146 dprintk("%s CREATING PIPEFS MESSAGE\n", __func__); 125 147 dprintk("%s: deviceid: %s, mincount: %d\n", __func__, dev->dev_id.data, ··· 146 168 147 169 dprintk("%s CALLING USERSPACE DAEMON\n", __func__); 148 170 add_wait_queue(&bl_wq, &wq); 149 - if (rpc_queue_upcall(bl_device_pipe->d_inode, &msg) < 0) { 171 + rc = rpc_queue_upcall(bl_device_pipe->d_inode, &msg); 172 + if (rc < 0) { 150 173 remove_wait_queue(&bl_wq, &wq); 174 + rv = ERR_PTR(rc); 151 175 goto out; 152 176 } 153 177 ··· 167 187 168 188 bd = nfs4_blkdev_get(MKDEV(reply->major, reply->minor)); 169 189 if (IS_ERR(bd)) { 170 - dprintk("%s failed to open device : %ld\n", 171 - __func__, PTR_ERR(bd)); 190 + rc = PTR_ERR(bd); 191 + dprintk("%s failed to open device : %d\n", __func__, rc); 192 + rv = ERR_PTR(rc); 172 193 goto out; 173 194 } 174 195
+4
fs/nfs/client.c
··· 1868 1868 /* display one transport per line on subsequent lines */ 1869 1869 clp = list_entry(v, struct nfs_client, cl_share_link); 1870 1870 1871 + /* Check if the client is initialized */ 1872 + if (clp->cl_cons_state != NFS_CS_READY) 1873 + return 0; 1874 + 1871 1875 seq_printf(m, "v%u %s %s %3d %s\n", 1872 1876 clp->rpc_ops->version, 1873 1877 rpc_peeraddr2str(clp->cl_rpcclient, RPC_DISPLAY_HEX_ADDR),
+1 -1
fs/nfs/delegation.c
··· 240 240 sizeof(delegation->stateid.data)); 241 241 delegation->type = res->delegation_type; 242 242 delegation->maxsize = res->maxsize; 243 - delegation->change_attr = nfsi->change_attr; 243 + delegation->change_attr = inode->i_version; 244 244 delegation->cred = get_rpccred(cred); 245 245 delegation->inode = inode; 246 246 delegation->flags = 1<<NFS_DELEGATION_REFERENCED;
+2 -2
fs/nfs/fscache-index.c
··· 212 212 auxdata.ctime = nfsi->vfs_inode.i_ctime; 213 213 214 214 if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4) 215 - auxdata.change_attr = nfsi->change_attr; 215 + auxdata.change_attr = nfsi->vfs_inode.i_version; 216 216 217 217 if (bufmax > sizeof(auxdata)) 218 218 bufmax = sizeof(auxdata); ··· 244 244 auxdata.ctime = nfsi->vfs_inode.i_ctime; 245 245 246 246 if (NFS_SERVER(&nfsi->vfs_inode)->nfs_client->rpc_ops->version == 4) 247 - auxdata.change_attr = nfsi->change_attr; 247 + auxdata.change_attr = nfsi->vfs_inode.i_version; 248 248 249 249 if (memcmp(data, &auxdata, datalen) != 0) 250 250 return FSCACHE_CHECKAUX_OBSOLETE;
+1 -24
fs/nfs/idmap.c
··· 336 336 struct idmap_hashtable idmap_group_hash; 337 337 }; 338 338 339 - static ssize_t idmap_pipe_upcall(struct file *, struct rpc_pipe_msg *, 340 - char __user *, size_t); 341 339 static ssize_t idmap_pipe_downcall(struct file *, const char __user *, 342 340 size_t); 343 341 static void idmap_pipe_destroy_msg(struct rpc_pipe_msg *); ··· 343 345 static unsigned int fnvhash32(const void *, size_t); 344 346 345 347 static const struct rpc_pipe_ops idmap_upcall_ops = { 346 - .upcall = idmap_pipe_upcall, 348 + .upcall = rpc_pipe_generic_upcall, 347 349 .downcall = idmap_pipe_downcall, 348 350 .destroy_msg = idmap_pipe_destroy_msg, 349 351 }; ··· 591 593 mutex_unlock(&idmap->idmap_im_lock); 592 594 mutex_unlock(&idmap->idmap_lock); 593 595 return ret; 594 - } 595 - 596 - /* RPC pipefs upcall/downcall routines */ 597 - static ssize_t 598 - idmap_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, 599 - char __user *dst, size_t buflen) 600 - { 601 - char *data = (char *)msg->data + msg->copied; 602 - size_t mlen = min(msg->len, buflen); 603 - unsigned long left; 604 - 605 - left = copy_to_user(dst, data, mlen); 606 - if (left == mlen) { 607 - msg->errno = -EFAULT; 608 - return -EFAULT; 609 - } 610 - 611 - mlen -= left; 612 - msg->copied += mlen; 613 - msg->errno = 0; 614 - return mlen; 615 596 } 616 597 617 598 static ssize_t
+8 -8
fs/nfs/inode.c
··· 318 318 memset(&inode->i_atime, 0, sizeof(inode->i_atime)); 319 319 memset(&inode->i_mtime, 0, sizeof(inode->i_mtime)); 320 320 memset(&inode->i_ctime, 0, sizeof(inode->i_ctime)); 321 - nfsi->change_attr = 0; 321 + inode->i_version = 0; 322 322 inode->i_size = 0; 323 323 inode->i_nlink = 0; 324 324 inode->i_uid = -2; ··· 344 344 | NFS_INO_INVALID_ACCESS 345 345 | NFS_INO_INVALID_ACL; 346 346 if (fattr->valid & NFS_ATTR_FATTR_CHANGE) 347 - nfsi->change_attr = fattr->change_attr; 347 + inode->i_version = fattr->change_attr; 348 348 else if (nfs_server_capable(inode, NFS_CAP_CHANGE_ATTR)) 349 349 nfsi->cache_validity |= NFS_INO_INVALID_ATTR 350 350 | NFS_INO_INVALID_DATA; ··· 897 897 898 898 if ((fattr->valid & NFS_ATTR_FATTR_PRECHANGE) 899 899 && (fattr->valid & NFS_ATTR_FATTR_CHANGE) 900 - && nfsi->change_attr == fattr->pre_change_attr) { 901 - nfsi->change_attr = fattr->change_attr; 900 + && inode->i_version == fattr->pre_change_attr) { 901 + inode->i_version = fattr->change_attr; 902 902 if (S_ISDIR(inode->i_mode)) 903 903 nfsi->cache_validity |= NFS_INO_INVALID_DATA; 904 904 ret |= NFS_INO_INVALID_ATTR; ··· 952 952 return -EIO; 953 953 954 954 if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 && 955 - nfsi->change_attr != fattr->change_attr) 955 + inode->i_version != fattr->change_attr) 956 956 invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE; 957 957 958 958 /* Verify a few of the more important attributes */ ··· 1163 1163 } 1164 1164 if ((fattr->valid & NFS_ATTR_FATTR_CHANGE) != 0 && 1165 1165 (fattr->valid & NFS_ATTR_FATTR_PRECHANGE) == 0) { 1166 - fattr->pre_change_attr = NFS_I(inode)->change_attr; 1166 + fattr->pre_change_attr = inode->i_version; 1167 1167 fattr->valid |= NFS_ATTR_FATTR_PRECHANGE; 1168 1168 } 1169 1169 if ((fattr->valid & NFS_ATTR_FATTR_CTIME) != 0 && ··· 1244 1244 1245 1245 /* More cache consistency checks */ 1246 1246 if (fattr->valid & NFS_ATTR_FATTR_CHANGE) { 1247 - if (nfsi->change_attr != fattr->change_attr) { 1247 + if (inode->i_version != fattr->change_attr) { 1248 1248 dprintk("NFS: change_attr change on server for file %s/%ld\n", 1249 1249 inode->i_sb->s_id, inode->i_ino); 1250 1250 invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA|NFS_INO_INVALID_ACCESS|NFS_INO_INVALID_ACL; 1251 1251 if (S_ISDIR(inode->i_mode)) 1252 1252 nfs_force_lookup_revalidate(inode); 1253 - nfsi->change_attr = fattr->change_attr; 1253 + inode->i_version = fattr->change_attr; 1254 1254 } 1255 1255 } else if (server->caps & NFS_CAP_CHANGE_ATTR) 1256 1256 invalid |= save_cache_validity;
-10
fs/nfs/internal.h
··· 457 457 PAGE_SIZE - 1) >> PAGE_SHIFT; 458 458 } 459 459 460 - /* 461 - * Helper for restarting RPC calls in the possible presence of NFSv4.1 462 - * sessions. 463 - */ 464 - static inline int nfs_restart_rpc(struct rpc_task *task, const struct nfs_client *clp) 465 - { 466 - if (nfs4_has_session(clp)) 467 - return rpc_restart_call_prepare(task); 468 - return rpc_restart_call(task); 469 - }
+7 -26
fs/nfs/nfs4filelayout.c
··· 77 77 BUG(); 78 78 } 79 79 80 - /* For data server errors we don't recover from */ 81 - static void 82 - filelayout_set_lo_fail(struct pnfs_layout_segment *lseg) 83 - { 84 - if (lseg->pls_range.iomode == IOMODE_RW) { 85 - dprintk("%s Setting layout IOMODE_RW fail bit\n", __func__); 86 - set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags); 87 - } else { 88 - dprintk("%s Setting layout IOMODE_READ fail bit\n", __func__); 89 - set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags); 90 - } 91 - } 92 - 93 80 static int filelayout_async_handle_error(struct rpc_task *task, 94 81 struct nfs4_state *state, 95 82 struct nfs_client *clp, ··· 122 135 static int filelayout_read_done_cb(struct rpc_task *task, 123 136 struct nfs_read_data *data) 124 137 { 125 - struct nfs_client *clp = data->ds_clp; 126 138 int reset = 0; 127 139 128 140 dprintk("%s DS read\n", __func__); ··· 131 145 dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", 132 146 __func__, data->ds_clp, data->ds_clp->cl_session); 133 147 if (reset) { 134 - filelayout_set_lo_fail(data->lseg); 148 + pnfs_set_lo_fail(data->lseg); 135 149 nfs4_reset_read(task, data); 136 - clp = NFS_SERVER(data->inode)->nfs_client; 137 150 } 138 - nfs_restart_rpc(task, clp); 151 + rpc_restart_call_prepare(task); 139 152 return -EAGAIN; 140 153 } 141 154 ··· 201 216 202 217 if (filelayout_async_handle_error(task, data->args.context->state, 203 218 data->ds_clp, &reset) == -EAGAIN) { 204 - struct nfs_client *clp; 205 - 206 219 dprintk("%s calling restart ds_clp %p ds_clp->cl_session %p\n", 207 220 __func__, data->ds_clp, data->ds_clp->cl_session); 208 221 if (reset) { 209 - filelayout_set_lo_fail(data->lseg); 222 + pnfs_set_lo_fail(data->lseg); 210 223 nfs4_reset_write(task, data); 211 - clp = NFS_SERVER(data->inode)->nfs_client; 212 - } else 213 - clp = data->ds_clp; 214 - nfs_restart_rpc(task, clp); 224 + } 225 + rpc_restart_call_prepare(task); 215 226 return -EAGAIN; 216 227 } 217 228 ··· 237 256 __func__, data->ds_clp, data->ds_clp->cl_session); 238 257 if (reset) { 239 258 prepare_to_resend_writes(data); 240 - filelayout_set_lo_fail(data->lseg); 259 + pnfs_set_lo_fail(data->lseg); 241 260 } else 242 - nfs_restart_rpc(task, data->ds_clp); 261 + rpc_restart_call_prepare(task); 243 262 return -EAGAIN; 244 263 } 245 264
+36 -57
fs/nfs/nfs4proc.c
··· 73 73 static int _nfs4_recover_proc_open(struct nfs4_opendata *data); 74 74 static int nfs4_do_fsinfo(struct nfs_server *, struct nfs_fh *, struct nfs_fsinfo *); 75 75 static int nfs4_async_handle_error(struct rpc_task *, const struct nfs_server *, struct nfs4_state *); 76 - static int _nfs4_proc_lookup(struct rpc_clnt *client, struct inode *dir, 77 - const struct qstr *name, struct nfs_fh *fhandle, 78 - struct nfs_fattr *fattr); 79 76 static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs_fattr *fattr); 80 77 static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, 81 78 struct nfs_fattr *fattr, struct iattr *sattr, ··· 750 753 751 754 spin_lock(&dir->i_lock); 752 755 nfsi->cache_validity |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA; 753 - if (!cinfo->atomic || cinfo->before != nfsi->change_attr) 756 + if (!cinfo->atomic || cinfo->before != dir->i_version) 754 757 nfs_force_lookup_revalidate(dir); 755 - nfsi->change_attr = cinfo->after; 758 + dir->i_version = cinfo->after; 756 759 spin_unlock(&dir->i_lock); 757 760 } 758 761 ··· 1593 1596 int status; 1594 1597 1595 1598 status = nfs4_run_open_task(data, 0); 1596 - if (status != 0 || !data->rpc_done) 1599 + if (!data->rpc_done) 1597 1600 return status; 1601 + if (status != 0) { 1602 + if (status == -NFS4ERR_BADNAME && 1603 + !(o_arg->open_flags & O_CREAT)) 1604 + return -ENOENT; 1605 + return status; 1606 + } 1598 1607 1599 1608 if (o_arg->open_flags & O_CREAT) { 1600 1609 update_changeattr(dir, &o_res->cinfo); ··· 2411 2408 return status; 2412 2409 } 2413 2410 2414 - static int _nfs4_proc_lookupfh(struct rpc_clnt *clnt, struct nfs_server *server, 2415 - const struct nfs_fh *dirfh, const struct qstr *name, 2416 - struct nfs_fh *fhandle, struct nfs_fattr *fattr) 2411 + static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, 2412 + const struct qstr *name, struct nfs_fh *fhandle, 2413 + struct nfs_fattr *fattr) 2417 2414 { 2415 + struct nfs_server *server = NFS_SERVER(dir); 2418 2416 int status; 2419 2417 struct nfs4_lookup_arg args = { 2420 2418 .bitmask = server->attr_bitmask, 2421 - .dir_fh = dirfh, 2419 + .dir_fh = NFS_FH(dir), 2422 2420 .name = name, 2423 2421 }; 2424 2422 struct nfs4_lookup_res res = { ··· 2435 2431 2436 2432 nfs_fattr_init(fattr); 2437 2433 2438 - dprintk("NFS call lookupfh %s\n", name->name); 2439 - status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0); 2440 - dprintk("NFS reply lookupfh: %d\n", status); 2441 - return status; 2442 - } 2443 - 2444 - static int nfs4_proc_lookupfh(struct nfs_server *server, struct nfs_fh *dirfh, 2445 - struct qstr *name, struct nfs_fh *fhandle, 2446 - struct nfs_fattr *fattr) 2447 - { 2448 - struct nfs4_exception exception = { }; 2449 - int err; 2450 - do { 2451 - err = _nfs4_proc_lookupfh(server->client, server, dirfh, name, fhandle, fattr); 2452 - /* FIXME: !!!! */ 2453 - if (err == -NFS4ERR_MOVED) { 2454 - err = -EREMOTE; 2455 - break; 2456 - } 2457 - err = nfs4_handle_exception(server, err, &exception); 2458 - } while (exception.retry); 2459 - return err; 2460 - } 2461 - 2462 - static int _nfs4_proc_lookup(struct rpc_clnt *clnt, struct inode *dir, 2463 - const struct qstr *name, struct nfs_fh *fhandle, 2464 - struct nfs_fattr *fattr) 2465 - { 2466 - int status; 2467 - 2468 2434 dprintk("NFS call lookup %s\n", name->name); 2469 - status = _nfs4_proc_lookupfh(clnt, NFS_SERVER(dir), NFS_FH(dir), name, fhandle, fattr); 2470 - if (status == -NFS4ERR_MOVED) 2471 - status = nfs4_get_referral(dir, name, fattr, fhandle); 2435 + status = nfs4_call_sync(clnt, server, &msg, &args.seq_args, &res.seq_res, 0); 2472 2436 dprintk("NFS reply lookup: %d\n", status); 2473 2437 return status; 2474 2438 } ··· 2457 2485 struct nfs4_exception exception = { }; 2458 2486 int err; 2459 2487 do { 2460 - err = nfs4_handle_exception(NFS_SERVER(dir), 2461 - _nfs4_proc_lookup(clnt, dir, name, fhandle, fattr), 2462 - &exception); 2463 - if (err == -EPERM) 2488 + int status; 2489 + 2490 + status = _nfs4_proc_lookup(clnt, dir, name, fhandle, fattr); 2491 + switch (status) { 2492 + case -NFS4ERR_BADNAME: 2493 + return -ENOENT; 2494 + case -NFS4ERR_MOVED: 2495 + err = nfs4_get_referral(dir, name, fattr, fhandle); 2496 + break; 2497 + case -NFS4ERR_WRONGSEC: 2464 2498 nfs_fixup_secinfo_attributes(fattr, fhandle); 2499 + } 2500 + err = nfs4_handle_exception(NFS_SERVER(dir), 2501 + status, &exception); 2465 2502 } while (exception.retry); 2466 2503 return err; 2467 2504 } ··· 3191 3210 struct nfs_server *server = NFS_SERVER(data->inode); 3192 3211 3193 3212 if (nfs4_async_handle_error(task, server, data->args.context->state) == -EAGAIN) { 3194 - nfs_restart_rpc(task, server->nfs_client); 3213 + rpc_restart_call_prepare(task); 3195 3214 return -EAGAIN; 3196 3215 } 3197 3216 ··· 3241 3260 struct inode *inode = data->inode; 3242 3261 3243 3262 if (nfs4_async_handle_error(task, NFS_SERVER(inode), data->args.context->state) == -EAGAIN) { 3244 - nfs_restart_rpc(task, NFS_SERVER(inode)->nfs_client); 3263 + rpc_restart_call_prepare(task); 3245 3264 return -EAGAIN; 3246 3265 } 3247 3266 if (task->tk_status >= 0) { ··· 3298 3317 struct inode *inode = data->inode; 3299 3318 3300 3319 if (nfs4_async_handle_error(task, NFS_SERVER(inode), NULL) == -EAGAIN) { 3301 - nfs_restart_rpc(task, NFS_SERVER(inode)->nfs_client); 3320 + rpc_restart_call_prepare(task); 3302 3321 return -EAGAIN; 3303 3322 } 3304 3323 nfs_refresh_inode(inode, data->res.fattr); ··· 3838 3857 default: 3839 3858 if (nfs4_async_handle_error(task, data->res.server, NULL) == 3840 3859 -EAGAIN) { 3841 - nfs_restart_rpc(task, data->res.server->nfs_client); 3860 + rpc_restart_call_prepare(task); 3842 3861 return; 3843 3862 } 3844 3863 } ··· 4092 4111 break; 4093 4112 default: 4094 4113 if (nfs4_async_handle_error(task, calldata->server, NULL) == -EAGAIN) 4095 - nfs_restart_rpc(task, 4096 - calldata->server->nfs_client); 4114 + rpc_restart_call_prepare(task); 4097 4115 } 4098 4116 } 4099 4117 ··· 4925 4945 task->tk_status = 0; 4926 4946 /* fall through */ 4927 4947 case -NFS4ERR_RETRY_UNCACHED_REP: 4928 - nfs_restart_rpc(task, data->clp); 4948 + rpc_restart_call_prepare(task); 4929 4949 return; 4930 4950 } 4931 4951 dprintk("<-- %s\n", __func__); ··· 5766 5786 5767 5787 server = NFS_SERVER(lrp->args.inode); 5768 5788 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { 5769 - nfs_restart_rpc(task, lrp->clp); 5789 + rpc_restart_call_prepare(task); 5770 5790 return; 5771 5791 } 5772 5792 spin_lock(&lo->plh_inode->i_lock); ··· 5937 5957 } 5938 5958 5939 5959 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { 5940 - nfs_restart_rpc(task, server->nfs_client); 5960 + rpc_restart_call_prepare(task); 5941 5961 return; 5942 5962 } 5943 5963 ··· 6250 6270 .getroot = nfs4_proc_get_root, 6251 6271 .getattr = nfs4_proc_getattr, 6252 6272 .setattr = nfs4_proc_setattr, 6253 - .lookupfh = nfs4_proc_lookupfh, 6254 6273 .lookup = nfs4_proc_lookup, 6255 6274 .access = nfs4_proc_access, 6256 6275 .readlink = nfs4_proc_readlink,
+26 -26
fs/nfs/pnfs.c
··· 1168 1168 /* 1169 1169 * Called by non rpc-based layout drivers 1170 1170 */ 1171 - int 1172 - pnfs_ld_write_done(struct nfs_write_data *data) 1171 + void pnfs_ld_write_done(struct nfs_write_data *data) 1173 1172 { 1174 - int status; 1175 - 1176 - if (!data->pnfs_error) { 1173 + if (likely(!data->pnfs_error)) { 1177 1174 pnfs_set_layoutcommit(data); 1178 1175 data->mds_ops->rpc_call_done(&data->task, data); 1179 - data->mds_ops->rpc_release(data); 1180 - return 0; 1176 + } else { 1177 + put_lseg(data->lseg); 1178 + data->lseg = NULL; 1179 + dprintk("pnfs write error = %d\n", data->pnfs_error); 1181 1180 } 1182 - 1183 - dprintk("%s: pnfs_error=%d, retry via MDS\n", __func__, 1184 - data->pnfs_error); 1185 - status = nfs_initiate_write(data, NFS_CLIENT(data->inode), 1186 - data->mds_ops, NFS_FILE_SYNC); 1187 - return status ? : -EAGAIN; 1181 + data->mds_ops->rpc_release(data); 1188 1182 } 1189 1183 EXPORT_SYMBOL_GPL(pnfs_ld_write_done); 1190 1184 ··· 1262 1268 /* 1263 1269 * Called by non rpc-based layout drivers 1264 1270 */ 1265 - int 1266 - pnfs_ld_read_done(struct nfs_read_data *data) 1271 + void pnfs_ld_read_done(struct nfs_read_data *data) 1267 1272 { 1268 - int status; 1269 - 1270 - if (!data->pnfs_error) { 1273 + if (likely(!data->pnfs_error)) { 1271 1274 __nfs4_read_done_cb(data); 1272 1275 data->mds_ops->rpc_call_done(&data->task, data); 1273 - data->mds_ops->rpc_release(data); 1274 - return 0; 1276 + } else { 1277 + put_lseg(data->lseg); 1278 + data->lseg = NULL; 1279 + dprintk("pnfs write error = %d\n", data->pnfs_error); 1275 1280 } 1276 - 1277 - dprintk("%s: pnfs_error=%d, retry via MDS\n", __func__, 1278 - data->pnfs_error); 1279 - status = nfs_initiate_read(data, NFS_CLIENT(data->inode), 1280 - data->mds_ops); 1281 - return status ? : -EAGAIN; 1281 + data->mds_ops->rpc_release(data); 1282 1282 } 1283 1283 EXPORT_SYMBOL_GPL(pnfs_ld_read_done); 1284 1284 ··· 1368 1380 list_add(&lseg->pls_lc_list, listp); 1369 1381 } 1370 1382 } 1383 + 1384 + void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg) 1385 + { 1386 + if (lseg->pls_range.iomode == IOMODE_RW) { 1387 + dprintk("%s Setting layout IOMODE_RW fail bit\n", __func__); 1388 + set_bit(lo_fail_bit(IOMODE_RW), &lseg->pls_layout->plh_flags); 1389 + } else { 1390 + dprintk("%s Setting layout IOMODE_READ fail bit\n", __func__); 1391 + set_bit(lo_fail_bit(IOMODE_READ), &lseg->pls_layout->plh_flags); 1392 + } 1393 + } 1394 + EXPORT_SYMBOL_GPL(pnfs_set_lo_fail); 1371 1395 1372 1396 void 1373 1397 pnfs_set_layoutcommit(struct nfs_write_data *wdata)
+3 -2
fs/nfs/pnfs.h
··· 178 178 void pnfs_generic_pg_init_write(struct nfs_pageio_descriptor *, struct nfs_page *); 179 179 int pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc); 180 180 bool pnfs_generic_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev, struct nfs_page *req); 181 + void pnfs_set_lo_fail(struct pnfs_layout_segment *lseg); 181 182 int pnfs_layout_process(struct nfs4_layoutget *lgp); 182 183 void pnfs_free_lseg_list(struct list_head *tmp_list); 183 184 void pnfs_destroy_layout(struct nfs_inode *); ··· 201 200 void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data); 202 201 int pnfs_layoutcommit_inode(struct inode *inode, bool sync); 203 202 int _pnfs_return_layout(struct inode *); 204 - int pnfs_ld_write_done(struct nfs_write_data *); 205 - int pnfs_ld_read_done(struct nfs_read_data *); 203 + void pnfs_ld_write_done(struct nfs_write_data *); 204 + void pnfs_ld_read_done(struct nfs_read_data *); 206 205 struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino, 207 206 struct nfs_open_context *ctx, 208 207 loff_t pos,
+18 -22
fs/nfs/read.c
··· 35 35 static const struct rpc_call_ops nfs_read_full_ops; 36 36 37 37 static struct kmem_cache *nfs_rdata_cachep; 38 - static mempool_t *nfs_rdata_mempool; 39 - 40 - #define MIN_POOL_READ (32) 41 38 42 39 struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) 43 40 { 44 - struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, GFP_KERNEL); 41 + struct nfs_read_data *p; 45 42 43 + p = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL); 46 44 if (p) { 47 - memset(p, 0, sizeof(*p)); 48 45 INIT_LIST_HEAD(&p->pages); 49 46 p->npages = pagecount; 50 47 if (pagecount <= ARRAY_SIZE(p->page_array)) ··· 49 52 else { 50 53 p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_KERNEL); 51 54 if (!p->pagevec) { 52 - mempool_free(p, nfs_rdata_mempool); 55 + kmem_cache_free(nfs_rdata_cachep, p); 53 56 p = NULL; 54 57 } 55 58 } ··· 61 64 { 62 65 if (p && (p->pagevec != &p->page_array[0])) 63 66 kfree(p->pagevec); 64 - mempool_free(p, nfs_rdata_mempool); 67 + kmem_cache_free(nfs_rdata_cachep, p); 65 68 } 66 69 67 70 void nfs_readdata_release(struct nfs_read_data *rdata) ··· 273 276 while (!list_empty(head)) { 274 277 req = nfs_list_entry(head->next); 275 278 nfs_list_remove_request(req); 276 - SetPageError(req->wb_page); 277 279 nfs_readpage_release(req); 278 280 } 279 281 } ··· 318 322 offset += len; 319 323 } while(nbytes != 0); 320 324 atomic_set(&req->wb_complete, requests); 321 - ClearPageError(page); 322 325 desc->pg_rpc_callops = &nfs_read_partial_ops; 323 326 return ret; 324 327 out_bad: ··· 326 331 list_del(&data->list); 327 332 nfs_readdata_free(data); 328 333 } 329 - SetPageError(page); 330 334 nfs_readpage_release(req); 331 335 return -ENOMEM; 332 336 } ··· 351 357 req = nfs_list_entry(head->next); 352 358 nfs_list_remove_request(req); 353 359 nfs_list_add_request(req, &data->pages); 354 - ClearPageError(req->wb_page); 355 360 *pages++ = req->wb_page; 356 361 } 357 362 req = nfs_list_entry(data->pages.next); ··· 428 435 argp->offset += resp->count; 429 436 argp->pgbase += resp->count; 430 437 argp->count -= resp->count; 431 - nfs_restart_rpc(task, NFS_SERVER(data->inode)->nfs_client); 438 + rpc_restart_call_prepare(task); 432 439 } 433 440 434 441 /* ··· 455 462 int status = data->task.tk_status; 456 463 457 464 if (status < 0) 458 - SetPageError(page); 465 + set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags); 459 466 460 467 if (atomic_dec_and_test(&req->wb_complete)) { 461 - if (!PageError(page)) 468 + if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags)) 462 469 SetPageUptodate(page); 463 470 nfs_readpage_release(req); 464 471 } ··· 534 541 static void nfs_readpage_release_full(void *calldata) 535 542 { 536 543 struct nfs_read_data *data = calldata; 544 + struct nfs_pageio_descriptor pgio; 537 545 546 + if (data->pnfs_error) { 547 + nfs_pageio_init_read_mds(&pgio, data->inode); 548 + pgio.pg_recoalesce = 1; 549 + } 538 550 while (!list_empty(&data->pages)) { 539 551 struct nfs_page *req = nfs_list_entry(data->pages.next); 540 552 541 553 nfs_list_remove_request(req); 542 - nfs_readpage_release(req); 554 + if (!data->pnfs_error) 555 + nfs_readpage_release(req); 556 + else 557 + nfs_pageio_add_request(&pgio, req); 543 558 } 559 + if (data->pnfs_error) 560 + nfs_pageio_complete(&pgio); 544 561 nfs_readdata_release(calldata); 545 562 } 546 563 ··· 651 648 return 0; 652 649 out_error: 653 650 error = PTR_ERR(new); 654 - SetPageError(page); 655 651 out_unlock: 656 652 unlock_page(page); 657 653 return error; ··· 713 711 if (nfs_rdata_cachep == NULL) 714 712 return -ENOMEM; 715 713 716 - nfs_rdata_mempool = mempool_create_slab_pool(MIN_POOL_READ, 717 - nfs_rdata_cachep); 718 - if (nfs_rdata_mempool == NULL) 719 - return -ENOMEM; 720 - 721 714 return 0; 722 715 } 723 716 724 717 void nfs_destroy_readpagecache(void) 725 718 { 726 - mempool_destroy(nfs_rdata_mempool); 727 719 kmem_cache_destroy(nfs_rdata_cachep); 728 720 }
+11 -6
fs/nfs/super.c
··· 733 733 734 734 return 0; 735 735 } 736 + 737 + #ifdef CONFIG_NFS_V4 736 738 #ifdef CONFIG_NFS_V4_1 737 - void show_sessions(struct seq_file *m, struct nfs_server *server) 739 + static void show_sessions(struct seq_file *m, struct nfs_server *server) 738 740 { 739 741 if (nfs4_has_session(server->nfs_client)) 740 742 seq_printf(m, ",sessions"); 741 743 } 742 744 #else 743 - void show_sessions(struct seq_file *m, struct nfs_server *server) {} 745 + static void show_sessions(struct seq_file *m, struct nfs_server *server) {} 746 + #endif 744 747 #endif 745 748 749 + #ifdef CONFIG_NFS_V4 746 750 #ifdef CONFIG_NFS_V4_1 747 - void show_pnfs(struct seq_file *m, struct nfs_server *server) 751 + static void show_pnfs(struct seq_file *m, struct nfs_server *server) 748 752 { 749 753 seq_printf(m, ",pnfs="); 750 754 if (server->pnfs_curr_ld) ··· 756 752 else 757 753 seq_printf(m, "not configured"); 758 754 } 759 - #else /* CONFIG_NFS_V4_1 */ 760 - void show_pnfs(struct seq_file *m, struct nfs_server *server) {} 761 - #endif /* CONFIG_NFS_V4_1 */ 755 + #else 756 + static void show_pnfs(struct seq_file *m, struct nfs_server *server) {} 757 + #endif 758 + #endif 762 759 763 760 static int nfs_show_devname(struct seq_file *m, struct vfsmount *mnt) 764 761 {
+2 -2
fs/nfs/unlink.c
··· 87 87 struct inode *dir = data->dir; 88 88 89 89 if (!NFS_PROTO(dir)->unlink_done(task, dir)) 90 - nfs_restart_rpc(task, NFS_SERVER(dir)->nfs_client); 90 + rpc_restart_call_prepare(task); 91 91 } 92 92 93 93 /** ··· 369 369 struct dentry *new_dentry = data->new_dentry; 370 370 371 371 if (!NFS_PROTO(old_dir)->rename_done(task, old_dir, new_dir)) { 372 - nfs_restart_rpc(task, NFS_SERVER(old_dir)->nfs_client); 372 + rpc_restart_call_prepare(task); 373 373 return; 374 374 } 375 375
+43 -30
fs/nfs/write.c
··· 390 390 error = radix_tree_insert(&nfsi->nfs_page_tree, req->wb_index, req); 391 391 BUG_ON(error); 392 392 if (!nfsi->npages && nfs_have_delegation(inode, FMODE_WRITE)) 393 - nfsi->change_attr++; 393 + inode->i_version++; 394 394 set_bit(PG_MAPPED, &req->wb_flags); 395 395 SetPagePrivate(req->wb_page); 396 396 set_page_private(req->wb_page, (unsigned long)req); ··· 428 428 nfs_mark_request_dirty(struct nfs_page *req) 429 429 { 430 430 __set_page_dirty_nobuffers(req->wb_page); 431 - __mark_inode_dirty(req->wb_page->mapping->host, I_DIRTY_DATASYNC); 432 431 } 433 432 434 433 #if defined(CONFIG_NFS_V3) || defined(CONFIG_NFS_V4) ··· 761 762 status = nfs_writepage_setup(ctx, page, offset, count); 762 763 if (status < 0) 763 764 nfs_set_pageerror(page); 765 + else 766 + __set_page_dirty_nobuffers(page); 764 767 765 768 dprintk("NFS: nfs_updatepage returns %d (isize %lld)\n", 766 769 status, (long long)i_size_read(inode)); ··· 1011 1010 req = nfs_list_entry(head->next); 1012 1011 nfs_list_remove_request(req); 1013 1012 nfs_list_add_request(req, &data->pages); 1014 - ClearPageError(req->wb_page); 1015 1013 *pages++ = req->wb_page; 1016 1014 } 1017 1015 req = nfs_list_entry(data->pages.next); ··· 1165 1165 static void nfs_writeback_release_full(void *calldata) 1166 1166 { 1167 1167 struct nfs_write_data *data = calldata; 1168 - int status = data->task.tk_status; 1168 + int ret, status = data->task.tk_status; 1169 + struct nfs_pageio_descriptor pgio; 1170 + 1171 + if (data->pnfs_error) { 1172 + nfs_pageio_init_write_mds(&pgio, data->inode, FLUSH_STABLE); 1173 + pgio.pg_recoalesce = 1; 1174 + } 1169 1175 1170 1176 /* Update attributes as result of writeback. */ 1171 1177 while (!list_empty(&data->pages)) { ··· 1186 1180 (long long)NFS_FILEID(req->wb_context->dentry->d_inode), 1187 1181 req->wb_bytes, 1188 1182 (long long)req_offset(req)); 1183 + 1184 + if (data->pnfs_error) { 1185 + dprintk(", pnfs error = %d\n", data->pnfs_error); 1186 + goto next; 1187 + } 1189 1188 1190 1189 if (status < 0) { 1191 1190 nfs_set_pageerror(page); ··· 1211 1200 next: 1212 1201 nfs_clear_page_tag_locked(req); 1213 1202 nfs_end_page_writeback(page); 1203 + if (data->pnfs_error) { 1204 + lock_page(page); 1205 + nfs_pageio_cond_complete(&pgio, page->index); 1206 + ret = nfs_page_async_flush(&pgio, page, 0); 1207 + if (ret) { 1208 + nfs_set_pageerror(page); 1209 + dprintk("rewrite to MDS error = %d\n", ret); 1210 + } 1211 + unlock_page(page); 1212 + } 1214 1213 } 1214 + if (data->pnfs_error) 1215 + nfs_pageio_complete(&pgio); 1215 1216 nfs_writedata_release(calldata); 1216 1217 } 1217 1218 ··· 1304 1281 */ 1305 1282 argp->stable = NFS_FILE_SYNC; 1306 1283 } 1307 - nfs_restart_rpc(task, server->nfs_client); 1284 + rpc_restart_call_prepare(task); 1308 1285 return; 1309 1286 } 1310 1287 if (time_before(complain, jiffies)) { ··· 1576 1553 int flags = FLUSH_SYNC; 1577 1554 int ret = 0; 1578 1555 1556 + /* no commits means nothing needs to be done */ 1557 + if (!nfsi->ncommit) 1558 + return ret; 1559 + 1579 1560 if (wbc->sync_mode == WB_SYNC_NONE) { 1580 1561 /* Don't commit yet if this is a non-blocking flush and there 1581 1562 * are a lot of outstanding writes for this mapping. ··· 1713 1686 int nfs_migrate_page(struct address_space *mapping, struct page *newpage, 1714 1687 struct page *page) 1715 1688 { 1716 - struct nfs_page *req; 1717 - int ret; 1689 + /* 1690 + * If PagePrivate is set, then the page is currently associated with 1691 + * an in-progress read or write request. Don't try to migrate it. 1692 + * 1693 + * FIXME: we could do this in principle, but we'll need a way to ensure 1694 + * that we can safely release the inode reference while holding 1695 + * the page lock. 1696 + */ 1697 + if (PagePrivate(page)) 1698 + return -EBUSY; 1718 1699 1719 1700 nfs_fscache_release_page(page, GFP_KERNEL); 1720 1701 1721 - req = nfs_find_and_lock_request(page, false); 1722 - ret = PTR_ERR(req); 1723 - if (IS_ERR(req)) 1724 - goto out; 1725 - 1726 - ret = migrate_page(mapping, newpage, page); 1727 - if (!req) 1728 - goto out; 1729 - if (ret) 1730 - goto out_unlock; 1731 - page_cache_get(newpage); 1732 - spin_lock(&mapping->host->i_lock); 1733 - req->wb_page = newpage; 1734 - SetPagePrivate(newpage); 1735 - set_page_private(newpage, (unsigned long)req); 1736 - ClearPagePrivate(page); 1737 - set_page_private(page, 0); 1738 - spin_unlock(&mapping->host->i_lock); 1739 - page_cache_release(page); 1740 - out_unlock: 1741 - nfs_clear_page_tag_locked(req); 1742 - out: 1743 - return ret; 1702 + return migrate_page(mapping, newpage, page); 1744 1703 } 1745 1704 #endif 1746 1705
-1
include/linux/nfs_fs.h
··· 149 149 unsigned long read_cache_jiffies; 150 150 unsigned long attrtimeo; 151 151 unsigned long attrtimeo_timestamp; 152 - __u64 change_attr; /* v4 only */ 153 152 154 153 unsigned long attr_gencount; 155 154 /* "Generation counter" for the attribute cache. This is
+1
include/linux/nfs_page.h
··· 34 34 PG_NEED_COMMIT, 35 35 PG_NEED_RESCHED, 36 36 PG_PNFS_COMMIT, 37 + PG_PARTIAL_READ_FAILED, 37 38 }; 38 39 39 40 struct nfs_inode;
-5
include/linux/nfs_xdr.h
··· 1133 1133 #define NFS_PAGEVEC_SIZE (8U) 1134 1134 1135 1135 struct nfs_read_data { 1136 - int flags; 1137 1136 struct rpc_task task; 1138 1137 struct inode *inode; 1139 1138 struct rpc_cred *cred; ··· 1155 1156 }; 1156 1157 1157 1158 struct nfs_write_data { 1158 - int flags; 1159 1159 struct rpc_task task; 1160 1160 struct inode *inode; 1161 1161 struct rpc_cred *cred; ··· 1195 1197 1196 1198 int (*getroot) (struct nfs_server *, struct nfs_fh *, 1197 1199 struct nfs_fsinfo *); 1198 - int (*lookupfh)(struct nfs_server *, struct nfs_fh *, 1199 - struct qstr *, struct nfs_fh *, 1200 - struct nfs_fattr *); 1201 1200 int (*getattr) (struct nfs_server *, struct nfs_fh *, 1202 1201 struct nfs_fattr *); 1203 1202 int (*setattr) (struct dentry *, struct nfs_fattr *,
+2 -1
include/linux/sunrpc/clnt.h
··· 9 9 #ifndef _LINUX_SUNRPC_CLNT_H 10 10 #define _LINUX_SUNRPC_CLNT_H 11 11 12 + #include <linux/types.h> 12 13 #include <linux/socket.h> 13 14 #include <linux/in.h> 14 15 #include <linux/in6.h> ··· 162 161 size_t rpc_ntop(const struct sockaddr *, char *, const size_t); 163 162 size_t rpc_pton(const char *, const size_t, 164 163 struct sockaddr *, const size_t); 165 - char * rpc_sockaddr2uaddr(const struct sockaddr *); 164 + char * rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t); 166 165 size_t rpc_uaddr2sockaddr(const char *, const size_t, 167 166 struct sockaddr *, const size_t); 168 167
+2
include/linux/sunrpc/rpc_pipe_fs.h
··· 44 44 return container_of(inode, struct rpc_inode, vfs_inode); 45 45 } 46 46 47 + extern ssize_t rpc_pipe_generic_upcall(struct file *, struct rpc_pipe_msg *, 48 + char __user *, size_t); 47 49 extern int rpc_queue_upcall(struct inode *, struct rpc_pipe_msg *); 48 50 49 51 struct rpc_clnt;
+3 -3
net/sunrpc/addr.c
··· 255 255 /** 256 256 * rpc_sockaddr2uaddr - Construct a universal address string from @sap. 257 257 * @sap: socket address 258 + * @gfp_flags: allocation mode 258 259 * 259 260 * Returns a %NUL-terminated string in dynamically allocated memory; 260 261 * otherwise NULL is returned if an error occurred. Caller must 261 262 * free the returned string. 262 263 */ 263 - char *rpc_sockaddr2uaddr(const struct sockaddr *sap) 264 + char *rpc_sockaddr2uaddr(const struct sockaddr *sap, gfp_t gfp_flags) 264 265 { 265 266 char portbuf[RPCBIND_MAXUADDRPLEN]; 266 267 char addrbuf[RPCBIND_MAXUADDRLEN]; ··· 289 288 if (strlcat(addrbuf, portbuf, sizeof(addrbuf)) > sizeof(addrbuf)) 290 289 return NULL; 291 290 292 - return kstrdup(addrbuf, GFP_KERNEL); 291 + return kstrdup(addrbuf, gfp_flags); 293 292 } 294 - EXPORT_SYMBOL_GPL(rpc_sockaddr2uaddr); 295 293 296 294 /** 297 295 * rpc_uaddr2sockaddr - convert a universal address to a socket address.
+2 -22
net/sunrpc/auth_gss/auth_gss.c
··· 603 603 return err; 604 604 } 605 605 606 - static ssize_t 607 - gss_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg, 608 - char __user *dst, size_t buflen) 609 - { 610 - char *data = (char *)msg->data + msg->copied; 611 - size_t mlen = min(msg->len, buflen); 612 - unsigned long left; 613 - 614 - left = copy_to_user(dst, data, mlen); 615 - if (left == mlen) { 616 - msg->errno = -EFAULT; 617 - return -EFAULT; 618 - } 619 - 620 - mlen -= left; 621 - msg->copied += mlen; 622 - msg->errno = 0; 623 - return mlen; 624 - } 625 - 626 606 #define MSG_BUF_MAXSIZE 1024 627 607 628 608 static ssize_t ··· 1570 1590 }; 1571 1591 1572 1592 static const struct rpc_pipe_ops gss_upcall_ops_v0 = { 1573 - .upcall = gss_pipe_upcall, 1593 + .upcall = rpc_pipe_generic_upcall, 1574 1594 .downcall = gss_pipe_downcall, 1575 1595 .destroy_msg = gss_pipe_destroy_msg, 1576 1596 .open_pipe = gss_pipe_open_v0, ··· 1578 1598 }; 1579 1599 1580 1600 static const struct rpc_pipe_ops gss_upcall_ops_v1 = { 1581 - .upcall = gss_pipe_upcall, 1601 + .upcall = rpc_pipe_generic_upcall, 1582 1602 .downcall = gss_pipe_downcall, 1583 1603 .destroy_msg = gss_pipe_destroy_msg, 1584 1604 .open_pipe = gss_pipe_open_v1,
+3 -1
net/sunrpc/clnt.c
··· 850 850 { 851 851 if (RPC_ASSASSINATED(task)) 852 852 return 0; 853 - task->tk_action = rpc_prepare_task; 853 + task->tk_action = call_start; 854 + if (task->tk_ops->rpc_call_prepare != NULL) 855 + task->tk_action = rpc_prepare_task; 854 856 return 1; 855 857 } 856 858 EXPORT_SYMBOL_GPL(rpc_restart_call_prepare);
+20
net/sunrpc/rpc_pipe.c
··· 77 77 rpc_purge_list(rpci, &free_list, destroy_msg, -ETIMEDOUT); 78 78 } 79 79 80 + ssize_t rpc_pipe_generic_upcall(struct file *filp, struct rpc_pipe_msg *msg, 81 + char __user *dst, size_t buflen) 82 + { 83 + char *data = (char *)msg->data + msg->copied; 84 + size_t mlen = min(msg->len - msg->copied, buflen); 85 + unsigned long left; 86 + 87 + left = copy_to_user(dst, data, mlen); 88 + if (left == mlen) { 89 + msg->errno = -EFAULT; 90 + return -EFAULT; 91 + } 92 + 93 + mlen -= left; 94 + msg->copied += mlen; 95 + msg->errno = 0; 96 + return mlen; 97 + } 98 + EXPORT_SYMBOL_GPL(rpc_pipe_generic_upcall); 99 + 80 100 /** 81 101 * rpc_queue_upcall - queue an upcall message to userspace 82 102 * @inode: inode of upcall pipe on which to queue given message
+3 -3
net/sunrpc/rpcb_clnt.c
··· 410 410 unsigned short port = ntohs(sin->sin_port); 411 411 int result; 412 412 413 - map->r_addr = rpc_sockaddr2uaddr(sap); 413 + map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); 414 414 415 415 dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with " 416 416 "local rpcbind\n", (port ? "" : "un"), ··· 437 437 unsigned short port = ntohs(sin6->sin6_port); 438 438 int result; 439 439 440 - map->r_addr = rpc_sockaddr2uaddr(sap); 440 + map->r_addr = rpc_sockaddr2uaddr(sap, GFP_KERNEL); 441 441 442 442 dprintk("RPC: %sregistering [%u, %u, %s, '%s'] with " 443 443 "local rpcbind\n", (port ? "" : "un"), ··· 686 686 case RPCBVERS_4: 687 687 case RPCBVERS_3: 688 688 map->r_netid = rpc_peeraddr2str(clnt, RPC_DISPLAY_NETID); 689 - map->r_addr = rpc_sockaddr2uaddr(sap); 689 + map->r_addr = rpc_sockaddr2uaddr(sap, GFP_ATOMIC); 690 690 map->r_owner = ""; 691 691 break; 692 692 case RPCBVERS_2: