From: Amir Goldstein <amir73il@gmail.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: Al Viro <viro@zeniv.linux.org.uk>,
linux-unionfs@vger.kernel.org, linux-fsdevel@vger.kernel.org
Subject: [RFC][PATCH 10/13] ovl: hash overlay inodes by stable inode
Date: Mon, 17 Apr 2017 02:59:40 +0300 [thread overview]
Message-ID: <1492387183-18847-11-git-send-email-amir73il@gmail.com> (raw)
In-Reply-To: <1492387183-18847-1-git-send-email-amir73il@gmail.com>
Non directory pure upper overlay inodes are hashed
by the address of the upper real inode.
When redirect_fh feature is enabled, hash all overlay inodes
by the address of the 'stable' real inode.
The stable real inode is the pre copy up inode if it stored
in overlay.fh xattr or the pure upper real inode otherwise.
This is going to be used for looking up an overlay inode
from a real stable inode for exportfs operations.
Signed-off-by: Amir Goldstein <amir73il@gmail.com>
---
fs/overlayfs/inode.c | 18 +++++++++++++++---
fs/overlayfs/namei.c | 13 ++++++++++++-
2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/fs/overlayfs/inode.c b/fs/overlayfs/inode.c
index f7d89cf..42fa243 100644
--- a/fs/overlayfs/inode.c
+++ b/fs/overlayfs/inode.c
@@ -412,7 +412,8 @@ void ovl_inode_init(struct inode *inode, struct inode *realinode, bool is_upper)
{
ovl_inode_init_ino(inode, realinode);
ovl_set_inode_data(inode, realinode, is_upper);
- if (is_upper && !S_ISDIR(realinode->i_mode))
+ if (ovl_redirect_fh(inode->i_sb) ||
+ (is_upper && !S_ISDIR(realinode->i_mode)))
ovl_insert_inode_hash(inode, realinode);
}
@@ -420,13 +421,24 @@ void ovl_inode_update(struct inode *inode, struct inode *upperinode)
{
WARN_ON(!upperinode);
ovl_set_inode_data(inode, upperinode, true);
- if (!S_ISDIR(upperinode->i_mode))
+ if (!S_ISDIR(upperinode->i_mode) && !ovl_redirect_fh(inode->i_sb))
ovl_insert_inode_hash(inode, upperinode);
}
static int ovl_inode_test(struct inode *inode, void *data)
{
- return ovl_inode_real(inode, NULL) == OVL_INODE_REAL(data);
+ struct inode *realinode = OVL_INODE_REAL(data);
+
+ /*
+ * When all layers on same fs, compare by ino/generation of stable
+ * real inode, because i_private may get updated on copy up, but
+ * overlay inode ino/generation does not get updated.
+ */
+ if (ovl_same_sb(inode->i_sb))
+ return (inode->i_ino == realinode->i_ino &&
+ inode->i_generation == realinode->i_generation);
+ else
+ return ovl_inode_real(inode, NULL) == realinode;
}
static int ovl_inode_set(struct inode *inode, void *data)
diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index 9569ded..7aaff83 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -469,7 +469,18 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
realinode = d_inode(realdentry);
err = -ENOMEM;
- if (upperdentry && !d_is_dir(upperdentry)) {
+ /* When redirect_fh is enabled, hash inodes by stable inode */
+ if (ofs->config.redirect_fh) {
+ struct dentry *stable = ctr ? stack[0].dentry :
+ upperdentry;
+
+ inode = ovl_get_inode(dentry->d_sb, d_inode(stable),
+ !!upperdentry);
+ /* ovl_inode_real() may not be the stable inode */
+ if (realinode != d_inode(stable))
+ ovl_inode_update(inode, realinode);
+
+ } else if (upperdentry && !d_is_dir(upperdentry)) {
inode = ovl_get_inode(dentry->d_sb, realinode, true);
} else {
inode = ovl_new_inode(dentry->d_sb, realinode->i_mode,
--
2.7.4
next prev parent reply other threads:[~2017-04-16 23:59 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-16 23:59 [RFC][PATCH 00/13] overlayfs stable inodes Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 01/13] ovl: check if all layers are on the same fs Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 02/13] ovl: redirect dir by file handle on copy up Amir Goldstein
2017-04-17 13:33 ` Rock Lee
2017-04-17 14:03 ` Amir Goldstein
2017-04-17 19:49 ` Vivek Goyal
2017-04-17 21:14 ` Amir Goldstein
2017-04-19 15:16 ` Miklos Szeredi
2017-04-19 15:27 ` Amir Goldstein
2017-04-19 15:33 ` Miklos Szeredi
2017-04-19 15:43 ` Amir Goldstein
2017-04-20 8:55 ` Amir Goldstein
2017-04-21 15:02 ` Miklos Szeredi
2017-04-21 15:29 ` Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 03/13] ovl: lookup redirect by file handle Amir Goldstein
2017-04-18 13:05 ` Vivek Goyal
2017-04-18 14:05 ` Amir Goldstein
2017-04-18 18:32 ` Vivek Goyal
2017-04-18 18:57 ` Amir Goldstein
2017-04-19 15:21 ` Miklos Szeredi
2017-04-19 15:35 ` Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 04/13] ovl: store file handle of stable inode Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 05/13] ovl: lookup stable inode by file handle Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 06/13] ovl: move inode helpers to inode.c Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 07/13] ovl: create helpers for initializing hashed inode Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 08/13] ovl: allow hashing non upper inodes Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 09/13] ovl: inherit overlay inode ino/generation from real inode Amir Goldstein
2017-04-16 23:59 ` Amir Goldstein [this message]
2017-04-16 23:59 ` [RFC][PATCH 11/13] ovl: fix du --one-file-system on overlay mount Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 12/13] ovl: constant ino across copy up Amir Goldstein
2017-04-16 23:59 ` [RFC][PATCH 13/13] ovl: try to hardlink upper on copy up of lower hardlinks Amir Goldstein
2017-04-18 18:37 ` [RFC][PATCH 00/13] overlayfs stable inodes Amir Goldstein
2017-04-19 9:16 ` Miklos Szeredi
2017-04-19 10:37 ` Amir Goldstein
2017-04-19 13:52 ` Miklos Szeredi
2017-04-19 14:46 ` Amir Goldstein
2017-04-19 15:01 ` Miklos Szeredi
2017-04-19 15:17 ` Amir Goldstein
2017-04-19 22:58 ` Darrick J. Wong
2017-04-19 23:15 ` Andreas Dilger
2017-04-20 5:43 ` Amir Goldstein
2017-04-20 8:45 ` Miklos Szeredi
2017-04-20 8:47 ` Miklos Szeredi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1492387183-18847-11-git-send-email-amir73il@gmail.com \
--to=amir73il@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-unionfs@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox