MINI SHELL

Server : Apache/2.2.2 (Fedora)
System : Linux App1.pathumtani.go.th 2.6.20-1.2320.fc5smp #1 SMP Tue Jun 12 19:40:16 EDT 2007 i686
User : apache ( 48)
PHP Version : 5.2.9
Disable Function : NONE
Directory :  /usr/share/systemtap/tapset/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : //usr/share/systemtap/tapset/nfsd.stp
%{
#include <linux/sunrpc/svc.h>
#include <linux/nfsd/nfsd.h>
#include <linux/nfsd/cache.h>
#include <linux/nfsd/xdr.h>
#include <linux/nfsd/xdr3.h>
%}

%{
/*Get file handle from struct svc_fh */
char * fh_fmt(struct svc_fh * fhp)
{
	 struct knfsd_fh *fh = &fhp->fh_handle;

	static char buf[80];
	sprintf(buf, "%d: %08x %08x %08x %08x %08x %08x",
		fh->fh_size,
		fh->fh_base.fh_pad[0],
		fh->fh_base.fh_pad[1],
		fh->fh_base.fh_pad[2],
		fh->fh_base.fh_pad[3],
		fh->fh_base.fh_pad[4],
		fh->fh_base.fh_pad[5]);
	return buf;
}

%}

/*
 *1 : nfsd.proc2.lookup
 *2 : nfsd.proc3.lookup
 *3 : nfsd.proc2.read
 *4 : nfsd.proc3.read
 *5 : nfsd.proc2.write
 *6 : nfsd.proc3.write
 *7 : nfsd.proc3.commit
 *8 : nfsd.proc2.create
 *9 : nfsd.proc3.create
 *10: nfsd.proc2.remove
 *11: nfsd.proc3.remove
 *12 :nfsd.proc2.rename.ffh
 *13 :nfsd.proc2.rename.tfh
 *14 :nfsd.proc3.rename.ffh
 *15 :nfsd.proc3.rename.tfh
 */

/*Get file handler from argp,the index indicates the type of argp*/
function __get_fh:long(argp:long,index:long) %{ /* pure */
	int index = (int)((long)THIS->index);
	struct nfsd_diropargs * argp = NULL ;
	struct nfsd3_diropargs * argp3 = NULL ;
	struct nfsd_readargs * argpr = NULL;
	struct nfsd3_readargs * argpr3 = NULL;
	struct nfsd_writeargs * argpw = NULL;
	struct nfsd3_writeargs * argpw3 = NULL;
	struct nfsd3_commitargs * argpc3 = NULL;
	struct nfsd_createargs *argpcr = NULL;
	struct nfsd3_createargs *argpcr3 = NULL;
	struct nfsd_diropargs *argpre = NULL;
	struct nfsd3_diropargs *argpre3 = NULL;
	struct nfsd_renameargs *argpren = NULL;
	struct nfsd3_renameargs *argpren3 = NULL;
	struct svc_fh * fhp = NULL;
	char * buf;

	switch(index)
	{
	case 1: argp = (struct nfsd_diropargs *)((long)THIS->argp);
		fhp = &argp->fh;
		break;
	case 2: argp3 = (struct nfsd3_diropargs *)((long)THIS->argp);
		fhp = &argp3->fh;
		break;
	case 3: argpr = (struct nfsd_readargs * )((long)THIS->argp);
		fhp = &argpr->fh;
		break;
	case 4: argpr3 = (struct nfsd3_readargs * )((long)THIS->argp);
		fhp = &argpr3->fh;
		break;
	case 5: argpw = (struct nfsd_writeargs * )((long)THIS->argp);
		fhp = &argpw->fh;
		break;
	case 6: argpw3 = (struct nfsd3_writeargs * )((long)THIS->argp);
		fhp = &argpw3->fh;
		break;
	case 7: argpc3 = (struct nfsd3_commitargs * )((long)THIS->argp);
		fhp = &argpc3->fh;
		break;
	case 8: argpcr = (struct nfsd_createargs * )((long)THIS->argp);
		fhp = &argpcr->fh;
		break;
	case 9: argpcr3 = (struct nfsd3_createargs * )((long)THIS->argp);
		fhp = &argpcr3->fh;
		break;
	case 10: argpre = (struct nfsd_diropargs * )((long)THIS->argp);
		fhp = &argpre->fh;
		break;
	case 11: argpre3 = (struct nfsd3_diropargs * )((long)THIS->argp);
		fhp = &argpre3->fh;
		break;
	case 12: argpren = (struct nfsd_renameargs * )((long)THIS->argp);
		fhp = &argpren->ffh;
		break;
	case 13: argpren = (struct nfsd_renameargs * )((long)THIS->argp);
		fhp = &argpren->tfh;
		break;
	case 14: argpren3 = (struct nfsd3_renameargs * )((long)THIS->argp);
		fhp = &argpren3->ffh;
		break;
	case 15: argpren3 = (struct nfsd3_renameargs * )((long)THIS->argp);
		fhp = &argpren3->tfh;
		break;
	}
	
	if(fhp == NULL)
	{
		_stp_printf("the fhp is NULL");
		return;
	}
	else
	{
	/*	buf = fh_fmt(fhp);
		strlcpy (THIS->__retvalue,buf,80);*/
		THIS->__retvalue = (long)fhp;
	}
%}
/*Get file handler from struct svc_fh , it will call
fh_fmt function*/
function __svc_fh:string(fh :long) %{  /* pure */
	struct svc_fh * fhp = (struct svc_fh *) (THIS->fh);
	char * buf ;
	
	buf =  fh_fmt(fhp); 	
	strlcpy (THIS->__retvalue,buf,80);
%}

function p_long:long(cnt:long) %{ /* pure */
	unsigned long * count = (unsigned long *)((long)THIS->cnt);
	
	THIS->__retvalue = *count;
%}
/*
*probe nfsd.dispatch
*  Fires when server receives a NFS operation from client 
*
*Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  xid : transmission id
*  prog : program number
*  proc : procedure number
*/
probe nfsd.dispatch = kernel.function("nfsd_dispatch")?,
                      module("nfsd").function("nfsd_dispatch") ?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
	version = $rqstp->rq_vers

	xid = $rqstp->rq_xid
	prog = $rqstp->rq_prog
	proc = $rqstp->rq_proc

	name = "nfsd.dispatch"
	argstr = sprintf("%d,%d",version,proto)
}

probe nfsd.dispatch.return = kernel.function("nfsd_dispatch").return?,
                      module("nfsd").function("nfsd_dispatch").return ?
{
	name = "nfsd.dispatch.return"
	retstr = sprintf("%d",$return)
}

probe nfsd.proc.entries = nfsd.proc.lookup,
                          nfsd.proc.read,
                          nfsd.proc.write,
                          nfsd.proc.commit,
                          nfsd.proc.compound,
                          nfsd.proc.remove,
                          nfsd.proc.rename,
			  nfsd.proc.create
{} 

probe nfsd.proc.return = nfsd.proc.lookup.return,
                          nfsd.proc.read.return,
                          nfsd.proc.write.return,
                          nfsd.proc.commit.return,
                          nfsd.proc.compound.return,
                          nfsd.proc.remove.return,
                          nfsd.proc.rename.return,
                          nfsd.proc.create.return
{} 

/*
*probe nfsd.proc.lookup
*  Fires when client opens/searchs file on server
*
*Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  fh  : file handle of parent dir (the first part is the length of the file handle)
*  filename : file name 
*  filelen  : the length of file name
*/
probe nfsd.proc.lookup = nfsd.proc2.lookup,
                         nfsd.proc3.lookup
{}

probe nfsd.proc.lookup.return = nfsd.proc2.lookup.return,
                         nfsd.proc3.lookup.return
{}

probe nfsd.proc2.lookup = kernel.function("nfsd_proc_lookup") ?,
                          module("nfsd").function("nfsd_proc_lookup") ?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 2
	fh = __get_fh($argp,1)

	filename = kernel_string($argp->name)
	filelen = $argp->len

	name = "nfsd.proc2.lookup"
	argstr = sprintf("%s",filename)
}

 
probe nfsd.proc2.lookup.return = kernel.function("nfsd_proc_lookup").return ?,
                          module("nfsd").function("nfsd_proc_lookup").return ?
{
	name = "nfsd.proc2.lookup.return"
	version = 2
	retstr = sprintf("%d",$return)
}

probe nfsd.proc3.lookup = kernel.function("nfsd3_proc_lookup") ?,
                          module("nfsd").function("nfsd3_proc_lookup") ?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,1)

	filename = kernel_string($argp->name)
	filelen = $argp->len

	name = "nfsd.proc3.lookup"
	argstr = sprintf("%s",filename)
} 

probe nfsd.proc3.lookup.return = kernel.function("nfsd3_proc_lookup").return ?,
                          module("nfsd").function("nfsd3_proc_lookup").return ?
{
	name = "nfsd.proc3.lookup.return"
	version = 3
	retstr = sprintf("%d",$return)
}


/*
*probe nfsd.proc.read
*  Fires when client read file on server
*
*Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  fh  : file handle (the first part is the length of the file handle)
*  size:
*  count : read bytes
*  offset : the offset of file 
*  vec : struct kvec ,includes buf address in kernel address
         and length of each buffer
*  vlen : read blocks 
*/
probe nfsd.proc.read = nfsd.proc2.read,
                       nfsd.proc3.read
{}

probe nfsd.proc.read.return = nfsd.proc2.read.return,
                       nfsd.proc3.read.return
{

}

probe nfsd.proc2.read = kernel.function("nfsd_proc_read")?,
                        module("nfsd").function("nfsd_proc_read")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 2
	fh = __get_fh($argp,3)

	count = $argp->count 
	offset = $argp->offset 
	vec = $argp->vec
	vlen = $argp->vlen

	name = "nfsd.proc2.read"
	argstr = sprintf("%d,%d",count,offset)

        size = count
        units = "bytes"
}

 
probe nfsd.proc2.read.return = kernel.function("nfsd_proc_read").return?,
                        module("nfsd").function("nfsd_proc_read").return?
{
	name = "nfsd.proc2.read.return"
	version = 2
	retstr = sprintf("%d",$return)
}

probe nfsd.proc3.read = kernel.function("nfsd3_proc_read")?,
                        module("nfsd").function("nfsd3_proc_read")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,4)

	count = $argp->count 
	offset = $argp->offset 
	vec = $argp->vec
	vlen = $argp->vlen

	name = "nfsd.proc3.read"
	argstr = sprintf("%d,%d",count,offset)

        size = count
        units = "bytes"
}

 
probe nfsd.proc3.read.return = kernel.function("nfsd3_proc_read").return?,
                        module("nfsd").function("nfsd3_proc_read").return?
{
	name = "nfsd.proc3.read.return"
	version = 3
	retstr = sprintf("%d",$return)
}

/*
*probe nfsd.proc.write
*  Fires when client writes data to  file on server
*
*Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  fh  : file handle (the first part is the length of the file handle)
*  size:
*  count : read bytes
*  offset : the offset of file 
*  vec : struct kvec ,includes buf address in kernel address
         and length of each buffer
*  vlen : read blocks 
*  stable : argp->stable(only in nfs.proc3.write)
*/
probe nfsd.proc.write = nfsd.proc2.write,
                       nfsd.proc3.write
{}

probe nfsd.proc.write.return = nfsd.proc2.write.return,
                       nfsd.proc3.write.return
{

}

probe nfsd.proc2.write = kernel.function("nfsd_proc_write")?,
                        module("nfsd").function("nfsd_proc_write")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 2
	fh = __get_fh($argp,5)

	count = $argp->len
	offset = $argp->offset 
	vec = $argp->vec
	vlen = $argp->vlen

	name = "nfsd.proc2.write"
	argstr = sprintf("%d,%d",count,offset)

        size = count
        units = "bytes"
}

 
probe nfsd.proc2.write.return = kernel.function("nfsd_proc_write").return?,
                        module("nfsd").function("nfsd_proc_write").return?
{
	name = "nfsd.proc2.write.return"
	version = 2
	retstr = sprintf("%d",$return)
}

probe nfsd.proc3.write = kernel.function("nfsd3_proc_write")?,
                        module("nfsd").function("nfsd3_proc_write")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,6)

	count = $argp->count 
	offset = $argp->offset 
	vec = $argp->vec
	vlen = $argp->vlen
	stable = $argp->stable

	name = "nfsd.proc3.write"
	argstr = sprintf("%d,%d",count,offset)

        size = count
        units = "bytes"
}

 
probe nfsd.proc3.write.return = kernel.function("nfsd3_proc_write").return?,
                        module("nfsd").function("nfsd3_proc_write").return?
{
	name = "nfsd.proc3.write.return"
	version = 3
	retstr = sprintf("%d",$return)
}

/*
*probe nfsd.proc.commit
*  Fires when client does a commit operation,which is
*  used to flush the data written by async operation before
*  to disk
*
*Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  fh  : file handle (the first part is the length of the file handle)
*  size:
*  count : read bytes
*  offset : the offset of file 
*/
probe nfsd.proc.commit =  nfsd.proc3.commit
{}

probe nfsd.proc.commit.return = nfsd.proc3.commit.return
{

}

probe nfsd.proc3.commit = kernel.function("nfsd3_proc_commit")?,
                        module("nfsd").function("nfsd3_proc_commit")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,7) 

	count = $argp->count 
	offset = $argp->offset 

	name = "nfsd.proc3.commit"
	argstr = sprintf("%d,%d",count,offset)

        size = count
        units = "bytes"
}

probe nfsd.proc3.commit.return = kernel.function("nfsd3_proc_commit").return?,
                        module("nfsd").function("nfsd3_proc_commit").return?
{
	name = "nfsd.proc3.commit.return"
	version = 3
	retstr = sprintf("%d",$return)
}

/*
*probe nfsd.proc.create
* Fires when clients create a file on server side.
*
* Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  fh  : file handle (the first part is the length of the file handle)
*  filename : file name
*  filelen : length of file name
*/
probe nfsd.proc.create = nfsd.proc2.create,
                         nfsd.proc3.create
{}
probe nfsd.proc.create.return = nfsd.proc2.create.return,
                                nfsd.proc3.create.return
{}

probe nfsd.proc2.create = kernel.function("nfsd_proc_create")?,
                         module("nfsd").function("nfsd_proc_create")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 2
	fh = __get_fh($argp,8)

	filename  = kernel_string($argp->name) 
	filelen = $argp->len

	name = "nfsd.proc2.create"
	argstr = sprintf("%s",filename)
}

probe nfsd.proc2.create.return =  kernel.function("nfsd_proc_create").return?,
                                 module("nfsd").function("nfsd_proc_create").return?
{
	name = "nfsd.proc2.create.return"
	version = 2
	retstr = sprintf("%d",$return)
}

probe nfsd.proc3.create = kernel.function("nfsd3_proc_create")?,
                         module("nfsd").function("nfsd3_proc_create")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,9)

	filename  = kernel_string($argp->name) 
	filelen = $argp->len
	
	name = "nfsd.proc3.create"
	argstr = sprintf("%s",filename)
}

probe nfsd.proc3.create.return =  kernel.function("nfsd3_proc_create").return?,
                                 module("nfsd").function("nfsd3_proc_create").return?
{
	name = "nfsd.proc3.create.return"
	version = 3
	retstr = sprintf("%d",$return)
}

/*
*probe nfsd.proc.remove
* Fires when clients removes a file on server side.
*
* Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  fh  : file handle (the first part is the length of the file handle)
*  filename : file name
*  filelen : length of file name
*/
probe nfsd.proc.remove = nfsd.proc2.remove,
                         nfsd.proc3.remove
{}
probe nfsd.proc.remove.return = nfsd.proc2.remove.return,
                                nfsd.proc3.remove.return
{}

probe nfsd.proc2.remove = kernel.function("nfsd_proc_remove")?,
                         module("nfsd").function("nfsd_proc_remove")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 2
	fh = __get_fh($argp,10)

	filename  = kernel_string($argp->name) 
	filelen = $argp->len

	name = "nfsd.proc2.remove"
	argstr = sprintf("%s",filename)
}

probe nfsd.proc2.remove.return =  kernel.function("nfsd_proc_remove").return?,
                                 module("nfsd").function("nfsd_proc_remove").return?
{
	name = "nfsd.proc2.remove.return"
	version = 2
	retstr = sprintf("%d",$return)
}

probe nfsd.proc3.remove = kernel.function("nfsd3_proc_remove")?,
                         module("nfsd").function("nfsd3_proc_remove")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,11)

	filename  = kernel_string($argp->name) 
	filelen = $argp->len
	
	name = "nfsd.proc3.remove"
	argstr = sprintf("%s",filename)
}

probe nfsd.proc3.remove.return =  kernel.function("nfsd3_proc_remove").return?,
                                 module("nfsd").function("nfsd3_proc_remove").return?
{
	name = "nfsd.proc3.remove.return"
	version = 3
	retstr = sprintf("%d",$return)
}

