Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1653812 > unrolled thread

[PATCH 1/2] fs/dcache.c: New copy_dname method

Started by"石祤" <linxiulei@gmail.com>
First post2017-05-31 06:00 +0200
Last post2017-05-31 06:00 +0200
Articles 1 — 1 participant

Back to article view | Back to linux.kernel

This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by below is the oldest one visible, not the original post.


Contents

  [PATCH 1/2] fs/dcache.c: New copy_dname method "石祤" <linxiulei@gmail.com> - 2017-05-31 06:00 +0200

#1653812 — [PATCH 1/2] fs/dcache.c: New copy_dname method

From"石祤" <linxiulei@gmail.com>
Date2017-05-31 06:00 +0200
Subject[PATCH 1/2] fs/dcache.c: New copy_dname method
Message-ID<tN2XD-7Vx-1@gated-at.bofh.it>
From: "leilei.lin" <leilei.lin@alibaba-inc.com>

locklessly and integrally copy dentry name. It will be used later for
bugfix

Signed-off-by: leilei.lin <leilei.lin@alibaba-inc.com>
---
 fs/dcache.c            | 38 ++++++++++++++++++++++++++++++++++++++
 include/linux/dcache.h |  2 ++
 2 files changed, 40 insertions(+)

diff --git a/fs/dcache.c b/fs/dcache.c
index 95d71ed..056249b 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -3536,6 +3536,44 @@ void d_tmpfile(struct dentry *dentry, struct inode *inode)
 }
 EXPORT_SYMBOL(d_tmpfile);
 
+int copy_dname(struct dentry *dentry, char **name)
+{
+	unsigned int seq;
+	const char *dname;
+
+	/* in case that dentry was being free */
+	rcu_read_lock();
+
+	dname = dentry->d_name.name;
+
+	if (unlikely(!dname)) {
+		rcu_read_unlock();
+		return 0;
+	}
+
+	if (unlikely(dname != dentry->d_iname)) {
+		*name = kstrdup(dname, GFP_ATOMIC);
+		rcu_read_unlock();
+		if (unlikely(!*name))
+			return -ENOMEM;
+
+		return 0;
+	}
+
+	rcu_read_unlock();
+	*name = kmalloc(DNAME_INLINE_LEN, GFP_KERNEL);
+	if (unlikely(!*name))
+		return -ENOMEM;
+
+	do {
+		seq = read_seqcount_begin(&dentry->d_seq);
+		strcpy(*name, dname);
+	} while (read_seqcount_retry(&dentry->d_seq, seq));
+
+	return 0;
+}
+EXPORT_SYMBOL(copy_dname);
+
 static __initdata unsigned long dhash_entries;
 static int __init set_dhash_entries(char *str)
 {
diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index d2e38dc..a1b2aeb 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -296,6 +296,8 @@ extern char *d_path(const struct path *, char *, int);
 extern char *dentry_path_raw(struct dentry *, char *, int);
 extern char *dentry_path(struct dentry *, char *, int);
 
+extern int copy_dname(struct dentry *dentry, char **name);
+
 /* Allocation counts.. */
 
 /**
-- 
2.8.4.31.g9ed660f

[toc] | [standalone]


Back to top | Article view | linux.kernel


csiph-web