Merge branch 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6

* 'bugfixes' of git://git.linux-nfs.org/projects/trondmy/nfs-2.6:
nfs: Ignore kmemleak false positive in nfs_readdir_make_qstr
SUNRPC: Simplify rpc_alloc_iostats by removing pointless local variable
nfs: trivial: remove unused nfs_wait_event macro
NFS: readdir shouldn't read beyond the reply returned by the server
NFS: Fix a couple of regressions in readdir.
Revert "NFSv4: Fall back to ordinary lookup if nfs4_atomic_open() returns EISDIR"
Regression: fix mounting NFS when NFSv3 support is not compiled
NLM: Fix a regression in lockd

+86 -58
+4 -7
fs/lockd/host.c
··· 124 continue; 125 if (host->h_server != ni->server) 126 continue; 127 - if (ni->server && 128 !rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap)) 129 continue; 130 ··· 167 host->h_addrlen = ni->salen; 168 rpc_set_port(nlm_addr(host), 0); 169 memcpy(nlm_srcaddr(host), ni->src_sap, ni->src_len); 170 host->h_version = ni->version; 171 host->h_proto = ni->protocol; 172 host->h_rpcclnt = NULL; ··· 239 const char *hostname, 240 int noresvport) 241 { 242 - const struct sockaddr source = { 243 - .sa_family = AF_UNSPEC, 244 - }; 245 struct nlm_lookup_host_info ni = { 246 .server = 0, 247 .sap = sap, ··· 247 .version = version, 248 .hostname = hostname, 249 .hostname_len = strlen(hostname), 250 - .src_sap = &source, 251 - .src_len = sizeof(source), 252 .noresvport = noresvport, 253 }; 254 ··· 353 .protocol = host->h_proto, 354 .address = nlm_addr(host), 355 .addrsize = host->h_addrlen, 356 - .saddress = nlm_srcaddr(host), 357 .timeout = &timeparms, 358 .servername = host->h_name, 359 .program = &nlm_program, ··· 371 args.flags |= RPC_CLNT_CREATE_HARDRTRY; 372 if (host->h_noresvport) 373 args.flags |= RPC_CLNT_CREATE_NONPRIVPORT; 374 375 clnt = rpc_create(&args); 376 if (!IS_ERR(clnt))
··· 124 continue; 125 if (host->h_server != ni->server) 126 continue; 127 + if (ni->server && ni->src_len != 0 && 128 !rpc_cmp_addr(nlm_srcaddr(host), ni->src_sap)) 129 continue; 130 ··· 167 host->h_addrlen = ni->salen; 168 rpc_set_port(nlm_addr(host), 0); 169 memcpy(nlm_srcaddr(host), ni->src_sap, ni->src_len); 170 + host->h_srcaddrlen = ni->src_len; 171 host->h_version = ni->version; 172 host->h_proto = ni->protocol; 173 host->h_rpcclnt = NULL; ··· 238 const char *hostname, 239 int noresvport) 240 { 241 struct nlm_lookup_host_info ni = { 242 .server = 0, 243 .sap = sap, ··· 249 .version = version, 250 .hostname = hostname, 251 .hostname_len = strlen(hostname), 252 .noresvport = noresvport, 253 }; 254 ··· 357 .protocol = host->h_proto, 358 .address = nlm_addr(host), 359 .addrsize = host->h_addrlen, 360 .timeout = &timeparms, 361 .servername = host->h_name, 362 .program = &nlm_program, ··· 376 args.flags |= RPC_CLNT_CREATE_HARDRTRY; 377 if (host->h_noresvport) 378 args.flags |= RPC_CLNT_CREATE_NONPRIVPORT; 379 + if (host->h_srcaddrlen) 380 + args.saddress = nlm_srcaddr(host); 381 382 clnt = rpc_create(&args); 383 if (!IS_ERR(clnt))
+65 -35
fs/nfs/dir.c
··· 34 #include <linux/mount.h> 35 #include <linux/sched.h> 36 #include <linux/vmalloc.h> 37 38 #include "delegation.h" 39 #include "iostat.h" ··· 195 static 196 struct nfs_cache_array *nfs_readdir_get_array(struct page *page) 197 { 198 if (page == NULL) 199 return ERR_PTR(-EIO); 200 - return (struct nfs_cache_array *)kmap(page); 201 } 202 203 static ··· 218 { 219 struct nfs_cache_array *array = nfs_readdir_get_array(page); 220 int i; 221 for (i = 0; i < array->size; i++) 222 kfree(array->array[i].string.name); 223 nfs_readdir_release_array(page); ··· 239 string->name = kmemdup(name, len, GFP_KERNEL); 240 if (string->name == NULL) 241 return -ENOMEM; 242 string->hash = full_name_hash(name, len); 243 return 0; 244 } ··· 257 258 if (IS_ERR(array)) 259 return PTR_ERR(array); 260 - ret = -EIO; 261 if (array->size >= MAX_READDIR_ARRAY) 262 goto out; 263 ··· 268 if (ret) 269 goto out; 270 array->last_cookie = entry->cookie; 271 if (entry->eof == 1) 272 array->eof_index = array->size; 273 - array->size++; 274 out: 275 nfs_readdir_release_array(page); 276 return ret; ··· 285 if (diff < 0) 286 goto out_eof; 287 if (diff >= array->size) { 288 - if (array->eof_index > 0) 289 goto out_eof; 290 desc->current_index += array->size; 291 return -EAGAIN; ··· 294 index = (unsigned int)diff; 295 *desc->dir_cookie = array->array[index].cookie; 296 desc->cache_entry_index = index; 297 - if (index == array->eof_index) 298 - desc->eof = 1; 299 return 0; 300 out_eof: 301 desc->eof = 1; ··· 307 int status = -EAGAIN; 308 309 for (i = 0; i < array->size; i++) { 310 - if (i == array->eof_index) { 311 - desc->eof = 1; 312 - status = -EBADCOOKIE; 313 - } 314 if (array->array[i].cookie == *desc->dir_cookie) { 315 desc->cache_entry_index = i; 316 status = 0; 317 - break; 318 } 319 } 320 - 321 return status; 322 } 323 ··· 460 461 /* Perform conversion from xdr to cache array */ 462 static 463 - void nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry, 464 void *xdr_page, struct page *page, unsigned int buflen) 465 { 466 struct xdr_stream stream; ··· 482 483 do { 484 status = xdr_decode(desc, entry, &stream); 485 - if (status != 0) 486 break; 487 488 - if (nfs_readdir_add_to_array(entry, page) == -1) 489 - break; 490 if (desc->plus == 1) 491 nfs_prime_dcache(desc->file->f_path.dentry, entry); 492 } while (!entry->eof); 493 494 if (status == -EBADCOOKIE && entry->eof) { 495 array = nfs_readdir_get_array(page); 496 - array->eof_index = array->size - 1; 497 - status = 0; 498 - nfs_readdir_release_array(page); 499 } 500 } 501 502 static ··· 556 struct nfs_entry entry; 557 struct file *file = desc->file; 558 struct nfs_cache_array *array; 559 - int status = 0; 560 unsigned int array_size = ARRAY_SIZE(pages); 561 562 entry.prev_cookie = 0; ··· 568 goto out; 569 570 array = nfs_readdir_get_array(page); 571 memset(array, 0, sizeof(struct nfs_cache_array)); 572 array->eof_index = -1; 573 ··· 579 if (!pages_ptr) 580 goto out_release_array; 581 do { 582 status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode); 583 584 if (status < 0) 585 break; 586 - nfs_readdir_page_filler(desc, &entry, pages_ptr, page, array_size * PAGE_SIZE); 587 - } while (array->eof_index < 0 && array->size < MAX_READDIR_ARRAY); 588 589 nfs_readdir_free_large_page(pages_ptr, pages, array_size); 590 out_release_array: ··· 612 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page) 613 { 614 struct inode *inode = desc->file->f_path.dentry->d_inode; 615 616 - if (nfs_readdir_xdr_to_array(desc, page, inode) < 0) 617 goto error; 618 SetPageUptodate(page); 619 ··· 627 return 0; 628 error: 629 unlock_page(page); 630 - return -EIO; 631 } 632 633 static ··· 640 static 641 struct page *get_cache_page(nfs_readdir_descriptor_t *desc) 642 { 643 - struct page *page; 644 - page = read_cache_page(desc->file->f_path.dentry->d_inode->i_mapping, 645 desc->page_index, (filler_t *)nfs_readdir_filler, desc); 646 - if (IS_ERR(page)) 647 - desc->eof = 1; 648 - return page; 649 } 650 651 /* ··· 667 static inline 668 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) 669 { 670 - int res = -EAGAIN; 671 672 while (1) { 673 res = find_cache_page(desc); 674 if (res != -EAGAIN) ··· 700 struct dentry *dentry = NULL; 701 702 array = nfs_readdir_get_array(desc->page); 703 704 for (i = desc->cache_entry_index; i < array->size; i++) { 705 d_type = DT_UNKNOWN; ··· 717 *desc->dir_cookie = array->array[i+1].cookie; 718 else 719 *desc->dir_cookie = array->last_cookie; 720 - if (i == array->eof_index) { 721 - desc->eof = 1; 722 - break; 723 - } 724 } 725 726 nfs_readdir_release_array(desc->page); 727 cache_page_release(desc); ··· 1375 res = NULL; 1376 goto out; 1377 /* This turned out not to be a regular file */ 1378 - case -EISDIR: 1379 case -ENOTDIR: 1380 goto no_open; 1381 case -ELOOP: 1382 if (!(nd->intent.open.flags & O_NOFOLLOW)) 1383 goto no_open; 1384 /* case -EINVAL: */ 1385 default: 1386 res = ERR_CAST(inode);
··· 34 #include <linux/mount.h> 35 #include <linux/sched.h> 36 #include <linux/vmalloc.h> 37 + #include <linux/kmemleak.h> 38 39 #include "delegation.h" 40 #include "iostat.h" ··· 194 static 195 struct nfs_cache_array *nfs_readdir_get_array(struct page *page) 196 { 197 + void *ptr; 198 if (page == NULL) 199 return ERR_PTR(-EIO); 200 + ptr = kmap(page); 201 + if (ptr == NULL) 202 + return ERR_PTR(-ENOMEM); 203 + return ptr; 204 } 205 206 static ··· 213 { 214 struct nfs_cache_array *array = nfs_readdir_get_array(page); 215 int i; 216 + 217 + if (IS_ERR(array)) 218 + return PTR_ERR(array); 219 for (i = 0; i < array->size; i++) 220 kfree(array->array[i].string.name); 221 nfs_readdir_release_array(page); ··· 231 string->name = kmemdup(name, len, GFP_KERNEL); 232 if (string->name == NULL) 233 return -ENOMEM; 234 + /* 235 + * Avoid a kmemleak false positive. The pointer to the name is stored 236 + * in a page cache page which kmemleak does not scan. 237 + */ 238 + kmemleak_not_leak(string->name); 239 string->hash = full_name_hash(name, len); 240 return 0; 241 } ··· 244 245 if (IS_ERR(array)) 246 return PTR_ERR(array); 247 + ret = -ENOSPC; 248 if (array->size >= MAX_READDIR_ARRAY) 249 goto out; 250 ··· 255 if (ret) 256 goto out; 257 array->last_cookie = entry->cookie; 258 + array->size++; 259 if (entry->eof == 1) 260 array->eof_index = array->size; 261 out: 262 nfs_readdir_release_array(page); 263 return ret; ··· 272 if (diff < 0) 273 goto out_eof; 274 if (diff >= array->size) { 275 + if (array->eof_index >= 0) 276 goto out_eof; 277 desc->current_index += array->size; 278 return -EAGAIN; ··· 281 index = (unsigned int)diff; 282 *desc->dir_cookie = array->array[index].cookie; 283 desc->cache_entry_index = index; 284 return 0; 285 out_eof: 286 desc->eof = 1; ··· 296 int status = -EAGAIN; 297 298 for (i = 0; i < array->size; i++) { 299 if (array->array[i].cookie == *desc->dir_cookie) { 300 desc->cache_entry_index = i; 301 status = 0; 302 + goto out; 303 } 304 } 305 + if (i == array->eof_index) { 306 + desc->eof = 1; 307 + status = -EBADCOOKIE; 308 + } 309 + out: 310 return status; 311 } 312 ··· 449 450 /* Perform conversion from xdr to cache array */ 451 static 452 + int nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry, 453 void *xdr_page, struct page *page, unsigned int buflen) 454 { 455 struct xdr_stream stream; ··· 471 472 do { 473 status = xdr_decode(desc, entry, &stream); 474 + if (status != 0) { 475 + if (status == -EAGAIN) 476 + status = 0; 477 break; 478 + } 479 480 if (desc->plus == 1) 481 nfs_prime_dcache(desc->file->f_path.dentry, entry); 482 + 483 + status = nfs_readdir_add_to_array(entry, page); 484 + if (status != 0) 485 + break; 486 } while (!entry->eof); 487 488 if (status == -EBADCOOKIE && entry->eof) { 489 array = nfs_readdir_get_array(page); 490 + if (!IS_ERR(array)) { 491 + array->eof_index = array->size; 492 + status = 0; 493 + nfs_readdir_release_array(page); 494 + } 495 } 496 + return status; 497 } 498 499 static ··· 537 struct nfs_entry entry; 538 struct file *file = desc->file; 539 struct nfs_cache_array *array; 540 + int status = -ENOMEM; 541 unsigned int array_size = ARRAY_SIZE(pages); 542 543 entry.prev_cookie = 0; ··· 549 goto out; 550 551 array = nfs_readdir_get_array(page); 552 + if (IS_ERR(array)) { 553 + status = PTR_ERR(array); 554 + goto out; 555 + } 556 memset(array, 0, sizeof(struct nfs_cache_array)); 557 array->eof_index = -1; 558 ··· 556 if (!pages_ptr) 557 goto out_release_array; 558 do { 559 + unsigned int pglen; 560 status = nfs_readdir_xdr_filler(pages, desc, &entry, file, inode); 561 562 if (status < 0) 563 break; 564 + pglen = status; 565 + status = nfs_readdir_page_filler(desc, &entry, pages_ptr, page, pglen); 566 + if (status < 0) { 567 + if (status == -ENOSPC) 568 + status = 0; 569 + break; 570 + } 571 + } while (array->eof_index < 0); 572 573 nfs_readdir_free_large_page(pages_ptr, pages, array_size); 574 out_release_array: ··· 582 int nfs_readdir_filler(nfs_readdir_descriptor_t *desc, struct page* page) 583 { 584 struct inode *inode = desc->file->f_path.dentry->d_inode; 585 + int ret; 586 587 + ret = nfs_readdir_xdr_to_array(desc, page, inode); 588 + if (ret < 0) 589 goto error; 590 SetPageUptodate(page); 591 ··· 595 return 0; 596 error: 597 unlock_page(page); 598 + return ret; 599 } 600 601 static ··· 608 static 609 struct page *get_cache_page(nfs_readdir_descriptor_t *desc) 610 { 611 + return read_cache_page(desc->file->f_path.dentry->d_inode->i_mapping, 612 desc->page_index, (filler_t *)nfs_readdir_filler, desc); 613 } 614 615 /* ··· 639 static inline 640 int readdir_search_pagecache(nfs_readdir_descriptor_t *desc) 641 { 642 + int res; 643 644 + if (desc->page_index == 0) 645 + desc->current_index = 0; 646 while (1) { 647 res = find_cache_page(desc); 648 if (res != -EAGAIN) ··· 670 struct dentry *dentry = NULL; 671 672 array = nfs_readdir_get_array(desc->page); 673 + if (IS_ERR(array)) 674 + return PTR_ERR(array); 675 676 for (i = desc->cache_entry_index; i < array->size; i++) { 677 d_type = DT_UNKNOWN; ··· 685 *desc->dir_cookie = array->array[i+1].cookie; 686 else 687 *desc->dir_cookie = array->last_cookie; 688 } 689 + if (i == array->eof_index) 690 + desc->eof = 1; 691 692 nfs_readdir_release_array(desc->page); 693 cache_page_release(desc); ··· 1345 res = NULL; 1346 goto out; 1347 /* This turned out not to be a regular file */ 1348 case -ENOTDIR: 1349 goto no_open; 1350 case -ELOOP: 1351 if (!(nd->intent.open.flags & O_NOFOLLOW)) 1352 goto no_open; 1353 + /* case -EISDIR: */ 1354 /* case -EINVAL: */ 1355 default: 1356 res = ERR_CAST(inode);
+2 -2
fs/nfs/nfs2xdr.c
··· 423 struct page **page; 424 size_t hdrlen; 425 unsigned int pglen, recvd; 426 - int status, nr = 0; 427 428 if ((status = ntohl(*p++))) 429 return nfs_stat_to_errno(status); ··· 443 if (pglen > recvd) 444 pglen = recvd; 445 page = rcvbuf->pages; 446 - return nr; 447 } 448 449 static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
··· 423 struct page **page; 424 size_t hdrlen; 425 unsigned int pglen, recvd; 426 + int status; 427 428 if ((status = ntohl(*p++))) 429 return nfs_stat_to_errno(status); ··· 443 if (pglen > recvd) 444 pglen = recvd; 445 page = rcvbuf->pages; 446 + return pglen; 447 } 448 449 static void print_overflow_msg(const char *func, const struct xdr_stream *xdr)
+2 -2
fs/nfs/nfs3xdr.c
··· 555 struct page **page; 556 size_t hdrlen; 557 u32 recvd, pglen; 558 - int status, nr = 0; 559 560 status = ntohl(*p++); 561 /* Decode post_op_attrs */ ··· 586 pglen = recvd; 587 page = rcvbuf->pages; 588 589 - return nr; 590 } 591 592 __be32 *
··· 555 struct page **page; 556 size_t hdrlen; 557 u32 recvd, pglen; 558 + int status; 559 560 status = ntohl(*p++); 561 /* Decode post_op_attrs */ ··· 586 pglen = recvd; 587 page = rcvbuf->pages; 588 589 + return pglen; 590 } 591 592 __be32 *
+3 -1
fs/nfs/nfs4proc.c
··· 2852 nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args); 2853 res.pgbase = args.pgbase; 2854 status = nfs4_call_sync(NFS_SERVER(dir), &msg, &args, &res, 0); 2855 - if (status == 0) 2856 memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); 2857 2858 nfs_invalidate_atime(dir); 2859
··· 2852 nfs4_setup_readdir(cookie, NFS_COOKIEVERF(dir), dentry, &args); 2853 res.pgbase = args.pgbase; 2854 status = nfs4_call_sync(NFS_SERVER(dir), &msg, &args, &res, 0); 2855 + if (status >= 0) { 2856 memcpy(NFS_COOKIEVERF(dir), res.verifier.data, NFS4_VERIFIER_SIZE); 2857 + status += args.pgbase; 2858 + } 2859 2860 nfs_invalidate_atime(dir); 2861
+1 -1
fs/nfs/nfs4xdr.c
··· 4518 xdr_read_pages(xdr, pglen); 4519 4520 4521 - return 0; 4522 } 4523 4524 static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
··· 4518 xdr_read_pages(xdr, pglen); 4519 4520 4521 + return pglen; 4522 } 4523 4524 static int decode_readlink(struct xdr_stream *xdr, struct rpc_rqst *req)
+7 -1
fs/nfs/super.c
··· 67 68 #define NFSDBG_FACILITY NFSDBG_VFS 69 70 enum { 71 /* Mount options that take no arguments */ 72 Opt_soft, Opt_hard, ··· 2283 }; 2284 int error = -ENOMEM; 2285 2286 - data = nfs_alloc_parsed_mount_data(3); 2287 mntfh = nfs_alloc_fhandle(); 2288 if (data == NULL || mntfh == NULL) 2289 goto out_free_fh;
··· 67 68 #define NFSDBG_FACILITY NFSDBG_VFS 69 70 + #ifdef CONFIG_NFS_V3 71 + #define NFS_DEFAULT_VERSION 3 72 + #else 73 + #define NFS_DEFAULT_VERSION 2 74 + #endif 75 + 76 enum { 77 /* Mount options that take no arguments */ 78 Opt_soft, Opt_hard, ··· 2277 }; 2278 int error = -ENOMEM; 2279 2280 + data = nfs_alloc_parsed_mount_data(NFS_DEFAULT_VERSION); 2281 mntfh = nfs_alloc_fhandle(); 2282 if (data == NULL || mntfh == NULL) 2283 goto out_free_fh;
+1
include/linux/lockd/lockd.h
··· 43 struct sockaddr_storage h_addr; /* peer address */ 44 size_t h_addrlen; 45 struct sockaddr_storage h_srcaddr; /* our address (optional) */ 46 struct rpc_clnt *h_rpcclnt; /* RPC client to talk to peer */ 47 char *h_name; /* remote hostname */ 48 u32 h_version; /* interface version */
··· 43 struct sockaddr_storage h_addr; /* peer address */ 44 size_t h_addrlen; 45 struct sockaddr_storage h_srcaddr; /* our address (optional) */ 46 + size_t h_srcaddrlen; 47 struct rpc_clnt *h_rpcclnt; /* RPC client to talk to peer */ 48 char *h_name; /* remote hostname */ 49 u32 h_version; /* interface version */
-6
include/linux/nfs_fs.h
··· 593 return ino; 594 } 595 596 - #define nfs_wait_event(clnt, wq, condition) \ 597 - ({ \ 598 - int __retval = wait_event_killable(wq, condition); \ 599 - __retval; \ 600 - }) 601 - 602 #define NFS_JUKEBOX_RETRY_TIME (5 * HZ) 603 604 #endif /* __KERNEL__ */
··· 593 return ino; 594 } 595 596 #define NFS_JUKEBOX_RETRY_TIME (5 * HZ) 597 598 #endif /* __KERNEL__ */
+1 -3
net/sunrpc/stats.c
··· 115 */ 116 struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) 117 { 118 - struct rpc_iostats *new; 119 - new = kcalloc(clnt->cl_maxproc, sizeof(struct rpc_iostats), GFP_KERNEL); 120 - return new; 121 } 122 EXPORT_SYMBOL_GPL(rpc_alloc_iostats); 123
··· 115 */ 116 struct rpc_iostats *rpc_alloc_iostats(struct rpc_clnt *clnt) 117 { 118 + return kcalloc(clnt->cl_maxproc, sizeof(struct rpc_iostats), GFP_KERNEL); 119 } 120 EXPORT_SYMBOL_GPL(rpc_alloc_iostats); 121