/*
* probe nfsd.proc.rename
*  Fires when clients rename a file on server side
*
* Arguments:
*   fh : file handler of old path
*   tfh : file handler of new path
*   filename : old file name 
*   tname : new file name
*   flen : length of old file name 
*   tlen : length of new file name
*/
probe nfsd.proc.rename = nfsd.proc2.rename,
                         nfsd.proc3.rename
{}

probe nfsd.proc.rename.return = nfsd.proc2.rename.return,
                         nfsd.proc3.rename.return
{}

probe nfsd.proc2.rename =  kernel.function("nfsd_proc_rename")?,
                           module("nfsd").function("nfsd_proc_rename")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 2
	fh = __get_fh($argp,12)
	tfh = __get_fh($argp,13)

	filename  = kernel_string($argp->fname) 
	filelen = $argp->flen
	tname = kernel_string($argp->tname)
	tlen = $argp->tlen

	name = "nfsd.proc2.rename"
	argstr = sprintf("%s,%s",filename,tname)
}

probe nfsd.proc2.rename.return =  kernel.function("nfsd_proc_rename").return?,
                           module("nfsd").function("nfsd_proc_rename").return?
{
	name = "nfsd.proc2.rename.return"
	version = 2
	retstr = sprintf("%d",$return)
}

probe nfsd.proc3.rename =  kernel.function("nfsd3_proc_rename")?,
                           module("nfsd").function("nfsd3_proc_rename")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 3
	fh = __get_fh($argp,14)
	tfh = __get_fh($argp,15)

	filename  = kernel_string($argp->fname) 
	filelen = $argp->flen
	tname = kernel_string($argp->tname)
	tlen = $argp->tlen

	name = "nfsd.proc3.rename"
	argstr = sprintf("%s,%s",filename,tname)
}

probe nfsd.proc3.rename.return =  kernel.function("nfsd3_proc_rename").return?,
                           module("nfsd").function("nfsd3_proc_rename").return?
{
	name = "nfsd.proc3.rename.return"
	version = 3
	retstr = sprintf("%d",$return)
}
/*
*probe nfsd.proc.compound
*   Fires when the server received a NFSV4 operation from client
*
*Arguments:
*  client_ip : the ip address of client
*  proto : transfer protocol
*  version : nfs version
*  num : number of file operation in this RPC operation 
*  op : head of operation list in this compound execution
*/
probe nfsd.proc.compound = nfsd.proc4.compound
{}

probe nfsd.proc.compound.return = nfsd.proc4.compound.return
{}

probe nfsd.proc4.compound = kernel.function("nfsd4_proc_compound")?,
                            module("nfsd").function("nfsd4_proc_compound")?
{
	client_ip = $rqstp->rq_addr->sin_addr->s_addr
	proto = $rqstp->rq_prot
        version = 4

	num = $args->opcnt
	op = $args->ops
	
	name = "nfsd.proc4.cmpound"
	argstr = sprintf("%d",num)
}

probe nfsd.proc4.compound.return = kernel.function("nfsd4_proc_compound").return?,
                            module("nfsd").function("nfsd4_proc_compound").return?
{
	name = "nfsd.proc4.compound.return"
	version = 4
	retstr = sprintf("%d",$return)
}

probe nfsd.entries = nfsd.open,
	             nfsd.read,
                     nfsd.write,
                     nfsd.lookup,
                     nfsd.commit,
                     nfsd.create,
                     nfsd.createv3,
                     nfsd.unlink,
                     nfsd.rename,
                     nfsd.close
{}

probe nfsd.return = nfsd.open.return,
	             nfsd.read.return,
                     nfsd.write.return,
                     nfsd.lookup.return,
                     nfsd.commit.return,
                     nfsd.create.return,
                     nfsd.createv3.return,
                     nfsd.unlink.return,
                     nfsd.rename.return
{}
/*probe nfsd.open
*  Fires when server opens a file
*
* Arguments:
*  fh  : file handle (the first part is the length of the file handle)
*  access : indicates the type of open(read/write/commit/readdir...) 
*  type : type of file(regular file or dir)
*/
probe nfsd.open = kernel.function("nfsd_open") ?,
                  module("nfsd").function("nfsd_open")?
{
	fh = __svc_fh($fhp)

	access = $access
	type = $type

	name = "nfsd.open"
	argstr = sprintf("%d",access)
}

