* vfs-scale, d_revalidate from nfsd @ 2011-01-13 14:03 J. R. Okajima 2011-01-14 2:57 ` Nick Piggin 0 siblings, 1 reply; 11+ messages in thread From: J. R. Okajima @ 2011-01-13 14:03 UTC (permalink / raw) To: Nick Piggin; +Cc: linux-fsdevel, linux-kernel NFSD calls filesystem's ->d_revalidate() with the parameter nd == NULL. So every if (nd->flags & LOOKUP_RCU) return -ECHILD; code which was added to ->d_revalidate() of FS which supports NFS exporting will crash. If we rewrite it as if (nd && (nd->flags & LOOKUP_RCU)) return -ECHILD; the problem may not occur. But I am not sure whether lookup_one_len() call in NFSD support rcu-walk. J. R. Okajima ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-13 14:03 vfs-scale, d_revalidate from nfsd J. R. Okajima @ 2011-01-14 2:57 ` Nick Piggin 2011-01-14 3:03 ` Al Viro 2011-02-15 5:07 ` J. R. Okajima 0 siblings, 2 replies; 11+ messages in thread From: Nick Piggin @ 2011-01-14 2:57 UTC (permalink / raw) To: J. R. Okajima; +Cc: linux-fsdevel, linux-kernel On Fri, Jan 14, 2011 at 1:03 AM, J. R. Okajima <hooanon05@yahoo.co.jp> wrote: > > NFSD calls filesystem's ->d_revalidate() with the parameter nd == NULL. > So every > if (nd->flags & LOOKUP_RCU) > return -ECHILD; > code which was added to ->d_revalidate() of FS which supports NFS > exporting will crash. > > If we rewrite it as > if (nd && (nd->flags & LOOKUP_RCU)) > return -ECHILD; > the problem may not occur. > But I am not sure whether lookup_one_len() call in NFSD support rcu-walk. Ah, good catch. I'm going to change the d_revalidate API so it takes and inode and rcu-walk flag parameter to make it easier for filesystems to implement rcu-walk. That will take care of this NULL nd case. Thanks, Nick ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 2:57 ` Nick Piggin @ 2011-01-14 3:03 ` Al Viro 2011-01-14 3:12 ` Nick Piggin 2011-02-15 5:07 ` J. R. Okajima 1 sibling, 1 reply; 11+ messages in thread From: Al Viro @ 2011-01-14 3:03 UTC (permalink / raw) To: Nick Piggin; +Cc: J. R. Okajima, linux-fsdevel, linux-kernel On Fri, Jan 14, 2011 at 01:57:55PM +1100, Nick Piggin wrote: > On Fri, Jan 14, 2011 at 1:03 AM, J. R. Okajima <hooanon05@yahoo.co.jp> wrote: > > > > NFSD calls filesystem's ->d_revalidate() with the parameter nd == NULL. > > So every > > ? ? ? ?if (nd->flags & LOOKUP_RCU) > > ? ? ? ? ? ? ? ?return -ECHILD; > > code which was added to ->d_revalidate() of FS which supports NFS > > exporting will crash. > > > > If we rewrite it as > > ? ? ? ?if (nd && (nd->flags & LOOKUP_RCU)) > > ? ? ? ? ? ? ? ?return -ECHILD; > > the problem may not occur. > > But I am not sure whether lookup_one_len() call in NFSD support rcu-walk. > > Ah, good catch. > > I'm going to change the d_revalidate API so it takes and inode and rcu-walk > flag parameter to make it easier for filesystems to implement rcu-walk. > > That will take care of this NULL nd case. Oh, for fuck sake... Would you at least mind posting your API change description to fsdevel before going for it? ->d_revalidate() is one sick puppy and it's intimately involved in atomic open rewrite. Please, *please* don't make that shit even messier... ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 3:03 ` Al Viro @ 2011-01-14 3:12 ` Nick Piggin 2011-01-14 3:20 ` Al Viro 2011-01-15 3:47 ` J. R. Okajima 0 siblings, 2 replies; 11+ messages in thread From: Nick Piggin @ 2011-01-14 3:12 UTC (permalink / raw) To: Al Viro; +Cc: J. R. Okajima, linux-fsdevel, linux-kernel On Fri, Jan 14, 2011 at 2:03 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: > On Fri, Jan 14, 2011 at 01:57:55PM +1100, Nick Piggin wrote: >> On Fri, Jan 14, 2011 at 1:03 AM, J. R. Okajima <hooanon05@yahoo.co.jp> wrote: >> > >> > NFSD calls filesystem's ->d_revalidate() with the parameter nd == NULL. >> > So every >> > ? ? ? ?if (nd->flags & LOOKUP_RCU) >> > ? ? ? ? ? ? ? ?return -ECHILD; >> > code which was added to ->d_revalidate() of FS which supports NFS >> > exporting will crash. >> > >> > If we rewrite it as >> > ? ? ? ?if (nd && (nd->flags & LOOKUP_RCU)) >> > ? ? ? ? ? ? ? ?return -ECHILD; >> > the problem may not occur. >> > But I am not sure whether lookup_one_len() call in NFSD support rcu-walk. >> >> Ah, good catch. >> >> I'm going to change the d_revalidate API so it takes and inode and rcu-walk >> flag parameter to make it easier for filesystems to implement rcu-walk. >> >> That will take care of this NULL nd case. > > Oh, for fuck sake... Would you at least mind posting your API change > description to fsdevel before going for it? Of course. I was discussing it with Miklos yesterday too, but haven't finished getting a proposal together. The main idea here would be to just pass in a flags parameter rather thank poking in nd to get the rcu-walk status. That would solve this problem and also avoid nd for most filesystems that don't care about it. > ->d_revalidate() is one sick puppy and it's intimately involved in atomic > open rewrite. Please, *please* don't make that shit even messier... Right, I did agree with Miklos that using nd for passing rcu-walk status was going in the wrong direction with that API. Do you agree? ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 3:12 ` Nick Piggin @ 2011-01-14 3:20 ` Al Viro 2011-01-14 3:22 ` Al Viro 2011-01-14 3:29 ` Nick Piggin 2011-01-15 3:47 ` J. R. Okajima 1 sibling, 2 replies; 11+ messages in thread From: Al Viro @ 2011-01-14 3:20 UTC (permalink / raw) To: Nick Piggin; +Cc: J. R. Okajima, linux-fsdevel, linux-kernel On Fri, Jan 14, 2011 at 02:12:35PM +1100, Nick Piggin wrote: > The main idea here would be to just pass in a flags parameter rather > thank poking in nd to get the rcu-walk status. That would solve this > problem and also avoid nd for most filesystems that don't care about > it. Start with nd->flags getting passed explicitly, and be ready to see * call on the final stage of open split away and folded with ->lookup() and ->open()/->creat() * the rest of callers to lose nd completely. That's what's going to happen in the next cycle. BTW, why on the earth do you have that: static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) { if (nd->flags & LOOKUP_RCU) return -ECHILD; return -EPERM; } when the sole intent of that sucker is to have dentry of /.xattr (pinned in dcache and hashed all along) rejected on lookups from root? IOW, WTF bother with -ECHILD here at all? ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 3:20 ` Al Viro @ 2011-01-14 3:22 ` Al Viro 2011-01-14 3:29 ` Nick Piggin 1 sibling, 0 replies; 11+ messages in thread From: Al Viro @ 2011-01-14 3:22 UTC (permalink / raw) To: Nick Piggin; +Cc: J. R. Okajima, linux-fsdevel, linux-kernel > BTW, why on the earth do you have that: > static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) > { > if (nd->flags & LOOKUP_RCU) > return -ECHILD; > return -EPERM; > } > when the sole intent of that sucker is to have dentry of /.xattr (pinned > in dcache and hashed all along) rejected on lookups from root? IOW, WTF > bother with -ECHILD here at all? PS: that's fs/reiserfs/xattr.c ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 3:20 ` Al Viro 2011-01-14 3:22 ` Al Viro @ 2011-01-14 3:29 ` Nick Piggin 2011-01-14 3:38 ` Al Viro 1 sibling, 1 reply; 11+ messages in thread From: Nick Piggin @ 2011-01-14 3:29 UTC (permalink / raw) To: Al Viro; +Cc: J. R. Okajima, linux-fsdevel, linux-kernel On Fri, Jan 14, 2011 at 2:20 PM, Al Viro <viro@zeniv.linux.org.uk> wrote: > On Fri, Jan 14, 2011 at 02:12:35PM +1100, Nick Piggin wrote: >> The main idea here would be to just pass in a flags parameter rather >> thank poking in nd to get the rcu-walk status. That would solve this >> problem and also avoid nd for most filesystems that don't care about >> it. > > Start with nd->flags getting passed explicitly, and be ready to see > * call on the final stage of open split away and folded with > ->lookup() and ->open()/->creat() > * the rest of callers to lose nd completely. > That's what's going to happen in the next cycle. OK that sounds nice. I'll see what it looks like and definitely run any proposed API change past you and fsdevel. > BTW, why on the earth do you have that: > static int xattr_hide_revalidate(struct dentry *dentry, struct nameidata *nd) > { > if (nd->flags & LOOKUP_RCU) > return -ECHILD; > return -EPERM; > } > when the sole intent of that sucker is to have dentry of /.xattr (pinned > in dcache and hashed all along) rejected on lookups from root? IOW, WTF > bother with -ECHILD here at all? That's true. I guess I always have a weakness for doing "just one little easy optimisation/simplification" folded into patch that is supposed to be more mechanical changes :) I did have exactly that in the patch initially, but I decided it's better just to do everything with -ECHILD first. That also gives the -ECHILD paths a bit more workout before fs conversions are done, too. ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 3:29 ` Nick Piggin @ 2011-01-14 3:38 ` Al Viro 0 siblings, 0 replies; 11+ messages in thread From: Al Viro @ 2011-01-14 3:38 UTC (permalink / raw) To: Nick Piggin; +Cc: J. R. Okajima, linux-fsdevel, linux-kernel On Fri, Jan 14, 2011 at 02:29:11PM +1100, Nick Piggin wrote: > > ? ? ? ?if (nd->flags & LOOKUP_RCU) > > ? ? ? ? ? ? ? ?return -ECHILD; > > ? ? ? ?return -EPERM; > > } > > when the sole intent of that sucker is to have dentry of /.xattr (pinned > > in dcache and hashed all along) rejected on lookups from root? ?IOW, WTF > > bother with -ECHILD here at all? > > That's true. I guess I always have a weakness for doing "just one > little easy optimisation/simplification" folded into patch that is supposed > to be more mechanical changes :) I did have exactly that in the patch > initially, but I decided it's better just to do everything with -ECHILD first. > > That also gives the -ECHILD paths a bit more workout before > fs conversions are done, too. Not unless your test loads include trying to access pathnames like /.xattr/whatever on reiserfs and watching those attempts fail... ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 3:12 ` Nick Piggin 2011-01-14 3:20 ` Al Viro @ 2011-01-15 3:47 ` J. R. Okajima 2011-01-15 18:11 ` Nick Piggin 1 sibling, 1 reply; 11+ messages in thread From: J. R. Okajima @ 2011-01-15 3:47 UTC (permalink / raw) To: Nick Piggin; +Cc: Al Viro, linux-fsdevel, linux-kernel Nick Piggin: > Of course. I was discussing it with Miklos yesterday too, but haven't > finished getting a proposal together. > > The main idea here would be to just pass in a flags parameter rather > thank poking in nd to get the rcu-walk status. That would solve this > problem and also avoid nd for most filesystems that don't care about > it. Let me make sure. - add a flag parameter to ->d_revalidate. not remove the panameter nd. - FS ->d_revalidate() will (probably) return -ECHILD when LOOKUP_RCU is set. Right? Then how about the callers? Current sequence is - NFSD calls lookup_one_len - __lookup_hash - do_revalidate - d_revalidate { status = dentry->d_op->d_revalidate(dentry, nd); if (status == -ECHILD) { ;;; status = dentry->d_op->d_revalidate(dentry, nd); } } There will be no change in NFSD but VFS d_revalidate(), such like this? VFS d_revalidate() { if (nd) { dentry->d_op->d_revalidate(dentry, nd, nd->flags); if (-ECHILD) { dentry->d_op->d_revalidate(dentry, nd, nd->flags); } } else return dentry->d_op->d_revalidate(dentry, NULL, 0); } J. R. Okajima ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-15 3:47 ` J. R. Okajima @ 2011-01-15 18:11 ` Nick Piggin 0 siblings, 0 replies; 11+ messages in thread From: Nick Piggin @ 2011-01-15 18:11 UTC (permalink / raw) To: J. R. Okajima; +Cc: Al Viro, linux-fsdevel, linux-kernel On Sat, Jan 15, 2011 at 2:47 PM, J. R. Okajima <hooanon05@yahoo.co.jp> wrote: > > Nick Piggin: >> Of course. I was discussing it with Miklos yesterday too, but haven't >> finished getting a proposal together. >> >> The main idea here would be to just pass in a flags parameter rather >> thank poking in nd to get the rcu-walk status. That would solve this >> problem and also avoid nd for most filesystems that don't care about >> it. > > Let me make sure. > - add a flag parameter to ->d_revalidate. not remove the panameter nd. > - FS ->d_revalidate() will (probably) return -ECHILD when LOOKUP_RCU is > set. > Right? > > > Then how about the callers? > Current sequence is > - NFSD calls lookup_one_len > - __lookup_hash > - do_revalidate > - d_revalidate > { > status = dentry->d_op->d_revalidate(dentry, nd); > if (status == -ECHILD) { > ;;; > status = dentry->d_op->d_revalidate(dentry, nd); > } > } > > There will be no change in NFSD but VFS d_revalidate(), such like this? > VFS d_revalidate() > { > if (nd) { > dentry->d_op->d_revalidate(dentry, nd, nd->flags); > if (-ECHILD) { > dentry->d_op->d_revalidate(dentry, nd, nd->flags); > } > } else > return dentry->d_op->d_revalidate(dentry, NULL, 0); > } Yes that's the idea. I also want to pass a struct inode * parameter, to facilitate rcu-walk implementations that want to check the inode (such as fuse). ^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: vfs-scale, d_revalidate from nfsd 2011-01-14 2:57 ` Nick Piggin 2011-01-14 3:03 ` Al Viro @ 2011-02-15 5:07 ` J. R. Okajima 1 sibling, 0 replies; 11+ messages in thread From: J. R. Okajima @ 2011-02-15 5:07 UTC (permalink / raw) To: Nick Piggin; +Cc: linux-fsdevel, linux-kernel Nick Piggin: > On Fri, Jan 14, 2011 at 1:03 AM, J. R. Okajima <hooanon05@yahoo.co.jp> wrot= > e: > > NFSD calls filesystem's ->d_revalidate() with the parameter nd =3D=3D NUL= > L. ::: > Ah, good catch. > > I'm going to change the d_revalidate API so it takes and inode and rcu-walk > flag parameter to make it easier for filesystems to implement rcu-walk. > > That will take care of this NULL nd case. While you might already know there are similar parts in fs/namei.c, I'd like to write here just to make sure. - nfsd calls lookup_one_len() - lookup_one_len() + __lookup_hash() with nd=NULL + do_revalidate(dentry, nd) or/and + d_alloc_and_lookup(base, name, nd) - do_revalidate(dentry, nd) + status = d_revalidate(dentry, nd) + d_op->d_revalidate(dentry, nd) <-- previous mail pointed out + if (status < 0) { if (!(nd->flags & LOOKUP_RCU)) <-- this also needs fixing dput(dentry); } else { if (nameidata_dentry_drop_rcu_maybe(nd, dentry)) <-- and here return ERR_PTR(-ECHILD); } And if ->d_revalidate() can return ECHILD when 'nd' is NULL, then nameidata_dentry_drop_rcu() call in d_revalidate() needs fixing too. I don't think ->lookup(inode, dentry, nd) call in d_alloc_and_lookup() is a problem since every FS which supports NFS-exporting never refer 'nd' already. J. R. Okajima ^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2011-02-15 5:07 UTC | newest] Thread overview: 11+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2011-01-13 14:03 vfs-scale, d_revalidate from nfsd J. R. Okajima 2011-01-14 2:57 ` Nick Piggin 2011-01-14 3:03 ` Al Viro 2011-01-14 3:12 ` Nick Piggin 2011-01-14 3:20 ` Al Viro 2011-01-14 3:22 ` Al Viro 2011-01-14 3:29 ` Nick Piggin 2011-01-14 3:38 ` Al Viro 2011-01-15 3:47 ` J. R. Okajima 2011-01-15 18:11 ` Nick Piggin 2011-02-15 5:07 ` J. R. Okajima
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox