aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dcache.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/dcache.c')
-rw-r--r--fs/dcache.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index d09d93819b4..7fccb00f498 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1979,8 +1979,7 @@ global_root:
1979 * @buffer: buffer to return value in 1979 * @buffer: buffer to return value in
1980 * @buflen: buffer length 1980 * @buflen: buffer length
1981 * 1981 *
1982 * Convert a dentry into an ASCII path name. If the entry has been deleted 1982 * Convert a dentry into an ASCII path name.
1983 * the string " (deleted)" is appended. Note that this is ambiguous.
1984 * 1983 *
1985 * Returns a pointer into the buffer or an error code if the 1984 * Returns a pointer into the buffer or an error code if the
1986 * path was too long. 1985 * path was too long.
@@ -1997,12 +1996,6 @@ char *__d_path(const struct path *path, struct path *root,
1997 int error; 1996 int error;
1998 1997
1999 prepend(&res, &buflen, "\0", 1); 1998 prepend(&res, &buflen, "\0", 1);
2000 if (d_unlinked(path->dentry)) {
2001 error = prepend(&res, &buflen, " (deleted)", 10);
2002 if (error)
2003 return ERR_PTR(error);
2004 }
2005
2006 error = prepend_path(path, root, &res, &buflen); 1999 error = prepend_path(path, root, &res, &buflen);
2007 if (error) 2000 if (error)
2008 return ERR_PTR(error); 2001 return ERR_PTR(error);
@@ -2010,6 +2003,22 @@ char *__d_path(const struct path *path, struct path *root,
2010 return res; 2003 return res;
2011} 2004}
2012 2005
2006/*
2007 * same as __d_path but appends "(deleted)" for unlinked files.
2008 */
2009static int path_with_deleted(const struct path *path, struct path *root,
2010 char **buf, int *buflen)
2011{
2012 prepend(buf, buflen, "\0", 1);
2013 if (d_unlinked(path->dentry)) {
2014 int error = prepend(buf, buflen, " (deleted)", 10);
2015 if (error)
2016 return error;
2017 }
2018
2019 return prepend_path(path, root, buf, buflen);
2020}
2021
2013/** 2022/**
2014 * d_path - return the path of a dentry 2023 * d_path - return the path of a dentry
2015 * @path: path to report 2024 * @path: path to report
@@ -2028,9 +2037,10 @@ char *__d_path(const struct path *path, struct path *root,
2028 */ 2037 */
2029char *d_path(const struct path *path, char *buf, int buflen) 2038char *d_path(const struct path *path, char *buf, int buflen)
2030{ 2039{
2031 char *res; 2040 char *res = buf + buflen;
2032 struct path root; 2041 struct path root;
2033 struct path tmp; 2042 struct path tmp;
2043 int error;
2034 2044
2035 /* 2045 /*
2036 * We have various synthetic filesystems that never get mounted. On 2046 * 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)
2045 get_fs_root(current->fs, &root); 2055 get_fs_root(current->fs, &root);
2046 spin_lock(&dcache_lock); 2056 spin_lock(&dcache_lock);
2047 tmp = root; 2057 tmp = root;
2048 res = __d_path(path, &tmp, buf, buflen); 2058 error = path_with_deleted(path, &tmp, &res, &buflen);
2059 if (error)
2060 res = ERR_PTR(error);
2049 spin_unlock(&dcache_lock); 2061 spin_unlock(&dcache_lock);
2050 path_put(&root); 2062 path_put(&root);
2051 return res; 2063 return res;