Commit 59fb2013 authored by Vivek Goyal's avatar Vivek Goyal Committed by Miklos Szeredi

ovl: simplify setting of origin for index lookup

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: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarVivek Goyal <vgoyal@redhat.com>
Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent 522f6e6c
...@@ -994,25 +994,30 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -994,25 +994,30 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
} }
stack = origin_path; stack = origin_path;
ctr = 1; ctr = 1;
origin = origin_path->dentry;
origin_path = NULL; origin_path = NULL;
} }
/* /*
* Lookup index by lower inode and verify it matches upper inode. * Always lookup index if there is no-upperdentry.
* 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 non-dir upper metacopy dentry, we already set "origin" if we * For the case of upperdentry, we have set origin by now if it
* verified that lower matched upper origin. If upper origin was * needed to be set. There are basically three cases.
* not present (because lower layer did not support fh encode/decode), *
* or indexing is not enabled, do not set "origin" and skip looking up * For directories, lookup index by lower inode and verify it matches
* index. This case should be handled in same way as a non-dir upper * upper inode. We only trust dir index if we verified that lower dir
* without ORIGIN is handled. * 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; origin = stack[0].dentry;
if (origin && ovl_indexdir(dentry->d_sb) && if (origin && ovl_indexdir(dentry->d_sb) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment