From 2f08b0dd7089da8f819ad4db7a6dfde312419565 Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Sat, 17 Nov 2007 22:37:39 -0500 Subject: [PATCH] Unionfs: add lower nameidata debugging support Signed-off-by: Erez Zadok --- fs/unionfs/debug.c | 20 ++++++++++++++++++++ fs/unionfs/dentry.c | 4 +++- fs/unionfs/inode.c | 8 +++++++- fs/unionfs/union.h | 4 ++++ 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/fs/unionfs/debug.c b/fs/unionfs/debug.c index 2d15fb0fb8..9546a4122c 100644 --- a/fs/unionfs/debug.c +++ b/fs/unionfs/debug.c @@ -415,6 +415,26 @@ void __unionfs_check_file(const struct file *file, __unionfs_check_dentry(dentry,fname,fxn,line); } +void __unionfs_check_nd(const struct nameidata *nd, + const char *fname, const char *fxn, int line) +{ + struct file *file; + int printed_caller = 0; + + if (!nd) + return; + if (nd->flags & LOOKUP_OPEN) { + file = nd->intent.open.file; + if (file->f_path.dentry && + strcmp(file->f_dentry->d_sb->s_type->name, "unionfs")) { + PRINT_CALLER(fname, fxn, line); + printk(" CND1: lower_file of type %s\n", + file->f_path.dentry->d_sb->s_type->name); + BUG(); + } + } +} + /* useful to track vfsmount leaks that could cause EBUSY on unmount */ void __show_branch_counts(const struct super_block *sb, const char *file, const char *fxn, int line) diff --git a/fs/unionfs/dentry.c b/fs/unionfs/dentry.c index 0ece802e8d..2d9fd4fc6c 100644 --- a/fs/unionfs/dentry.c +++ b/fs/unionfs/dentry.c @@ -434,8 +434,10 @@ static int unionfs_d_revalidate(struct dentry *dentry, struct nameidata *nd) unionfs_lock_dentry(dentry); err = __unionfs_d_revalidate_chain(dentry, nd, false); unionfs_unlock_dentry(dentry); - if (err > 0) /* true==1: dentry is valid */ + if (err > 0) { /* true==1: dentry is valid */ unionfs_check_dentry(dentry); + unionfs_check_nd(nd); + } unionfs_read_unlock(dentry->d_sb); diff --git a/fs/unionfs/inode.c b/fs/unionfs/inode.c index ece0b81e8e..459a0a4117 100644 --- a/fs/unionfs/inode.c +++ b/fs/unionfs/inode.c @@ -125,8 +125,10 @@ out: unionfs_read_unlock(dentry->d_sb); unionfs_check_inode(parent); - if (!err) + if (!err) { unionfs_check_dentry(dentry->d_parent); + unionfs_check_nd(nd); + } unionfs_check_dentry(dentry); return err; } @@ -173,6 +175,7 @@ static struct dentry *unionfs_lookup(struct inode *parent, unionfs_check_inode(parent); unionfs_check_dentry(dentry); unionfs_check_dentry(dentry->d_parent); + unionfs_check_nd(nd); unionfs_read_unlock(dentry->d_sb); return ret; @@ -697,6 +700,7 @@ static void *unionfs_follow_link(struct dentry *dentry, struct nameidata *nd) out: unionfs_check_dentry(dentry); + unionfs_check_nd(nd); unionfs_read_unlock(dentry->d_sb); return ERR_PTR(err); } @@ -714,6 +718,7 @@ static void unionfs_put_link(struct dentry *dentry, struct nameidata *nd, unionfs_unlock_dentry(dentry); unionfs_check_dentry(dentry); + unionfs_check_nd(nd); kfree(nd_get_link(nd)); unionfs_read_unlock(dentry->d_sb); } @@ -844,6 +849,7 @@ static int unionfs_permission(struct inode *inode, int mask, out: unionfs_check_inode(inode); + unionfs_check_nd(nd); return err; } diff --git a/fs/unionfs/union.h b/fs/unionfs/union.h index f0e1c8dc88..a870e4e49f 100644 --- a/fs/unionfs/union.h +++ b/fs/unionfs/union.h @@ -549,6 +549,8 @@ static inline struct dentry *__odf_dstack_pop(struct dentry_stack *stack) __FILE__,__FUNCTION__,__LINE__) #define unionfs_check_file(f) __unionfs_check_file((f), \ __FILE__,__FUNCTION__,__LINE__) +#define unionfs_check_nd(n) __unionfs_check_nd((n), \ + __FILE__,__FUNCTION__,__LINE__) #define show_branch_counts(sb) __show_branch_counts((sb), \ __FILE__,__FUNCTION__,__LINE__) #define show_inode_times(i) __show_inode_times((i), \ @@ -565,6 +567,8 @@ extern void __unionfs_check_dentry(const struct dentry *dentry, int line); extern void __unionfs_check_file(const struct file *file, const char *fname, const char *fxn, int line); +extern void __unionfs_check_nd(const struct nameidata *nd, + const char *fname, const char *fxn, int line); extern void __show_branch_counts(const struct super_block *sb, const char *file, const char *fxn, int line); extern void __show_inode_times(const struct inode *inode, -- 2.43.0