aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2013-08-24 12:08:17 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-10-18 10:45:45 -0400
commitad4c3cc41d6248a80231a6b87f1dab31542f011c (patch)
treeb074753cd8c210c33d32f383623a3ebee569d6c7
parent92a02b07759bb5cbed4a4793019d14247649925c (diff)
cope with potentially long ->d_dname() output for shmem/hugetlb
commit 118b23022512eb2f41ce42db70dc0568d00be4ba 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: Al Viro <viro@zeniv.linux.org.uk> Cc: Colin Cross <ccross@google.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--fs/dcache.c11
-rw-r--r--fs/hugetlbfs/inode.c8
-rw-r--r--include/linux/dcache.h1
-rw-r--r--mm/shmem.c8
4 files changed, 14 insertions, 14 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index f09b9085f7d8..da89cdfb21ab 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -2724,6 +2724,17 @@ char *dynamic_dname(struct dentry *dentry, char *buffer, int buflen,
2724 return memcpy(buffer, temp, sz); 2724 return memcpy(buffer, temp, sz);
2725} 2725}
2726 2726
2727char *simple_dname(struct dentry *dentry, char *buffer, int buflen)
2728{
2729 char *end = buffer + buflen;
2730 /* these dentries are never renamed, so d_lock is not needed */
2731 if (prepend(&end, &buflen, " (deleted)", 11) ||
2732 prepend_name(&end, &buflen, &dentry->d_name) ||
2733 prepend(&end, &buflen, "/", 1))
2734 end = ERR_PTR(-ENAMETOOLONG);
2735 return end;
2736}
2737
2727/* 2738/*
2728 * Write full pathname from the root of the filesystem into the buffer. 2739 * Write full pathname from the root of the filesystem into the buffer.
2729 */ 2740 */
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index a3f868ae3fd4..4e5f332f15d9 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -916,14 +916,8 @@ static int get_hstate_idx(int page_size_log)
916 return h - hstates; 916 return h - hstates;
917} 917}
918 918
919static char *hugetlb_dname(struct dentry *dentry, char *buffer, int buflen)
920{
921 return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)",
922 dentry->d_name.name);
923}
924
925static struct dentry_operations anon_ops = { 919static struct dentry_operations anon_ops = {
926 .d_dname = hugetlb_dname 920 .d_dname = simple_dname
927}; 921};
928 922
929/* 923/*
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index 1a6bb81f0fe5..9be5ac960fd8 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -332,6 +332,7 @@ extern int d_validate(struct dentry *, struct dentry *);
332 * helper function for dentry_operations.d_dname() members 332 * helper function for dentry_operations.d_dname() members
333 */ 333 */
334extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...); 334extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
335extern char *simple_dname(struct dentry *, char *, int);
335 336
336extern char *__d_path(const struct path *, const struct path *, char *, int); 337extern char *__d_path(const struct path *, const struct path *, char *, int);
337extern char *d_absolute_path(const struct path *, char *, int); 338extern char *d_absolute_path(const struct path *, char *, int);
diff --git a/mm/shmem.c b/mm/shmem.c
index 5e6a8422658b..509b393eceeb 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -2879,14 +2879,8 @@ EXPORT_SYMBOL_GPL(shmem_truncate_range);
2879 2879
2880/* common code */ 2880/* common code */
2881 2881
2882static char *shmem_dname(struct dentry *dentry, char *buffer, int buflen)
2883{
2884 return dynamic_dname(dentry, buffer, buflen, "/%s (deleted)",
2885 dentry->d_name.name);
2886}
2887
2888static struct dentry_operations anon_ops = { 2882static struct dentry_operations anon_ops = {
2889 .d_dname = shmem_dname 2883 .d_dname = simple_dname
2890}; 2884};
2891 2885
2892/** 2886/**