Commit ffd1f4ed authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Al Viro

vfs: only add " (deleted)" where necessary

__d_path() has 4 callers:

  d_path()
  sys_getcwd()
  seq_path_root()
  tomoyo_realpath_from_path2()

Of these the only one which needs the " (deleted)" ending is d_path().

sys_getcwd() checks for existence before calling __d_path().

seq_path_root() is used to show the mountpoint path in
/proc/PID/mountinfo, which is always a positive.

And tomoyo doesn't want the deleted ending.

Create a helper "path_with_deleted()" as subsequent patches will need
this in multiple places.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent f2eb6575
...@@ -1979,8 +1979,7 @@ static int prepend_path(const struct path *path, struct path *root, ...@@ -1979,8 +1979,7 @@ static int prepend_path(const struct path *path, struct path *root,
* @buffer: buffer to return value in * @buffer: buffer to return value in
* @buflen: buffer length * @buflen: buffer length
* *
* Convert a dentry into an ASCII path name. If the entry has been deleted * Convert a dentry into an ASCII path name.
* the string " (deleted)" is appended. Note that this is ambiguous.
* *
* Returns a pointer into the buffer or an error code if the * Returns a pointer into the buffer or an error code if the
* path was too long. * path was too long.
...@@ -1997,12 +1996,6 @@ char *__d_path(const struct path *path, struct path *root, ...@@ -1997,12 +1996,6 @@ char *__d_path(const struct path *path, struct path *root,
int error; int error;
prepend(&res, &buflen, "\0", 1); 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); error = prepend_path(path, root, &res, &buflen);
if (error) if (error)
return ERR_PTR(error); return ERR_PTR(error);
...@@ -2010,6 +2003,22 @@ char *__d_path(const struct path *path, struct path *root, ...@@ -2010,6 +2003,22 @@ char *__d_path(const struct path *path, struct path *root,
return res; 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 * d_path - return the path of a dentry
* @path: path to report * @path: path to report
...@@ -2028,9 +2037,10 @@ char *__d_path(const struct path *path, struct path *root, ...@@ -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 *d_path(const struct path *path, char *buf, int buflen)
{ {
char *res; char *res = buf + buflen;
struct path root; struct path root;
struct path tmp; struct path tmp;
int error;
/* /*
* We have various synthetic filesystems that never get mounted. On * 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,7 +2055,9 @@ char *d_path(const struct path *path, char *buf, int buflen)
get_fs_root(current->fs, &root); get_fs_root(current->fs, &root);
spin_lock(&dcache_lock); spin_lock(&dcache_lock);
tmp = root; 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); spin_unlock(&dcache_lock);
path_put(&root); path_put(&root);
return res; return res;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment