]> sourceware.org Git - systemtap.git/commitdiff
PR9871: use @cast in tapset
authorWenji Huang <wenji.huang@oracle.com>
Fri, 6 Mar 2009 05:16:50 +0000 (00:16 -0500)
committerWenji Huang <wenji.huang@oracle.com>
Fri, 6 Mar 2009 05:16:50 +0000 (00:16 -0500)
Rewrite some functions using type casting to
get rid of embedded C code in nfs, scsi, signal,
socket, rpc, task and vfs tapset.

Signed-off-by: Wenji Huang <wenji.huang@oracle.com>
tapset/nfs.stp
tapset/rpc.stp
tapset/scsi.stp
tapset/signal.stp
tapset/socket.stp
tapset/task.stp
tapset/vfs.stp

index 474b091f8bba99b5f9ec7b8df38b7979979120ab..fe25eff2a89f9745e4d936086a4e5fd2818c54fa 100644 (file)
@@ -135,69 +135,55 @@ function __nfs_wpages:long(inode:long) %{ /* pure */
 %}
 
 /*Get struct inode from struct page*/
-function __p2i :long(page:long) %{ /* pure */
-    struct page *page = (struct page *)((long)THIS->page);
-    struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-
-    if (mapping == NULL)
-        THIS->__retvalue = 0;
+function __p2i :long(page:long)
+{
+    mapping = page? @cast(page, "page", "kernel")->mapping : 0
+    if (mapping == 0)
+        return 0
     else
-        THIS->__retvalue = (long)kread(&(mapping->host));
-    CATCH_DEREF_FAULT();
-%}
+        return @cast(mapping, "address_space", "kernel")->host
+}
 
 /*Get i_flags from struct page*/
-function __p2i_flag : long (page:long) %{ /* pure */
-    struct page *page = (struct page *)((long)THIS->page);
-    struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-    struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-
-    if (host == NULL)
-        THIS->__retvalue = -1;
+function __p2i_flag : long (page:long)
+{
+    host = __p2i(page)
+    if (host == 0)
+        return -1
     else
-        THIS->__retvalue = kread(&(host->i_flags));
-    CATCH_DEREF_FAULT();
-%}
+        return @cast(host, "inode", "kernel")->i_flags
+}
 
 /*Get i_state from struct page*/
-function __p2i_state :long (page:long) %{ /* pure */
-    struct page *page = (struct page *)((long)THIS->page);
-    struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-    struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-
-    if (host == NULL)
-        THIS->__retvalue = -1;
+function __p2i_state :long (page:long)
+{
+    host = __p2i(page)
+    if (host == 0)
+        return -1
     else
-        THIS->__retvalue = kread(&(host->i_state));
-    CATCH_DEREF_FAULT();
-%}
+        return @cast(host, "inode", "kernel")->i_state
+}
 
 /*Get i_size from struct page*/
-function __p2i_size :long (page:long) %{ /* pure */
-    struct page *page = (struct page *)((long)THIS->page);
-    struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-    struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-
-    if (host == NULL)
-        THIS->__retvalue = -1;
+function __p2i_size :long (page:long)
+{
+    host = __p2i(page)
+    if (host == 0)
+        return -1
     else
-        THIS->__retvalue = kread(&(host->i_size));
-    CATCH_DEREF_FAULT();
-%}
+        return @cast(host, "inode", "kernel")->i_size
+}
 
 /*Get s_flags from struct page*/
