[Devel,rh7,1/4] VFS: Introduce inode-getting helpers for layered/unioned fs environments

Submitted by Maxim Patlasov on July 27, 2016, 1:06 a.m.

Details

Message ID 20160727010559.13798.39997.stgit@maxim-thinkpad
State New
Series "overlayfs: missing detection of hardlinks in vfs_rename() on overlayfs"
Headers show

Commit Message

Maxim Patlasov July 27, 2016, 1:06 a.m.
The patch backports upstream commit 155e35d4daa804582f75acaa2c74ec797a89c615:

> VFS: Introduce inode-getting helpers for layered/unioned fs environments
>
> Introduce some function for getting the inode (and also the dentry) in an
> environment where layered/unioned filesystems are in operation.
>
> The problem is that we have places where we need *both* the union dentry and
> the lower source or workspace inode or dentry available, but we can only have
> a handle on one of them.  Therefore we need to derive the handle to the other
> from that.
>
> The idea is to introduce an extra field in struct dentry that allows the union
> dentry to refer to and pin the lower dentry.
>
> Signed-off-by: David Howells <dhowells@redhat.com>
> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

https://jira.sw.ru/browse/PSBM-47981

Signed-off-by: Maxim Patlasov <mpatlasov@virtuozzo.com>
---
 include/linux/dcache.h |   57 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)

Patch hide | download patch | download mbox

diff --git a/include/linux/dcache.h b/include/linux/dcache.h
index b55fb2e..2f6e4d8 100644
--- a/include/linux/dcache.h
+++ b/include/linux/dcache.h
@@ -470,4 +470,61 @@  static inline unsigned long vfs_pressure_ratio(unsigned long val)
 {
 	return mult_frac(val, sysctl_vfs_cache_pressure, 100);
 }
+
+/**
+ * d_inode - Get the actual inode of this dentry
+ * @dentry: The dentry to query
+ *
+ * This is the helper normal filesystems should use to get at their own inodes
+ * in their own dentries and ignore the layering superimposed upon them.
+ */
+static inline struct inode *d_inode(const struct dentry *dentry)
+{
+	return dentry->d_inode;
+}
+
+/**
+ * d_inode_rcu - Get the actual inode of this dentry with ACCESS_ONCE()
+ * @dentry: The dentry to query
+ *
+ * This is the helper normal filesystems should use to get at their own inodes
+ * in their own dentries and ignore the layering superimposed upon them.
+ */
+static inline struct inode *d_inode_rcu(const struct dentry *dentry)
+{
+	return ACCESS_ONCE(dentry->d_inode);
+}
+
+/**
+ * d_backing_inode - Get upper or lower inode we should be using
+ * @upper: The upper layer
+ *
+ * This is the helper that should be used to get at the inode that will be used
+ * if this dentry were to be opened as a file.  The inode may be on the upper
+ * dentry or it may be on a lower dentry pinned by the upper.
+ *
+ * Normal filesystems should not use this to access their own inodes.
+ */
+static inline struct inode *d_backing_inode(const struct dentry *upper)
+{
+	struct inode *inode = upper->d_inode;
+
+	return inode;
+}
+
+/**
+ * d_backing_dentry - Get upper or lower dentry we should be using
+ * @upper: The upper layer
+ *
+ * This is the helper that should be used to get the dentry of the inode that
+ * will be used if this dentry were opened as a file.  It may be the upper
+ * dentry or it may be a lower dentry pinned by the upper.
+ *
+ * Normal filesystems should not use this to access their own dentries.
+ */
+static inline struct dentry *d_backing_dentry(struct dentry *upper)
+{
+	return upper;
+}
+
 #endif	/* __LINUX_DCACHE_H */