probe nfsd.open.return = kernel.function("nfsd_open").return ?,
                  module("nfsd").function("nfsd_open").return?
{
	name = "nfsd.open.return"
	retstr = sprintf("%d",$return)
}

/*probe nfsd.close
*  Fires when server closes a file
*
* Arguments:
* filename : file name
*/
probe nfsd.close = kernel.function("nfsd_close")?,
                   module("nfsd").function("nfsd_close")?
{
	filename = kernel_string($filp->f_dentry->d_name->name)

	name = "nfsd.close"
	argstr = sprintf("%s",filename)
}

probe nfsd.close.return = kernel.function("nfsd_close").return?,
                   module("nfsd").function("nfsd_close").return?
{}
/*probe nfsd.read
*  Fires when server reads data from a file
*
* Arguments:
*  fh  : file handle (the first part is the length of the file handle)
*  file : argument file,indicates if the file has been opened.
*  size:
*  count : read bytes
*  offset : the offset of file 
*  vec : struct kvec ,includes buf address in kernel address
         and length of each buffer
*  vlen : read blocks 
*/
probe nfsd.read = kernel.function("nfsd_read") ?,
                  module("nfsd").function("nfsd_read")?
{
	fh = __svc_fh($fhp)

	file = $file
	count = p_long($count)
	offset = $offset
	vec = $vec
	vlen = $vlen

	name = "nfsd.read"
	argstr = sprintf("%d,%d",count,offsee)

	size = count
	units = "bytes"
} 

probe nfsd.read.return = kernel.function("nfsd_read").return ?,
                  module("nfsd").function("nfsd_read").return?
{
	name = "nfsd.read.return"
	retstr = sprintf("%d",$return)
}

/*probe nfsd.write
*  Fires when server writes data to a file
*
* Arguments:
*  fh  : file handle (the first part is the length of the file handle)
*  file : argument file,indicates if the file has been opened.
*  size:
*  count : read bytes
*  offset : the offset of file 
*  vec : struct kvec ,includes buf address in kernel address
         and length of each buffer
*  vlen : read blocks 
*/
probe nfsd.write = kernel.function("nfsd_write")?,
                   module("nfsd").function("nfsd_write")?
{
	fh = __svc_fh($fhp)

	file = $file
	count = $cnt
	offset = $offset
	vec = $vec
	vlen = $vlen

	name = "nfsd.write"
	argstr = sprintf("%d,%d",count,offsee)

	size = count
	units = "bytes"
}

probe nfsd.write.return = kernel.function("nfsd_write").return?,
                   module("nfsd").function("nfsd_write").return?
{
	name = "nfsd.write.return"
	retstr = sprintf("%d",$return)
}

/*probe nfsd.commit
*  Fires when server commits all pending writes to stable storage.  
*
* Arguments:
*  fh  : file handle (the first part is the length of the file handle)
*  flag : indicates whether this execution is a sync operation
*  size:
*  count : read bytes
*  offset : the offset of file
*/
probe nfsd.commit = kernel.function("nfsd_commit")?,
                    module("nfsd").function("nfsd_commit")?
{
	fh = __svc_fh($fhp)

	count = $count
	offset = $offset
	flag = $fhp->fh_export->ex_flags

	name = "nfsd.commit"
	argstr = sprintf("%d,%d",count,offset)

	size = count 
	units = "bytes"
}

probe nfsd.commit.return = kernel.function("nfsd_commit").return?,
                    module("nfsd").function("nfsd_commit").return ?
{
	name = "nfsd.commit.return"
	retstr = sprintf("%d",$return)
}

/*
*probe nfsd.lookup
*  Fires when client opens/searchs file on server
*
*Arguments:
*  fh  : file handle of parent dir(the first part is the length of the file handle)
*  filename : file name 
*  filelen  : the length of file name
*/

probe nfsd.lookup = kernel.function("nfsd_lookup")?,
                    module("nfsd").function("nfsd_lookup")?
{
	fh = __svc_fh($fhp)

	filename = kernel_string($name)
	filelen = $len

	name = "nfsd.lookup"
	argstr = sprintf("%s",filename)
}