-function __p2sb_flag:long (page:long) %{ /* pure */
-    struct page *page = (struct page *)((long)THIS->page);
-    struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-    struct inode *host = mapping? kread(&(mapping->host)) : NULL;
-       struct super_block *i_sb = host? kread(&(host->i_sb)) : NULL;
-
-    if (i_sb == NULL)
-        THIS->__retvalue = -1;
+function __p2sb_flag:long (page:long)
+{
+    host = __p2i(page)
+    i_sb = host? @cast(host, "inode", "kernel")->i_sb : 0
+    if (i_sb == 0)
+        return -1
     else
-        THIS->__retvalue = kread(&(i_sb->s_flags));
-    CATCH_DEREF_FAULT();
-%}
+        return @cast(i_sb, "super_block", "kernel")->s_flags
+}
 
 function __d_loff_t :long (ppos :long) %{ /* pure */
     loff_t * ppos = (loff_t *) ((long)THIS->ppos);
@@ -209,53 +195,54 @@ function __d_loff_t :long (ppos :long) %{ /* pure */
     CATCH_DEREF_FAULT();
 %}
 
-function __file_inode:long (file:long) %{ /* pure */
-    struct file *file = (struct file *)(long)THIS->file;
-    struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-    if (dentry == NULL)
-        THIS->__retvalue = 0;
+function __file_inode:long (file:long)
+{
+%( kernel_v >= "2.6.20" %?
+    dentry = file? @cast(file, "file", "kernel")->f_path->dentry : 0
+%:
+    dentry = file? @cast(file, "file", "kernel")->f_dentry : 0
+%)
+    if (dentry == 0)
+        return 0
     else
-        THIS->__retvalue = (long)kread(&(dentry->d_inode));
-    CATCH_DEREF_FAULT();
-%}
+        return @cast(dentry, "dentry", "kernel")->d_inode
+}
 
-function __file_id:long (file:long) %{ /* pure */
-    struct file *file = (struct file *)(long)THIS->file;
-    struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-    if (dentry == NULL)
-        THIS->__retvalue = 0;
+function __file_id:long (file:long)
+{
+    d_inode = __file_inode(file)
+    if (d_inode == 0)
+        return 0
     else {
-        struct inode *d_inode = kread(&(dentry->d_inode));
-        struct super_block *i_sb = kread(&(d_inode->i_sb));
-        THIS->__retvalue = (long)&(i_sb->s_id);
+        i_sb = @cast(d_inode, "inode", "kernel")->i_sb
+        return @cast(i_sb, "super_block", "kernel")->s_id
     }
-    CATCH_DEREF_FAULT();
-%}
+}
 
-function __file_mode:long (file:long) %{ /* pure */
-    struct file *file = (struct file *)(long)THIS->file;
-    struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-    if (dentry == NULL)
-        THIS->__retvalue = 0;
-    else {
-        struct inode *d_inode = kread(&(dentry->d_inode));
-        THIS->__retvalue = kread(&(d_inode->i_mode));
-    }
-    CATCH_DEREF_FAULT();
-%}
+function __file_mode:long (file:long)
+{
+    d_inode = __file_inode(file)
+    if (d_inode == 0)
+        return 0
+    else
+        return  @cast(d_inode, "inode", "kernel")->i_mode
+}
 
-function __file_parentname:string (file:long) %{ /* pure */
-    struct file *file = (struct file *)(long)THIS->file;
-    struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-    struct dentry *d_parent = dentry? kread(&(dentry->d_parent)) : NULL;
-    if (d_parent == NULL)
-        strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
+function __file_parentname:string (file:long)
+{
+%( kernel_v >= "2.6.20" %?
+    dentry = file? @cast(file, "file", "kernel")->f_path->dentry : 0
+%:
+    dentry = file? @cast(file, "file", "kernel")->f_dentry : 0
+%)
+    d_parent = dentry? @cast(dentry, "dentry", "kernel")->d_parent : 0
+    if (d_parent == 0)
+        return "NULL"
     else {
-        const unsigned char *name = kread(&(d_parent->d_name.name));
-        deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
+        name = @cast(d_parent, "dentry", "kernel")->d_name->name
+        return kernel_string(name)
     }
-    CATCH_DEREF_FAULT();
-%}
+}
 
 /*
  * Combination of generic_segment_checks and iov_length functions
index f97117b53b22b96fd6fe763ad41bbf6a6f6cf774..e6eaed461c0b41bf22729a0e6f765d1b18efad6e 100644 (file)
@@ -877,60 +877,52 @@ probe sunrpc.sched.delay.return = kernel.function("rpc_delay").return !,
  *****************************************************************/
 
 function xid_from_clnt:long(clnt:long)
-%{ /* pure */
-       struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
-       if (clnt == NULL)
-               THIS->__retvalue = 0;
+{
+       if (clnt == 0)
+               return 0
        else {
-               struct rpc_xprt *cl_xprt = kread(&(clnt->cl_xprt));
-               THIS->__retvalue = kread(&(cl_xprt->xid));
+               cl_xprt = @cast(clnt, "rpc_clnt", "kernel")->cl_xprt
+               return @cast(cl_xprt, "rpc_xprt", "kernel")->xid
        }
-       CATCH_DEREF_FAULT();
-%}
+}
 
 function prog_from_clnt:long(clnt:long)
-%{ /* pure */
-       struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
-       if (clnt == NULL)
-               THIS->__retvalue = 0;
+{
+       if (clnt == 0)
+               return 0
        else {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-               THIS->__retvalue = kread(&(clnt->cl_prog));
-#else
-               struct rpc_portmap *cl_pmap = kread(&(clnt->cl_pmap));
-               THIS->__retvalue = kread(&(cl_pmap->pm_prog));
-#endif
+%(kernel_v  >= "2.6.19" %?
+               return @cast(clnt, "rpc_clnt", "kernel")->cl_prog
+%:
+               cl_pmap = @cast(clnt, "rpc_clnt", "kernel")->cl_pmap
+               return @cast(cl_pmap, "rpc_portmap", "kernel")->pm_prog
+%)
        }
-       CATCH_DEREF_FAULT();
-%}
+}
 
 function vers_from_clnt:long(clnt:long)
-%{ /* pure */
-       struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
-       if (clnt == NULL)
-               THIS->__retvalue = 0;
-       else {
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
-               THIS->__retvalue = kread(&(clnt->cl_vers));
-#else
-               struct rpc_portmap *cl_pmap = kread(&(clnt->cl_pmap));
-               THIS->__retvalue = kread(&(cl_pmap->pm_vers));
-#endif
-       }
-       CATCH_DEREF_FAULT();
-%}
+{
+        if (clnt == 0)
+                return 0
+        else {
+%(kernel_v  >= "2.6.19" %?
+                return @cast(clnt, "rpc_clnt", "kernel")->cl_vers
+%:
+                cl_pmap = @cast(clnt, "rpc_clnt", "kernel")->cl_pmap
+                return @cast(cl_pmap, "rpc_portmap", "kernel")->pm_vers
+%)
+        }
+}
 
 function prot_from_clnt:long(clnt:long)
-%{ /* pure */
-       struct rpc_clnt *clnt = (struct rpc_clnt *)(long)THIS->clnt;
-       if (clnt == NULL)
-               THIS->__retvalue = 0;
-       else {
-               struct rpc_xprt *cl_xprt = kread(&(clnt->cl_xprt));
-               THIS->__retvalue = kread(&(cl_xprt->prot));
-       }
-       CATCH_DEREF_FAULT();
-%}
+{
+        if (clnt == 0)
+                return 0
+        else {
+                cl_xprt = @cast(clnt, "rpc_clnt", "kernel")->cl_xprt
+                return @cast(cl_xprt, "rpc_xprt", "kernel")->prot
+        }
+}
 
 function port_from_clnt:long(clnt:long)
 %{ /* pure */
@@ -975,16 +967,14 @@ function tasks_from_clnt:long(clnt:long)
 %}
 
 function proc_from_msg:long(msg:long)
-%{ /* pure */
-       struct rpc_message *msg = (struct rpc_message *)(long)THIS->msg;
-       if (msg == NULL)
-               THIS->__retvalue = 0;
+{
+       if (msg == 0)
+               return 0
        else {
-               struct rpc_procinfo *rpc_proc = kread(&(msg->rpc_proc));
-               THIS->__retvalue = kread(&(rpc_proc->p_proc));
+               rpc_proc = @cast(msg, "rpc_message", "kernel")->rpc_proc
+               return @cast(rpc_proc, "rpc_procinfo", "kernel")->p_proc
        }
-       CATCH_DEREF_FAULT();
-%}
+}
 
 function vers_from_prog:long(program:long, vers:long)
 %{ /* pure */
index 76b9a1149901e0886da8182a9366a4ba891d3f05..b1b2d19b7546d6f0c4e000946187b0d3995fa1d5 100644 (file)
@@ -136,9 +136,7 @@ function scsi_timer_pending:long(var:long)
 %}
 
 function get_devstate_from_req:long(var:long)
-%{ /* pure */
-       struct request_queue *q = (struct request_queue *)((long)THIS->var);
-       struct scsi_device *sdev = (struct scsi_device *)kread(&(q->queuedata));
-       THIS->__retvalue = kread(&(sdev->sdev_state));
-       CATCH_DEREF_FAULT();
-%}
+{
+       sdev = @cast(var, "request_queue", "kernel")->queuedata
+       return @cast(sdev, "scsi_device", "kernel")->sdev_state
+}
index f40958e6c4ea99132ede36cf21ec3c1b50828965..8fb6fe570ef6ab305d2e3e112ba9d638f52fe7c4 100644 (file)
@@ -608,17 +608,15 @@ probe signal.flush = kernel.function("flush_signals")
     pid_name = kernel_string($t->comm)
 }
 
