Commit 5cf5b477 authored by Miklos Szeredi's avatar Miklos Szeredi

ovl: opaque cleanup

oe->opaque is set for

 a) whiteouts
 b) directories having the "trusted.overlay.opaque" xattr

Case b can be simplified, since setting the xattr always implies setting
oe->opaque.  Also once set, the opaque flag is never cleared.

Don't need to set opaque flag for non-directories.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent c5bef3a7
...@@ -303,12 +303,6 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir, ...@@ -303,12 +303,6 @@ static int ovl_copy_up_locked(struct dentry *workdir, struct dentry *upperdir,
ovl_dentry_update(dentry, newdentry); ovl_dentry_update(dentry, newdentry);
ovl_inode_update(d_inode(dentry), d_inode(newdentry)); ovl_inode_update(d_inode(dentry), d_inode(newdentry));
newdentry = NULL; newdentry = NULL;
/*
* Non-directores become opaque when copied up.
*/
if (!S_ISDIR(stat->mode))
ovl_dentry_set_opaque(dentry, true);
out2: out2:
dput(upper); dput(upper);
out1: out1:
......
...@@ -128,9 +128,15 @@ int ovl_create_real(struct inode *dir, struct dentry *newdentry, ...@@ -128,9 +128,15 @@ int ovl_create_real(struct inode *dir, struct dentry *newdentry,
return err; return err;
} }
static int ovl_set_opaque(struct dentry *upperdentry) static int ovl_set_opaque(struct dentry *dentry, struct dentry *upperdentry)
{ {
return ovl_do_setxattr(upperdentry, OVL_XATTR_OPAQUE, "y", 1, 0); int err;
err = ovl_do_setxattr(upperdentry, OVL_XATTR_OPAQUE, "y", 1, 0);
if (!err)
ovl_dentry_set_opaque(dentry);
return err;
} }
static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry, static int ovl_dir_getattr(struct vfsmount *mnt, struct dentry *dentry,
...@@ -274,7 +280,7 @@ static struct dentry *ovl_clear_empty(struct dentry *dentry, ...@@ -274,7 +280,7 @@ static struct dentry *ovl_clear_empty(struct dentry *dentry,
if (err) if (err)
goto out_cleanup; goto out_cleanup;
err = ovl_set_opaque(opaquedir); err = ovl_set_opaque(dentry, opaquedir);
if (err) if (err)
goto out_cleanup; goto out_cleanup;
...@@ -435,7 +441,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode, ...@@ -435,7 +441,7 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
} }
if (!hardlink && S_ISDIR(stat->mode)) { if (!hardlink && S_ISDIR(stat->mode)) {
err = ovl_set_opaque(newdentry); err = ovl_set_opaque(dentry, newdentry);
if (err) if (err)
goto out_cleanup; goto out_cleanup;
...@@ -996,29 +1002,22 @@ static int ovl_rename(struct inode *olddir, struct dentry *old, ...@@ -996,29 +1002,22 @@ static int ovl_rename(struct inode *olddir, struct dentry *old,
if (WARN_ON(olddentry->d_inode == newdentry->d_inode)) if (WARN_ON(olddentry->d_inode == newdentry->d_inode))
goto out_dput; goto out_dput;
err = 0;
if (is_dir) { if (is_dir) {
if (ovl_type_merge_or_lower(old)) { if (ovl_type_merge_or_lower(old))
err = ovl_set_redirect(old, samedir); err = ovl_set_redirect(old, samedir);
if (err) else if (!old_opaque && ovl_lower_positive(new))
goto out_dput; err = ovl_set_opaque(old, olddentry);
} else if (!old_opaque && ovl_lower_positive(new)) { if (err)
err = ovl_set_opaque(olddentry); goto out_dput;
if (err)
goto out_dput;
ovl_dentry_set_opaque(old, true);
}
} }
if (!overwrite && new_is_dir) { if (!overwrite && new_is_dir) {
if (ovl_type_merge_or_lower(new)) { if (ovl_type_merge_or_lower(new))
err = ovl_set_redirect(new, samedir); err = ovl_set_redirect(new, samedir);
if (err) else if (!new_opaque && ovl_lower_positive(old))
goto out_dput; err = ovl_set_opaque(new, newdentry);
} else if (!new_opaque && ovl_lower_positive(old)) { if (err)
err = ovl_set_opaque(newdentry); goto out_dput;
if (err)
goto out_dput;
ovl_dentry_set_opaque(new, true);
}
} }
err = ovl_do_rename(old_upperdir->d_inode, olddentry, err = ovl_do_rename(old_upperdir->d_inode, olddentry,
......
...@@ -156,7 +156,7 @@ struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry); ...@@ -156,7 +156,7 @@ struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry);
void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache); void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache);
bool ovl_dentry_is_opaque(struct dentry *dentry); bool ovl_dentry_is_opaque(struct dentry *dentry);
bool ovl_dentry_is_whiteout(struct dentry *dentry); bool ovl_dentry_is_whiteout(struct dentry *dentry);
void ovl_dentry_set_opaque(struct dentry *dentry, bool opaque); void ovl_dentry_set_opaque(struct dentry *dentry);
bool ovl_redirect_dir(struct super_block *sb); bool ovl_redirect_dir(struct super_block *sb);
void ovl_clear_redirect_dir(struct super_block *sb); void ovl_clear_redirect_dir(struct super_block *sb);
const char *ovl_dentry_get_redirect(struct dentry *dentry); const char *ovl_dentry_get_redirect(struct dentry *dentry);
......
...@@ -170,10 +170,11 @@ bool ovl_dentry_is_whiteout(struct dentry *dentry) ...@@ -170,10 +170,11 @@ bool ovl_dentry_is_whiteout(struct dentry *dentry)
return !dentry->d_inode && ovl_dentry_is_opaque(dentry); return !dentry->d_inode && ovl_dentry_is_opaque(dentry);
} }
void ovl_dentry_set_opaque(struct dentry *dentry, bool opaque) void ovl_dentry_set_opaque(struct dentry *dentry)
{ {
struct ovl_entry *oe = dentry->d_fsdata; struct ovl_entry *oe = dentry->d_fsdata;
oe->opaque = opaque;
oe->opaque = true;
} }
bool ovl_redirect_dir(struct super_block *sb) bool ovl_redirect_dir(struct super_block *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