probe nfsd.lookup.return = kernel.function("nfsd_lookup").return?,
                            module("nfsd").function("nfsd_lookup").return?
{
	name = "nfsd.lookup.return"
	retstr = sprintf("%d",$return)
}
/*
* probe nfsd.create
*  Fires when client creates a file(regular,dir,device,fifo) on server side,
*  sometimes nfsd will call nfsd_create_v3 instead of this function
*
* Arguments:
*
*  fh  : file handle (the first part is the length of the file handle)
*  filename : file name 
*  filelen  : the length of file name
*  type : file type(regular,dir,device,fifo ...)
*  iap_valid: Attribute flags
*  iap_mode : file access mode
*/
probe nfsd.create = kernel.function("nfsd_create")?,         
                    module("nfsd").function("nfsd_create")?
{
	fh = __svc_fh($fhp)

	filename = kernel_string($fname)
	filelen = $flen
	type = $type
	iap_valid = $iap->ia_valid
	iap_mode = $iap->ia_mode

	name = "nfsd.create"
	argstr = sprintf("%s,%d",filename,type)
}

probe nfsd.create.return = kernel.function("nfsd_create").return?,         
                    module("nfsd").function("nfsd_create").return?
{
	name = "nfsd.create.return"
	retstr = sprintf("%d",$return)
}

/*
* probe nfsd.createv3
*  Fires when client creates a regular file or set file attributes on server side,
*  only called by nfsd3_proc_create and nfsd4_open(op_claim_type is NFS4_OPEN_CLAIM_NULL)
*
* Arguments:
*
*  fh  : file handle (the first part is the length of the file handle)
*  filename : file name 
*  filelen  : the length of file name
*  iap_valid: Attribute flags
*  iap_mode : file access mode
*  createmode : create mode .The possible values could be:
*	NFS3_CREATE_EXCLUSIVE,NFS3_CREATE_UNCHECKED,NFS3_CREATE_GUARDED
*  truncp : trunp arguments, indicates if the file shouldbe truncate
*  verfier :  file attributes (atime,mtime,mode).It's used to reset file
              attributes for CREATE_EXCLUSIVE
*/
probe nfsd.createv3 = kernel.function("nfsd_create_v3")?,         
                    module("nfsd").function("nfsd_create_v3")?
{
	fh = __svc_fh($fhp)

	filename = kernel_string($fname)
	filelen = $flen
	iap_valid = $iap->ia_valid
	iap_mode = $iap->ia_mode
	truncp = $truncp
	verfier = $verifier
	createmode = $createmode

	name = "nfsd.createv3"
	argstr = sprintf("%s,%d",filename,createmode)
}

probe nfsd.createv3.return = kernel.function("nfsd_create_v3").return?,         
                    module("nfsd").function("nfsd_create_v3").return?
{
	name = "nfsd.createv3.return"
	retstr = sprintf("%d",$return)
}

/*
* probe nfsd.unlink
*  Fires when client removes a file or a dir  on server side,
*
* Arguments:
*
*  fh  : file handle (the first part is the length of the file handle)
*  filename : file name 
*  filelen  : the length of file name
*  type : file type(file or dir)
*/
probe nfsd.unlink = kernel.function("nfsd_unlink")?,         
                    module("nfsd").function("nfsd_unlink")?
{
	fh = __svc_fh($fhp)

	filename = kernel_string($fname)
	filelen = $flen
	type = $type

	name = "nfsd.unlink"
	argstr = sprintf("%s,%d",filename,iap)
}

probe nfsd.unlink.return = kernel.function("nfsd_unlink").return?,         
                    module("nfsd").function("nfsd_unlink").return?
{
	name = "nfsd.unlink.return"
	retstr = sprintf("%d",$return)
}

/*
* probe nfsd.rename
*  Fires when clients rename a file on server side
*
* Arguments:
*   fh : file handler of old path
*   tfh : file handler of new path
*   filename : old file name 
*   tname : new file name
*   flen : length of old file name 
*   tlen : length of new file name
*/

probe nfsd.rename =  kernel.function("nfsd_rename")?,
                           module("nfsd").function("nfsd_rename")?
{
	fh = __svc_fh($ffhp)
	tfh = __svc_fh($tfhp)

	filename  = kernel_string($fname) 
	filelen = $flen
	tname = kernel_string($tname)
	tlen = $tlen

	name = "nfsd.rename"
	argstr = sprintf("%s,%s",filename,tname)
}

probe nfsd.rename.return =  kernel.function("nfsd_rename").return?,
                           module("nfsd").function("nfsd_rename").return?
{
	name = "nfsd.rename.return"
	retstr = sprintf("%d",$return)
}

Anon7 - 2021