-function get_sa_flags:long (act:long) %{ /* pure */
-       struct k_sigaction *act = (struct k_sigaction *)((long)THIS->act);
-       THIS->__retvalue = kread(&act->sa.sa_flags);
-       CATCH_DEREF_FAULT();
-%}
+function get_sa_flags:long (act:long)
+{
+       return @cast(act, "k_sigaction", "kernel")->sa->sa_flags
+}
 
-function get_sa_handler:long (act:long) %{ /* pure */
-       struct k_sigaction *act = (struct k_sigaction *)((long)THIS->act);
-       THIS->__retvalue = (long)kread(&act->sa.sa_handler);
-       CATCH_DEREF_FAULT();
-%}
+function get_sa_handler:long (act:long)
+{
+       return @cast(act, "k_sigaction", "kernel")->sa->sa_handler
+}
 
 // sa_mask contains the set of signals to be blocked when executing the
 // signal handler. This function returns a string, delimited by ",".
index 842dbfc4080368bb5ddbc55cd3185515091f06cd..3271d4f731d7ed1791a08791cc935390238da881 100644 (file)
@@ -922,53 +922,43 @@ function _get_sock_size:long (iov:long, nr_segs:long)
 %}
 
 function _sock_prot_num:long (sock:long)
-%{ /* pure */
-       struct socket *sktp = (struct socket *)(long)(THIS->sock);
-       struct sock *skp = sktp? kread(&(sktp->sk)) : NULL;
-       if (skp == NULL)
-               THIS->__retvalue = -1;
+{
+       skp = sock? @cast(sock, "socket", "kernel")->sk : 0
+       if (skp == 0)
+               return -1
        else
-               THIS->__retvalue = kread(&(skp->sk_protocol));
-       CATCH_DEREF_FAULT();
-%}
+               return @cast(skp, "sock", "kernel")->sk_protocol
+}
 
 function _sock_fam_num:long (sock:long)
