--- linux-2.6.21-rc3/include/linux/dcache.h 2007-03-07 17:23:55.000000000 +0100 +++ linux-2.6.21-rc3-ed/include/linux/dcache.h 2007-03-07 17:27:39.000000000 +0100 @@ -133,6 +133,7 @@ struct dentry_operations { int (*d_delete)(struct dentry *); void (*d_release)(struct dentry *); void (*d_iput)(struct dentry *, struct inode *); + char * (*d_dname)(struct dentry *, char *, int); }; /* the dentry parameter passed to d_hash and d_compare is the parent --- linux-2.6.21-rc3/fs/dcache.c 2007-03-07 17:23:55.000000000 +0100 +++ linux-2.6.21-rc3-ed/fs/dcache.c 2007-03-07 17:28:46.000000000 +0100 @@ -1823,6 +1823,9 @@ char * d_path(struct dentry *dentry, str struct vfsmount *rootmnt; struct dentry *root; + if (dentry->d_op && dentry->d_op->d_dname) + return (dentry->d_op->d_dname)(dentry, buf, buflen); + read_lock(¤t->fs->lock); rootmnt = mntget(current->fs->rootmnt); root = dget(current->fs->root); --- linux-2.6.21-rc3/fs/pipe.c 2007-03-07 17:42:36.000000000 +0100 +++ linux-2.6.21-rc3-ed/fs/pipe.c 2007-03-07 18:54:33.000000000 +0100 @@ -841,8 +841,15 @@ static int pipefs_delete_dentry(struct d return 0; } +static char * pipefs_dname(struct dentry *dentry, char *buffer, int buflen) +{ + snprintf(buffer, buflen, "pipe:[%lu]", dentry->d_inode->i_ino); + return buffer; +} + static struct dentry_operations pipefs_dentry_operations = { .d_delete = pipefs_delete_dentry, + .d_dname = pipefs_dname, }; static struct inode * get_pipe_inode(void) @@ -888,7 +895,6 @@ struct file *create_write_pipe(void) struct inode *inode; struct file *f; struct dentry *dentry; - char name[32]; struct qstr this; f = get_empty_filp(); @@ -899,8 +905,8 @@ struct file *create_write_pipe(void) if (!inode) goto err_file; - this.len = sprintf(name, "[%lu]", inode->i_ino); - this.name = name; + this.len = 0; + this.name = NULL; this.hash = 0; err = -ENOMEM; dentry = d_alloc(pipe_mnt->mnt_sb->s_root, &this); --- linux-2.6.21-rc3/net/socket.c 2007-03-07 17:37:56.000000000 +0100 +++ linux-2.6.21-rc3-ed/net/socket.c 2007-03-07 18:54:33.000000000 +0100 @@ -314,8 +314,16 @@ static int sockfs_delete_dentry(struct d dentry->d_flags |= DCACHE_UNHASHED; return 0; } + +static char * sockfs_dname(struct dentry *dentry, char *buffer, int buflen) +{ + snprintf(buffer, buflen, "socket:[%lu]", dentry->d_inode->i_ino); + return buffer; +} + static struct dentry_operations sockfs_dentry_operations = { .d_delete = sockfs_delete_dentry, + .d_dname = sockfs_dname, }; /* @@ -356,10 +364,9 @@ static int sock_alloc_fd(struct file **f static int sock_attach_fd(struct socket *sock, struct file *file) { struct qstr this; - char name[32]; - this.len = sprintf(name, "[%lu]", SOCK_INODE(sock)->i_ino); - this.name = name; + this.len = 0; + this.name = NULL; this.hash = 0; file->f_path.dentry = d_alloc(sock_mnt->mnt_sb->s_root, &this);