diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/dcache.c | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/fs/dcache.c b/fs/dcache.c index d09d93819b4d..7fccb00f498d 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 | */ | ||
2009 | static 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 | */ |
2029 | char *d_path(const struct path *path, char *buf, int buflen) | 2038 | char *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; |