-%{ /* pure */
-       struct socket *sockp = (struct socket *)(long)(THIS->sock);
-       const struct proto_ops *ops = sockp? kread(&(sockp->ops)) : NULL;
-       if (ops == NULL)
-               THIS->__retvalue = -1;
+{
+       ops = sock? @cast(sock, "socket", "kernel")->ops : 0
+       if (ops == 0)
+               return -1
        else
-               THIS->__retvalue = kread(&(ops->family));
-       CATCH_DEREF_FAULT();
-%}
+               return @cast(ops, "proto_ops", "kernel")->family
+}
 
 function _sock_state_num:long (sock:long)
-%{ /* pure */
-       struct socket *sockp = (struct socket *)(long)(THIS->sock);
-       if (sockp == NULL)
-               THIS->__retvalue = -1;
+{
+       if (sock == 0)
+               return -1
        else
-               THIS->__retvalue = kread(&(sockp->state));
-       CATCH_DEREF_FAULT();
-%}
+               return @cast(sock, "socket", "kernel")->state
+}
 
 function _sock_type_num:long (sock:long)
-%{ /* pure */
-       struct socket *sockp = (struct socket *)(long)(THIS->sock);
-       if (sockp == NULL)
-               THIS->__retvalue = -1;
-       else
-               THIS->__retvalue = kread(&(sockp->type));
-       CATCH_DEREF_FAULT();
-%}
+{
+        if (sock == 0)
+                return -1
+        else
+                return @cast(sock, "socket", "kernel")->type
+}
 
 function _sock_flags_num:long (sock:long)
