2008-01-19 15:10:40

by Justin Banks

[permalink] [raw]
Subject: Where's the create() pointer?

It's probably been this way for a long time, and I'm just noticing, but
I can't seem to find the create() (among others) pointer for NFS filesystems.

Specifically, If I look at sb->s_root->d_inode->i_op there's no create
there. How do I find it? I'm guessing that the ability to share mount
structures between multiple NFS mounts resulted in some kind of fake
superblock, but I just can't figure out where to find the functions.

-justinb

--
Justin Banks
BakBone Software
[email protected]


2008-01-19 16:13:15

by Trond Myklebust

[permalink] [raw]
Subject: Re: Where's the create() pointer?


On Sat, 2008-01-19 at 08:07 -0700, Justin Banks wrote:
> It's probably been this way for a long time, and I'm just noticing, but
> I can't seem to find the create() (among others) pointer for NFS filesystems.
>
> Specifically, If I look at sb->s_root->d_inode->i_op there's no create
> there. How do I find it? I'm guessing that the ability to share mount
> structures between multiple NFS mounts resulted in some kind of fake
> superblock, but I just can't figure out where to find the functions.

Why would you want to do this in the first place?

Anyhow, to answer the question: sb->s_root is not guaranteed to be a
real file on NFS. The real mountpoints are usually in the anonymous
dentry list.

Trond

2008-01-19 19:08:56

by Justin Banks

[permalink] [raw]
Subject: Re: Where's the create() pointer?

Trond Myklebust wrote
>
> On Sat, 2008-01-19 at 08:07 -0700, Justin Banks wrote:
> > It's probably been this way for a long time, and I'm just noticing, but
> > I can't seem to find the create() (among others) pointer for NFS filesystems.
> >
> > Specifically, If I look at sb->s_root->d_inode->i_op there's no create
> > there. How do I find it? I'm guessing that the ability to share mount
> > structures between multiple NFS mounts resulted in some kind of fake
> > superblock, but I just can't figure out where to find the functions.
>
> Why would you want to do this in the first place?

I'm just looking at trapping new creates on NFS, and so I need to find
the pointer.

> Anyhow, to answer the question: sb->s_root is not guaranteed to be a
> real file on NFS. The real mountpoints are usually in the anonymous
> dentry list.

Okay, I'll look there, thanks.

-justinb

--
Justin Banks
BakBone Software
[email protected]

2008-01-19 20:06:19

by Trond Myklebust

[permalink] [raw]
Subject: Re: Where's the create() pointer?


On Sat, 2008-01-19 at 12:02 -0700, Justin Banks wrote:
> Trond Myklebust wrote
> >
> > On Sat, 2008-01-19 at 08:07 -0700, Justin Banks wrote:
> > > It's probably been this way for a long time, and I'm just noticing, but
> > > I can't seem to find the create() (among others) pointer for NFS filesystems.
> > >
> > > Specifically, If I look at sb->s_root->d_inode->i_op there's no create
> > > there. How do I find it? I'm guessing that the ability to share mount
> > > structures between multiple NFS mounts resulted in some kind of fake
> > > superblock, but I just can't figure out where to find the functions.
> >
> > Why would you want to do this in the first place?
>
> I'm just looking at trapping new creates on NFS, and so I need to find
> the pointer.

What is your purpose in trapping creates on the client? Is this for
accounting purposes? If so, why wouldn't inotify, or even a systemtap
script suffice?

Anyhow, the simplest way to find the pointer is to grep for nfs_create
in /proc/kallsyms.

Trond

2008-01-20 03:37:51

by Justin Banks

[permalink] [raw]
Subject: Re: Where's the create() pointer?

Trond Myklebust wrote
>
> On Sat, 2008-01-19 at 12:02 -0700, Justin Banks wrote:
> > Trond Myklebust wrote
> > >
> > > On Sat, 2008-01-19 at 08:07 -0700, Justin Banks wrote:
> > > > It's probably been this way for a long time, and I'm just noticing, but
> > > > I can't seem to find the create() (among others) pointer for NFS filesystems.
> > > >
> > > > Specifically, If I look at sb->s_root->d_inode->i_op there's no create
> > > > there. How do I find it? I'm guessing that the ability to share mount
> > > > structures between multiple NFS mounts resulted in some kind of fake
> > > > superblock, but I just can't figure out where to find the functions.
> > >
> > > Why would you want to do this in the first place?
> >
> > I'm just looking at trapping new creates on NFS, and so I need to find
> > the pointer.
>
> What is your purpose in trapping creates on the client? Is this for
> accounting purposes? If so, why wouldn't inotify, or even a systemtap
> script suffice?

Could do inotify, except on a large-ish filesystem, it's really
unuseable, if you want to track everything that's going on.

> Anyhow, the simplest way to find the pointer is to grep for nfs_create
> in /proc/kallsyms.

Ugh. That's an ugly way, seems to me. Isn't there a way, given the
superblock? I mean, the VFS does it that way, doesn't it?

-justinb

--
Justin Banks
BakBone Software
[email protected]