Message ID | 1311886137.27285.2.camel@lade.trondhjem.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 29 Jul 2011, Bryan Schumaker wrote:
> How does this look for printing out more information when a cookie loop is detected? Is there anything else that should be printed out? My patch applies on top of Trond's from yesterday.
Hi,
This fails against 2.6.38:
patching file fs/nfs/dir.c
Hunk #1 FAILED at 134.
Hunk #2 FAILED at 173.
Hunk #3 FAILED at 323.
Hunk #4 FAILED at 336.
Hunk #5 FAILED at 349.
Hunk #6 succeeded at 320 (offset -48 lines).
Hunk #7 FAILED at 741.
Hunk #8 succeeded at 716 (offset -59 lines).
Hunk #9 succeeded at 749 (offset -59 lines).
Hunk #10 succeeded at 763 (offset -59 lines).
6 out of 10 hunks FAILED -- saving rejects to file fs/nfs/dir.c.rej
patching file include/linux/nfs_fs.h
Hunk #1 FAILED at 99.
1 out of 1 hunk FAILED -- saving rejects to file include/linux/nfs_fs.h.rej
atom:/usr/src/linux#
And the 3.0 kernel is broken for my wireless adapter:
http://www.gossamer-threads.com/lists/linux/kernel/1411576
If you can make a combined patch for 2.6.38 I can try it, 2.6.39+ have a
horrible driver (rt2800usb) and 1 person emailed me as well stating the
same thing off-list (they stick with the manufacturer's driver or the *sta
one).
Justin.
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, 2011-07-29 at 16:59 -0400, Justin Piszcz wrote: > On Fri, 29 Jul 2011, Bryan Schumaker wrote: > > > How does this look for printing out more information when a cookie loop is detected? Is there anything else that should be printed out? My patch applies on top of Trond's from yesterday. > > > Hi, > > This fails against 2.6.38: > > patching file fs/nfs/dir.c > Hunk #1 FAILED at 134. > Hunk #2 FAILED at 173. > Hunk #3 FAILED at 323. > Hunk #4 FAILED at 336. > Hunk #5 FAILED at 349. > Hunk #6 succeeded at 320 (offset -48 lines). > Hunk #7 FAILED at 741. > Hunk #8 succeeded at 716 (offset -59 lines). > Hunk #9 succeeded at 749 (offset -59 lines). > Hunk #10 succeeded at 763 (offset -59 lines). > 6 out of 10 hunks FAILED -- saving rejects to file fs/nfs/dir.c.rej > patching file include/linux/nfs_fs.h > Hunk #1 FAILED at 99. > 1 out of 1 hunk FAILED -- saving rejects to file include/linux/nfs_fs.h.rej > atom:/usr/src/linux# > > And the 3.0 kernel is broken for my wireless adapter: > http://www.gossamer-threads.com/lists/linux/kernel/1411576 > > If you can make a combined patch for 2.6.38 I can try it, 2.6.39+ have a > horrible driver (rt2800usb) and 1 person emailed me as well stating the > same thing off-list (they stick with the manufacturer's driver or the *sta > one). I don't understand. The readdir loop detection code was first merged upstream in 2.6.39. 2.6.38 doesn't report any loops...
On Fri, 29 Jul 2011, Trond Myklebust wrote: > On Fri, 2011-07-29 at 16:59 -0400, Justin Piszcz wrote: >> On Fri, 29 Jul 2011, Bryan Schumaker wrote: >> >>> How does this look for printing out more information when a cookie loop is detected? Is there anything else that should be printed out? My patch applies on top of Trond's from yesterday. >> >> >> Hi, >> >> This fails against 2.6.38: >> >> patching file fs/nfs/dir.c >> Hunk #1 FAILED at 134. >> Hunk #2 FAILED at 173. >> Hunk #3 FAILED at 323. >> Hunk #4 FAILED at 336. >> Hunk #5 FAILED at 349. >> Hunk #6 succeeded at 320 (offset -48 lines). >> Hunk #7 FAILED at 741. >> Hunk #8 succeeded at 716 (offset -59 lines). >> Hunk #9 succeeded at 749 (offset -59 lines). >> Hunk #10 succeeded at 763 (offset -59 lines). >> 6 out of 10 hunks FAILED -- saving rejects to file fs/nfs/dir.c.rej >> patching file include/linux/nfs_fs.h >> Hunk #1 FAILED at 99. >> 1 out of 1 hunk FAILED -- saving rejects to file include/linux/nfs_fs.h.rej >> atom:/usr/src/linux# >> >> And the 3.0 kernel is broken for my wireless adapter: >> http://www.gossamer-threads.com/lists/linux/kernel/1411576 >> >> If you can make a combined patch for 2.6.38 I can try it, 2.6.39+ have a >> horrible driver (rt2800usb) and 1 person emailed me as well stating the >> same thing off-list (they stick with the manufacturer's driver or the *sta >> one). > > I don't understand. The readdir loop detection code was first merged > upstream in 2.6.39. 2.6.38 doesn't report any loops... Hi, Sorry--(my error) this is meant for the client, patched & will e-mail when it happens again. # patch -p1 < /home/jpiszcz/patch1 patching file fs/nfs/dir.c patching file include/linux/nfs_fs.h # patch -p1 < /home/jpiszcz/patch2 patching file fs/nfs/dir.c (recompile->reboot->waiting for next error) Justin. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, 29 Jul 2011, Justin Piszcz wrote: > > > On Fri, 29 Jul 2011, Trond Myklebust wrote: > > > On Fri, 2011-07-29 at 16:59 -0400, Justin Piszcz wrote: > >> On Fri, 29 Jul 2011, Bryan Schumaker wrote: > >> > >>> How does this look for printing out more information when a cookie loop is detected? Is there anything else that should be printed out? My patch applies on top of Trond's from yesterday. > >> > >> > >> Hi, > >> > >> This fails against 2.6.38: > >> > >> patching file fs/nfs/dir.c > >> Hunk #1 FAILED at 134. > >> Hunk #2 FAILED at 173. > >> Hunk #3 FAILED at 323. > >> Hunk #4 FAILED at 336. > >> Hunk #5 FAILED at 349. > >> Hunk #6 succeeded at 320 (offset -48 lines). > >> Hunk #7 FAILED at 741. > >> Hunk #8 succeeded at 716 (offset -59 lines). > >> Hunk #9 succeeded at 749 (offset -59 lines). > >> Hunk #10 succeeded at 763 (offset -59 lines). > >> 6 out of 10 hunks FAILED -- saving rejects to file fs/nfs/dir.c.rej > >> patching file include/linux/nfs_fs.h > >> Hunk #1 FAILED at 99. > >> 1 out of 1 hunk FAILED -- saving rejects to file include/linux/nfs_fs.h.rej > >> atom:/usr/src/linux# > >> > >> And the 3.0 kernel is broken for my wireless adapter: > >> http://www.gossamer-threads.com/lists/linux/kernel/1411576 > >> > >> If you can make a combined patch for 2.6.38 I can try it, 2.6.39+ have a > >> horrible driver (rt2800usb) and 1 person emailed me as well stating the > >> same thing off-list (they stick with the manufacturer's driver or the *sta > >> one). > > > > I don't understand. The readdir loop detection code was first merged > > upstream in 2.6.39. 2.6.38 doesn't report any loops... > > Hi, > > Sorry--(my error) this is meant for the client, patched & will e-mail when > it happens again. > > # patch -p1 < /home/jpiszcz/patch1 > patching file fs/nfs/dir.c > patching file include/linux/nfs_fs.h > > # patch -p1 < /home/jpiszcz/patch2 > patching file fs/nfs/dir.c > > (recompile->reboot->waiting for next error) > > Justin. So I have been running Linux 2.6.37-(.. 3.0 recently) since Jan of this year on these new hosts and I have never had so much as a kernel OOPS, with these patches, there were several kernel lockups/problems but the nfs/loop did not show up. I've went back to the previous (non-patched) kernel, is there a less invasive patch? http://home.comcast.net/~jpiszcz/20110730/kernel-error.txt Justin. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index 57f578e..d23108b 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -134,18 +134,19 @@ const struct inode_operations nfs4_dir_inode_operations = { #endif /* CONFIG_NFS_V4 */ -static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct rpc_cred *cred) +static struct nfs_open_dir_context *alloc_nfs_open_dir_context(struct inode *dir, struct rpc_cred *cred) { struct nfs_open_dir_context *ctx; ctx = kmalloc(sizeof(*ctx), GFP_KERNEL); if (ctx != NULL) { ctx->duped = 0; + ctx->attr_gencount = NFS_I(dir)->attr_gencount; ctx->dir_cookie = 0; ctx->dup_cookie = 0; ctx->cred = get_rpccred(cred); - } else - ctx = ERR_PTR(-ENOMEM); - return ctx; + return ctx; + } + return ERR_PTR(-ENOMEM); } static void put_nfs_open_dir_context(struct nfs_open_dir_context *ctx) @@ -173,7 +174,7 @@ nfs_opendir(struct inode *inode, struct file *filp) cred = rpc_lookup_cred(); if (IS_ERR(cred)) return PTR_ERR(cred); - ctx = alloc_nfs_open_dir_context(cred); + ctx = alloc_nfs_open_dir_context(inode, cred); if (IS_ERR(ctx)) { res = PTR_ERR(ctx); goto out; @@ -323,7 +324,6 @@ int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descri { loff_t diff = desc->file->f_pos - desc->current_index; unsigned int index; - struct nfs_open_dir_context *ctx = desc->file->private_data; if (diff < 0) goto out_eof; @@ -336,7 +336,6 @@ int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descri index = (unsigned int)diff; *desc->dir_cookie = array->array[index].cookie; desc->cache_entry_index = index; - ctx->duped = 0; return 0; out_eof: desc->eof = 1; @@ -349,14 +348,33 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des int i; loff_t new_pos; int status = -EAGAIN; - struct nfs_open_dir_context *ctx = desc->file->private_data; for (i = 0; i < array->size; i++) { if (array->array[i].cookie == *desc->dir_cookie) { + struct nfs_inode *nfsi = NFS_I(desc->file->f_path.dentry->d_inode); + struct nfs_open_dir_context *ctx = desc->file->private_data; + new_pos = desc->current_index + i; - if (new_pos < desc->file->f_pos) { + if (ctx->attr_gencount != nfsi->attr_gencount + || (nfsi->cache_validity & (NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA))) { + ctx->duped = 0; + ctx->attr_gencount = nfsi->attr_gencount; + } else if (new_pos < desc->file->f_pos) { + if (ctx->duped > 0 + && ctx->dup_cookie == *desc->dir_cookie) { + if (printk_ratelimit()) { + pr_notice("NFS: directory %s/%s contains a readdir loop." + "Please contact your server vendor. " + "Offending cookie: %llu\n", + desc->file->f_dentry->d_parent->d_name.name, + desc->file->f_dentry->d_name.name, + *desc->dir_cookie); + } + status = -ELOOP; + goto out; + } ctx->dup_cookie = *desc->dir_cookie; - ctx->duped = 1; + ctx->duped = -1; } desc->file->f_pos = new_pos; desc->cache_entry_index = i; @@ -368,6 +386,7 @@ int nfs_readdir_search_for_cookie(struct nfs_cache_array *array, nfs_readdir_des if (*desc->dir_cookie == array->last_cookie) desc->eof = 1; } +out: return status; } @@ -740,19 +759,6 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, struct nfs_cache_array *array = NULL; struct nfs_open_dir_context *ctx = file->private_data; - if (ctx->duped != 0 && ctx->dup_cookie == *desc->dir_cookie) { - if (printk_ratelimit()) { - pr_notice("NFS: directory %s/%s contains a readdir loop. " - "Please contact your server vendor. " - "Offending cookie: %llu\n", - file->f_dentry->d_parent->d_name.name, - file->f_dentry->d_name.name, - *desc->dir_cookie); - } - res = -ELOOP; - goto out; - } - array = nfs_readdir_get_array(desc->page); if (IS_ERR(array)) { res = PTR_ERR(array); @@ -774,6 +780,8 @@ int nfs_do_filldir(nfs_readdir_descriptor_t *desc, void *dirent, *desc->dir_cookie = array->array[i+1].cookie; else *desc->dir_cookie = array->last_cookie; + if (ctx->duped != 0) + ctx->duped = 1; } if (array->eof_index >= 0) desc->eof = 1; @@ -805,6 +813,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, struct page *page = NULL; int status; struct inode *inode = desc->file->f_path.dentry->d_inode; + struct nfs_open_dir_context *ctx = desc->file->private_data; dfprintk(DIRCACHE, "NFS: uncached_readdir() searching for cookie %Lu\n", (unsigned long long)*desc->dir_cookie); @@ -818,6 +827,7 @@ int uncached_readdir(nfs_readdir_descriptor_t *desc, void *dirent, desc->page_index = 0; desc->last_cookie = *desc->dir_cookie; desc->page = page; + ctx->duped = 0; status = nfs_readdir_xdr_to_array(desc, page, inode); if (status < 0) diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 8b579be..b96fb99 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h @@ -99,9 +99,10 @@ struct nfs_open_context { struct nfs_open_dir_context { struct rpc_cred *cred; + unsigned long attr_gencount; __u64 dir_cookie; __u64 dup_cookie; - int duped; + signed char duped; }; /*