Commit ad4c3cc4 authored by Al Viro's avatar Al Viro Committed by Greg Kroah-Hartman

cope with potentially long ->d_dname() output for shmem/hugetlb

commit 118b2302 upstream.

dynamic_dname() is both too much and too little for those - the
output may be well in excess of 64 bytes dynamic_dname() assumes
to be enough (thanks to ashmem feeding really long names to
shmem_file_setup()) and vsnprintf() is an overkill for those
guys.
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Cc: Colin Cross <ccross@google.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 92a02b07
...@@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen, ...@@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
return memcpy(buffer, temp, sz); return memcpy(buffer, temp, sz);
} }
char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
{
char *end = buffer + buflen;
/* these dentries are never renamed, so d_lock is not needed */
if (prepend(&end, &buflen, " (deleted)", 11) ||
prepend_name(&end, &buflen, &dentry->d_name) ||
prepend(&end, &buflen, "/", 1))
end = ERR_PTR(-ENAMETOOLONG);
return end;
}
/* /*
* Write full pathname from the root of the filesystem into the buffer. * Write full pathname from the root of the filesystem into the buffer.
*/ */
......
...@@ -916,14 +916,8 @@ static int get_hstate_idx(int page_size_log) ...@@ -916,14 +916,8 @@ static int get_hstate_idx(int page_size_log)
return h - hstates; return h - hstates;
} }
static char *hugetlb_dname(struct dentry *dentry, char *buffer, int buflen)
{
return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)",
dentry->d_name.name);
}
static struct dentry_operations anon_ops = { static struct dentry_operations anon_ops = {
.d_dname = hugetlb_dname .d_dname = simple_dname
}; };
/* /*
......
...@@ -332,6 +332,7 @@ extern int d_validate(struct dentry *, struct dentry *); ...@@ -332,6 +332,7 @@ extern int d_validate(struct dentry *, struct dentry *);
* helper function for dentry_operations.d_dname() members * helper function for dentry_operations.d_dname() members
*/ */
extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
extern char *simple_dname(struct dentry *, char *, int);
extern char *__d_path(const struct path *, const struct path *, char *, int); extern char *__d_path(const struct path *, const struct path *, char *, int);
extern char *d_absolute_path(const struct path *, char *, int); extern char *d_absolute_path(const struct path *, char *, int);
......
...@@ -2879,14 +2879,8 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range); ...@@ -2879,14 +2879,8 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);
/* common code */ /* common code */
static char *shmem_dname(struct dentry *dentry, char *buffer, int buflen)
{
return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)",
dentry->d_name.name);
}
static struct dentry_operations anon_ops = { static struct dentry_operations anon_ops = {
.d_dname = shmem_dname .d_dname = simple_dname
}; };
/** /**
......
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