From: Vivek Goyal <vgoyal@redhat.com>
To: amir73il@gmail.com, miklos@szeredi.hu
Cc: linux-unionfs@vger.kernel.org, yangerkun@huawei.com, vgoyal@redhat.com
Subject: [PATCH v2 1/3] overlayfs: Simplify setting of origin for index lookup
Date: Mon, 1 Jun 2020 11:56:50 -0400 [thread overview]
Message-ID: <20200601155652.17486-2-vgoyal@redhat.com> (raw)
In-Reply-To: <20200601155652.17486-1-vgoyal@redhat.com>
overlayfs can keep index of copied up files and directories and it
seems to serve two primary puroposes. For regular files, it avoids
breaking lower hardlinks over copy up. For directories it seems to
be used for various error checks.
During ovl_lookup(), we lookup for index using lower dentry in many
a cases. That lower dentry is called "origin" and following is a summary
of current logic.
If there is no upperdentry, always lookup for index using lower dentry.
For regular files it helps avoiding breaking hard links over copyup
and for directories it seems to be just error checks.
If there is an upperdentry, then there are 3 possible cases.
- For directories, lower dentry is found using two ways. One is regular
path based lookup in lower layers and second is using ORIGIN xattr
on upper dentry. First verify that path based lookup lower dentry
matches the one pointed by upper ORIGIN xattr. If yes, use this
verified origin for index lookup.
- For regular files (non-metacopy), there is no path based lookup in
lower layers as lookup stops once we find upper dentry. So there
is no origin verification. If there is ORIGIN xattr present on upper,
use that to lookup index otherwise don't.
- For regular metacopy files, again lower dentry is found using
path based lookup as well as ORIGIN xattr on upper. Path based lookup
is continued in this case to find lower data dentry for metacopy
upper. So like directories we only use verified origin. If ORIGIN
xattr is not present (Either because lower did not support file
handles or because this is hardlink copied up with index=off), then
don't use path lookup based lower dentry as origin. This is same
as regular non-metacopy file case.
Suggested-by: Amir Goldstein <amir73il@gmail.com>
Signed-off-by: Vivek Goyal <vgoyal@redhat.com>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
---
fs/overlayfs/namei.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/fs/overlayfs/namei.c b/fs/overlayfs/namei.c
index 0db23baf98e7..c6208f84129f 100644
--- a/fs/overlayfs/namei.c
+++ b/fs/overlayfs/namei.c
@@ -1005,25 +1005,30 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
}
stack = origin_path;
ctr = 1;
+ origin = origin_path->dentry;
origin_path = NULL;
}
/*
- * Lookup index by lower inode and verify it matches upper inode.
- * We only trust dir index if we verified that lower dir matches
- * origin, otherwise dir index entries may be inconsistent and we
- * ignore them.
+ * Always lookup index if there is no-upperdentry.
*
- * For non-dir upper metacopy dentry, we already set "origin" if we
- * verified that lower matched upper origin. If upper origin was
- * not present (because lower layer did not support fh encode/decode),
- * or indexing is not enabled, do not set "origin" and skip looking up
- * index. This case should be handled in same way as a non-dir upper
- * without ORIGIN is handled.
+ * For the case of upperdentry, we have set origin by now if it
+ * needed to be set. There are basically three cases.
+ *
+ * For directories, lookup index by lower inode and verify it matches
+ * upper inode. We only trust dir index if we verified that lower dir
+ * matches origin, otherwise dir index entries may be inconsistent
+ * and we ignore them.
+ *
+ * For regular upper, we already set origin if upper had ORIGIN
+ * xattr. There is no verification though as there is no path
+ * based dentry lookup in lower in this case.
+ *
+ * For metacopy upper, we set a verified origin already if index
+ * is enabled and if upper had an ORIGIN xattr.
*
- * Always lookup index of non-dir non-metacopy and non-upper.
*/
- if (ctr && (!upperdentry || (!d.is_dir && !metacopy)))
+ if (!upperdentry && ctr)
origin = stack[0].dentry;
if (origin && ovl_indexdir(dentry->d_sb) &&
--
2.25.4
next prev parent reply other threads:[~2020-06-01 15:57 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-01 15:56 [PATCH v2 0/3] overlayfs: Do not check metacopy in ovl_get_inode() Vivek Goyal
2020-06-01 15:56 ` Vivek Goyal [this message]
2020-06-01 15:56 ` [PATCH v2 2/3] overlayfs: ovl_lookup(): Use only uppermetacopy state Vivek Goyal
2020-06-01 16:25 ` Amir Goldstein
2020-06-01 15:56 ` [PATCH v2 3/3] overlayfs: Initialize OVL_UPPERDATA in ovl_lookup() Vivek Goyal
2020-06-03 7:13 ` [PATCH v2 0/3] overlayfs: Do not check metacopy in ovl_get_inode() yangerkun
2020-06-03 7:59 ` 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=20200601155652.17486-2-vgoyal@redhat.com \
--to=vgoyal@redhat.com \
--cc=amir73il@gmail.com \
--cc=linux-unionfs@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=yangerkun@huawei.com \
/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