Ian Kent <ra...@themaw.net> writes: > Steve Dickson wrote:
>> The main point with these two question is I have found it >> very handy to write system tap scripts that only fire >> when there is a non-zero status.... Which means instead >> of getting pages and pages of info scrolling off the >> screen, I get one (or few) lines of error conditions that >> generally have a bit more meaning... Given Ian's point about logging entire paths, this updated patch will still log before determining the final status of a request. If you want, you could cache that in systemtap until the status is received and try to correlate the two events (which would address your request of logging only on failures). For the lookup routine, you need to check if dentry is -ENOENT. for follow_link etc, there's a status code. The associated systemtap patch can be found here: http://people.redhat.com/jmoyer/systemtap Ian, let me know what you think. Cheers, Jeff Signed-off-by: Jeff Moyer <jmo...@redhat.com> diff --git a/fs/autofs4/expire.c b/fs/autofs4/expire.c index aa39ae8..6c86df9 100644 --- a/fs/autofs4/expire.c +++ b/fs/autofs4/expire.c @@ -13,6 +13,7 @@ * ------------------------------------------------------------------------- */ #include "autofs_i.h" +#include <trace/events/autofs4.h> static unsigned long now; @@ -496,6 +497,7 @@ int autofs4_do_expire_multi(struct super_block *sb, struct vfsmount *mnt, /* This is synchronous because it makes the daemon a little easier */ ret = autofs4_wait(sbi, dentry, NFY_EXPIRE); + trace_autofs4_do_expire_multi(mnt, dentry, ret); spin_lock(&sbi->fs_lock); if (ino->flags & AUTOFS_INF_MOUNTPOINT) { diff --git a/fs/autofs4/root.c b/fs/autofs4/root.c index b96a3c5..7cefdad 100644 --- a/fs/autofs4/root.c +++ b/fs/autofs4/root.c @@ -19,6 +19,9 @@ #include <linux/time.h> #include "autofs_i.h" +#define CREATE_TRACE_POINTS +#include <trace/events/autofs4.h> + static int autofs4_dir_symlink(struct inode *,struct dentry *,const char *); static int autofs4_dir_unlink(struct inode *,struct dentry *); static int autofs4_dir_rmdir(struct inode *,struct dentry *); @@ -216,6 +219,7 @@ static void *autofs4_follow_link(struct dentry *dentry, struct nameidata *nd) (!d_mountpoint(dentry) && __simple_empty(dentry))) { spin_unlock(&dcache_lock); + trace_autofs4_follow_link(nd, dentry); status = try_to_fill_dentry(dentry, 0); if (status) goto out_error; @@ -237,9 +241,11 @@ follow: } done: + trace_autofs4_follow_link_status(dentry, 0); return NULL; out_error: + trace_autofs4_follow_link_status(dentry, status); path_put(&nd->path); return ERR_PTR(status); } @@ -540,6 +546,8 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s dput(expiring); } + trace_autofs4_lookup(nd, dentry); + spin_lock(&dentry->d_lock); dentry->d_flags |= DCACHE_AUTOFS_PENDING; spin_unlock(&dentry->d_lock); @@ -595,12 +603,16 @@ static struct dentry *autofs4_lookup(struct inode *dir, struct dentry *dentry, s if (unhashed) dput(unhashed); + trace_autofs4_lookup_status(dentry); return dentry; } - if (unhashed) + if (unhashed) { + trace_autofs4_lookup_status(unhashed); return unhashed; + } + trace_autofs4_lookup_status(NULL); return NULL; } diff --git a/include/trace/events/autofs4.h b/include/trace/events/autofs4.h index 39f04c9..6feae79 100644 --- a/include/trace/events/autofs4.h +++ b/include/trace/events/autofs4.h @@ -1,26 +1,115 @@ #if !defined(_TRACE_AUTOFS4_H) || defined(TRACE_HEADER_MULTI_READ) #define _TRACE_AUTOFS4_H +#include <linux/dcache.h> +#include <linux/mount.h> +#include <linux/limits.h> #include <linux/tracepoint.h> #undef TRACE_SYSTEM #define TRACE_SYSTEM autofs4 TRACE_EVENT(autofs4_do_expire_multi, - TP_PROTO(struct vfsmount *mnt, struct dentry *dentry), - TP_ARGS(mnt, dentry), + TP_PROTO(struct vfsmount *mnt, struct dentry *dentry, int status), + TP_ARGS(mnt, dentry, status), TP_STRUCT__entry( __array(char, comm, TASK_COMM_LEN) __field(pid_t, pid) + __array(char, path, MAX_FILTER_STR_VAL) + __field(int, status) ), TP_fast_assign( __entry->pid = current->pid; memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + snprintf(__entry->path, + dentry->d_name.len < MAX_FILTER_STR_VAL ? + dentry->d_name.len : MAX_FILTER_STR_VAL, + "%s", dentry->d_name.name); + __entry->status = status; ), - TP_printk("%s[%d]: expiring %.*s", __entry->comm, __entry->pid, - dentry->d_name.len, dentry->d_name.name); + TP_printk("%s[%d]: expiry of %s %s", + __entry->comm, __entry->pid, __entry->path, + __entry->status == 0 ? "succeeded" : "failed") ); TRACE_EVENT(autofs4_lookup, - TP_PROTO( + TP_PROTO(struct nameidata *nd, struct dentry *dentry), + TP_ARGS(nd, dentry), + TP_STRUCT__entry( + __array(char, comm, TASK_COMM_LEN) + __array(char, path, MAX_FILTER_STR_VAL) + __field(char *, pathptr) + __field(pid_t, pid) + ), + TP_fast_assign( + __entry->pid = current->pid; + memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->pathptr = d_path(&nd->path, + __entry->path, MAX_FILTER_STR_VAL); + ), + TP_printk("%s[%d]: looking up %s", + __entry->comm, __entry->pid, __entry->pathptr) +); + +TRACE_EVENT(autofs4_lookup_status, + TP_PROTO(struct dentry *dentry), + TP_ARGS(dentry), + TP_STRUCT__entry( + __array(char, comm, TASK_COMM_LEN) + __field(void *, dentry) + __field(pid_t, pid) + ), + TP_fast_assign( + __entry->dentry = dentry; + memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->pid = current->pid; + ), + TP_printk("%s[%d]: lookup %s", + __entry->comm, __entry->pid, + __entry->dentry ? "succeeded" : "failed") +); + +TRACE_EVENT(autofs4_follow_link, + TP_PROTO(struct nameidata *nd, struct dentry *dentry), + TP_ARGS(nd, dentry), + TP_STRUCT__entry( + __array(char, comm, TASK_COMM_LEN) + __array(char, path, MAX_FILTER_STR_VAL) + __field(char *, pathptr) + __field(pid_t, pid) + ), + TP_fast_assign( + __entry->pid = current->pid; + memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->pathptr = d_path(&nd->path, + __entry->path, MAX_FILTER_STR_VAL); + ), + TP_printk("%s[%d]: looking up trigger %s", + __entry->comm, __entry->pid, __entry->pathptr) +); + +TRACE_EVENT(autofs4_follow_link_status, + TP_PROTO(struct dentry *dentry, int status), + TP_ARGS(dentry, status), + TP_STRUCT__entry( + __array(char, comm, TASK_COMM_LEN) + __array(char, linkname, MAX_FILTER_STR_VAL) + __field(int, status) + __field(pid_t, pid) + ), + TP_fast_assign( + __entry->status = status; + snprintf(__entry->linkname, dentry->d_name.len, "%s", + dentry->d_name.name); + memcpy(__entry->comm, current->comm, TASK_COMM_LEN); + __entry->pid = current->pid; + ), + TP_printk("%s[%d]: lookup for trigger %s %s", + __entry->comm, __entry->pid, __entry->linkname, + __entry->status == 0 ? "succeeded" : "failed") +); + #endif /* _TRACE_AUTOFS4_H */ + +/* This part must be outside protection */ +#include <trace/define_trace.h> _______________________________________________ autofs mailing list autofs@linux.kernel.org http://linux.kernel.org/mailman/listinfo/autofs