-%{ /* pure */
-       struct socket *sockp = (struct socket *)(long)(THIS->sock);
-       if (sockp == NULL)
-               THIS->__retvalue = -1;
-       else
-               THIS->__retvalue = kread(&(sockp->flags));
-       CATCH_DEREF_FAULT();
-%}
+{
+        if (sock == 0)
+                return -1
+        else
+                return @cast(sock, "socket", "kernel")->flags
+}
index 684cef9332976341ab0062619e455d490ab1e0e4..073371566690512fa953a87685b18b8b0fe3bd54 100644 (file)
@@ -43,35 +43,31 @@ function task_parent:long (task:long) %{ /* pure */
 //   TASK_TRACED            8
 //   EXIT_ZOMBIE           16
 //   EXIT_DEAD             32
-function task_state:long (task:long) %{ /* pure */
-    struct task_struct *t = (struct task_struct *)(long)THIS->task;
-    THIS->__retvalue = kread(&(t->state));
-    CATCH_DEREF_FAULT();
-%}
+function task_state:long (task:long)
+{
+    return @cast(task, "task_struct", "kernel")->state
+}
 
 
 // Return the name of the given task
-function task_execname:string (task:long) %{ /* pure */
-    struct task_struct *t = (struct task_struct *)(long)THIS->task;
-    deref_string(THIS->__retvalue, t->comm, MAXSTRINGLEN);
-    CATCH_DEREF_FAULT();
-%}
+function task_execname:string (task:long)
+{
+    return kernel_string(@cast(task, "task_struct", "kernel")->comm)
+}
 
 
 // Return the process id of the given task
-function task_pid:long (task:long) %{ /* pure */
-    struct task_struct *t = (struct task_struct *)(long)THIS->task;
-    THIS->__retvalue = kread(&(t->tgid));
-    CATCH_DEREF_FAULT();
-%}
+function task_pid:long (task:long)
+{
+    return @cast(task, "task_struct", "kernel")->tgid
+}
 
 
 // Return the thread id of the given task
-function task_tid:long (task:long) %{ /* pure */
-    struct task_struct *t = (struct task_struct *)(long)THIS->task;
-    THIS->__retvalue = kread(&(t->pid));
-    CATCH_DEREF_FAULT();
-%}
+function task_tid:long (task:long)
+{
+    return @cast(task, "task_struct", "kernel")->pid
+}
 
 
 // Return the group id of the given task
@@ -156,22 +152,14 @@ function task_nice:long (task:long) %{ /* pure */
 
 // Return the scheduled cpu for the given task
 function task_cpu:long (task:long)
+{
 %( kernel_v >= "2.6.22" %? 
-%{ /* pure */
-    struct task_struct *t = (struct task_struct *)(long)THIS->task;
-    struct thread_info *ti = kread(&(t->stack));
-    THIS->__retvalue = kread(&(ti->cpu));
-    CATCH_DEREF_FAULT();
-%}
+    ti = @cast(task, "task_struct", "kernel")->stack
 %:
-%{ /* pure */
-    struct task_struct *t = (struct task_struct *)(long)THIS->task;
-    struct thread_info *ti = kread(&(t->thread_info));
-    THIS->__retvalue = kread(&(ti->cpu));
-    CATCH_DEREF_FAULT();
-%}
+    ti = @cast(task, "task_struct", "kernel")->thread_info
 %)
-
+    return @cast(ti, "thread_info", "kernel")->cpu
+}
 
 // Return the number of open file handlers for the given task
 function task_open_file_handles:long (task:long)
index 436031774a9e989be2158a1fce8203b06f30c5c3..3bb9292da2eec53096a22d3167d31f9c82c5f332 100644 (file)
@@ -51,136 +51,106 @@ function ppos_pos:long (ppos:long) %{ /* pure */
        CATCH_DEREF_FAULT();
 %}
 
-function __page_ino:long (page:long) %{ /* pure */
-       struct page *page = (struct page *)(long)THIS->page;
-       struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-       if (mapping == NULL) {
-               THIS->__retvalue = -1;
-       } else {
-               struct inode *host = kread(&(mapping->host));
-               THIS->__retvalue = kread(&(host->i_ino));
-       }
-       CATCH_DEREF_FAULT();
-%}
-
-function __address_inode:long (page:long) %{ /* pure */
-       struct page *page = (struct page *)(long)THIS->page;
-       struct address_space *mapping = kread(&(page->mapping));
-       if (mapping == NULL) {
-               THIS->__retvalue = -1;
-       } else {
-               THIS->__retvalue = (long)kread(&(mapping->host));
-       }
-       CATCH_DEREF_FAULT();
-%}
+function __address_inode:long (page:long)
+{
+       mapping = page? @cast(page, "page", "kernel")->mapping : 0
+       if (mapping == 0)
+               return -1
+       else
+               return @cast(mapping, "address_space", "kernel")->host
+}
 
-function __page_dev:long (page:long) %{ /* pure */
-       struct page *page = (struct page *)(long)THIS->page;
-       struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-       if (mapping == NULL) {
-               THIS->__retvalue = -1;
-       } else {
-               struct inode *host = kread(&(mapping->host));
-               struct super_block *i_sb = kread(&(host->i_sb));
-               THIS->__retvalue = kread(&(i_sb->s_dev));
-       }
-       CATCH_DEREF_FAULT();
-%}
+function __page_ino:long (page:long)
+{
+       host = __address_inode(page)
+       if (host == -1)
+               return -1
+       else
+               return @cast(host, "inode", "kernel")->i_ino
+}
 
-function __page_bdev:long (page:long) %{ /* pure */
-       struct page *page = (struct page *)(long)THIS->page;
-       struct address_space *mapping = page? kread(&(page->mapping)) : NULL;
-       if (mapping == NULL) {
-               THIS->__retvalue = 0;
-       } else {
-               struct inode *host = kread(&(mapping->host));
-               struct super_block *i_sb = kread(&(host->i_sb));
-               THIS->__retvalue = (long)kread(&(i_sb->s_bdev));
+function __page_dev:long (page:long)
+{
+       host = __address_inode(page)
+       if (host == -1)
+               return -1
+       else {
+               i_sb = @cast(host, "inode", "kernel")->i_sb
+               return @cast(i_sb, "super_block", "kernel")->s_dev
        }
-       CATCH_DEREF_FAULT();
-%}
+}
 
-function __page_index:long (page:long) %{ /* pure */
-       struct page *page = (struct page *)(long)THIS->page;
-       THIS->__retvalue = (long)kread(&(page->index));
-       CATCH_DEREF_FAULT();
-%}
+function __page_bdev:long (page:long)
+{
+        host = __address_inode(page)
+        if (host == -1)
+                return 0
+        else {
+                i_sb = @cast(host, "inode", "kernel")->i_sb
+                return @cast(i_sb, "super_block", "kernel")->s_bdev
+        }
+}
 
-function __file_dev:long (file:long) %{ /* pure */
-       struct file *file = (struct file *)(long)THIS->file;
-       struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-       if (dentry == NULL) {
-               THIS->__retvalue = 0;
-       } else {
-               struct inode *d_inode = kread(&(dentry->d_inode));
-               struct super_block *i_sb = kread(&(d_inode->i_sb));
-               THIS->__retvalue = kread(&(i_sb->s_dev));
-       }
-       CATCH_DEREF_FAULT();
-%}
+function __page_index:long (page:long)
+{
+       return @cast(page, "page", "kernel")->index
+}
 
-function __file_bdev:long (file:long) %{ /* pure */
-       struct file *file = (struct file *)(long)THIS->file;
-       struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-       if (dentry == NULL) {
-               THIS->__retvalue = 0;
-       } else {
-               struct inode *d_inode = kread(&(dentry->d_inode));
-               struct super_block *i_sb = kread(&(d_inode->i_sb));
-               THIS->__retvalue = (long)kread(&(i_sb->s_bdev));
+function __file_dev:long (file:long)
+{
+       d_inode = __file_inode(file)
+       if (d_inode == 0)
+               return 0
+       else {
+               i_sb =  @cast(d_inode, "inode", "kernel")->i_sb
+               return @cast(i_sb, "super_block", "kernel")->s_dev
        }
-       CATCH_DEREF_FAULT();
-%}
+}
 
-function __file_ino:long (file:long) %{ /* pure */
-       struct file *file = (struct file *)(long)THIS->file;
-       struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-       if (dentry == NULL) {
-               THIS->__retvalue = 0;
-       } else {
-               struct inode *d_inode = kread(&(dentry->d_inode));
-               THIS->__retvalue = kread(&(d_inode->i_ino));
-       }
-       CATCH_DEREF_FAULT();
-%}
+function __file_bdev:long (file:long)
+{
+        d_inode = __file_inode(file)
+        if (d_inode == 0)
+                return 0
+        else {
+                i_sb =  @cast(d_inode, "inode", "kernel")->i_sb
+                return @cast(i_sb, "super_block", "kernel")->s_bdev
+        }
+}
 
-function __file_maxbytes:long (file:long) %{ /* pure */
-       struct file *file = (struct file *)(long)THIS->file;
-       struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-       if (dentry == NULL) {
-               THIS->__retvalue = 0;
-       } else {
-               struct inode *d_inode = kread(&(dentry->d_inode));
-               struct super_block *i_sb = kread(&(d_inode->i_sb));
-               THIS->__retvalue = kread(&(i_sb->s_maxbytes));
-       }
-       CATCH_DEREF_FAULT();
-%}
+function __file_ino:long (file:long)
+{
+        d_inode = __file_inode(file)
+        if (d_inode == 0)
+                return 0
+        else
+                return  @cast(d_inode, "inode", "kernel")->i_ino
+}
 
-function __file_filename:string (file:long) %{ /* pure */
-       struct file *file = (struct file *)(long)THIS->file;
-       struct dentry *dentry = file? kread(&(file->f_dentry)) : NULL;
-       const unsigned char *name = dentry? kread(&(dentry->d_name.name)) : NULL;
-       if (name == NULL) {
-               strlcpy(THIS->__retvalue, "NULL", MAXSTRINGLEN);
-       } else {
-               deref_string(THIS->__retvalue, name, MAXSTRINGLEN);
-       }
-       CATCH_DEREF_FAULT();
-%}
+function __file_maxbytes:long (file:long)
+{
+        d_inode = __file_inode(file)
+        if (d_inode == 0)
+                return 0
+        else {
+                i_sb =  @cast(d_inode, "inode", "kernel")->i_sb
+                return @cast(i_sb, "super_block", "kernel")->s_maxbytes
+        }
+}
 
-function __inode_num:long(file:long)
-%{
-       struct file *file = NULL;
-       struct dentry *dentry = NULL;
-       struct inode *inode = NULL;
-
-       file = (struct file *)(long)THIS->file;
-       dentry = file? kread(&(file->f_dentry)) : NULL;
-       inode = dentry? kread(&(dentry->d_inode)) : NULL;
-       THIS->__retvalue = inode? (long)(kread(&(inode->i_ino))) : 0;
-       CATCH_DEREF_FAULT();
-%}
+function __file_filename:string (file:long)
+{
+%( kernel_v >= "2.6.20" %?
+       dentry = file? @cast(file, "file", "kernel")->f_path->dentry : 0
+%:
+       dentry = file? @cast(file, "file", "kernel")->f_dentry : 0
+%)
+       name = dentry? @cast(dentry, "dentry", "kernel")->d_name->name : 0
+       if (name == 0)
+               return "NULL"
+       else
+               return kernel_string(name)
+}
 
 function _get_fopv_size:long (iov:long, nr_segs:long)
 %{
This page took 0.049363 seconds and 5 git commands to generate.