From 07dd9bd3b0d1ca61105317dbdb0612e820967f33 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 10 Aug 2010 11:41:40 +0200 Subject: [PATCH] --- yaml --- r: 208888 b: refs/heads/master c: ffd1f4ed5bddccf2277e3d8525bcedf1983319f8 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/dcache.c | 32 ++++++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index c5c3f716b929..ac76464e818b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: f2eb6575d5beba1e98d400463007d77555d1fc35 +refs/heads/master: ffd1f4ed5bddccf2277e3d8525bcedf1983319f8 diff --git a/trunk/fs/dcache.c b/trunk/fs/dcache.c index d09d93819b4d..7fccb00f498d 100644 --- a/trunk/fs/dcache.c +++ b/trunk/fs/dcache.c @@ -1979,8 +1979,7 @@ static int prepend_path(const struct path *path, struct path *root, * @buffer: buffer to return value in * @buflen: buffer length * - * Convert a dentry into an ASCII path name. If the entry has been deleted - * the string " (deleted)" is appended. Note that this is ambiguous. + * Convert a dentry into an ASCII path name. * * Returns a pointer into the buffer or an error code if the * path was too long. @@ -1997,12 +1996,6 @@ char *__d_path(const struct path *path, struct path *root, int error; prepend(&res, &buflen, "\0", 1); - if (d_unlinked(path->dentry)) { - error = prepend(&res, &buflen, " (deleted)", 10); - if (error) - return ERR_PTR(error); - } - error = prepend_path(path, root, &res, &buflen); if (error) return ERR_PTR(error); @@ -2010,6 +2003,22 @@ char *__d_path(const struct path *path, struct path *root, return res; } +/* + * same as __d_path but appends "(deleted)" for unlinked files. + */ +static int path_with_deleted(const struct path *path, struct path *root, + char **buf, int *buflen) +{ + prepend(buf, buflen, "\0", 1); + if (d_unlinked(path->dentry)) { + int error = prepend(buf, buflen, " (deleted)", 10); + if (error) + return error; + } + + return prepend_path(path, root, buf, buflen); +} + /** * d_path - return the path of a dentry * @path: path to report @@ -2028,9 +2037,10 @@ char *__d_path(const struct path *path, struct path *root, */ char *d_path(const struct path *path, char *buf, int buflen) { - char *res; + char *res = buf + buflen; struct path root; struct path tmp; + int error; /* * We have various synthetic filesystems that never get mounted. On @@ -2045,7 +2055,9 @@ char *d_path(const struct path *path, char *buf, int buflen) get_fs_root(current->fs, &root); spin_lock(&dcache_lock); tmp = root; - res = __d_path(path, &tmp, buf, buflen); + error = path_with_deleted(path, &tmp, &res, &buflen); + if (error) + res = ERR_PTR(error); spin_unlock(&dcache_lock); path_put(&root); return res;