forked from Minki/linux
ovl: check on mount time if upper fs supports setting xattr
xattr are needed by overlayfs for setting opaque dir, redirect dir and copy up origin. Check at mount time by trying to set the overlay.opaque xattr on the workdir and if that fails issue a warning message. Signed-off-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
8137ae26d2
commit
82b749b2c6
@ -279,3 +279,6 @@ int ovl_copy_up(struct dentry *dentry);
|
||||
int ovl_copy_up_flags(struct dentry *dentry, int flags);
|
||||
int ovl_copy_xattr(struct dentry *old, struct dentry *new);
|
||||
int ovl_set_attr(struct dentry *upper, struct kstat *stat);
|
||||
int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
|
||||
const char *name, const void *value, size_t size,
|
||||
int xerr);
|
||||
|
@ -28,6 +28,7 @@ struct ovl_fs {
|
||||
/* creds of process who forced instantiation of super block */
|
||||
const struct cred *creator_cred;
|
||||
bool tmpfile;
|
||||
bool noxattr;
|
||||
wait_queue_head_t copyup_wq;
|
||||
/* sb common to all layers */
|
||||
struct super_block *same_sb;
|
||||
|
@ -891,6 +891,19 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
|
||||
dput(temp);
|
||||
else
|
||||
pr_warn("overlayfs: upper fs does not support tmpfile.\n");
|
||||
|
||||
/*
|
||||
* Check if upper/work fs supports trusted.overlay.*
|
||||
* xattr
|
||||
*/
|
||||
err = ovl_do_setxattr(ufs->workdir, OVL_XATTR_OPAQUE,
|
||||
"0", 1, 0);
|
||||
if (err) {
|
||||
ufs->noxattr = true;
|
||||
pr_warn("overlayfs: upper fs does not support xattr.\n");
|
||||
} else {
|
||||
vfs_removexattr(ufs->workdir, OVL_XATTR_OPAQUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -303,3 +303,24 @@ void ovl_copy_up_end(struct dentry *dentry)
|
||||
wake_up_locked(&ofs->copyup_wq);
|
||||
spin_unlock(&ofs->copyup_wq.lock);
|
||||
}
|
||||
|
||||
int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
|
||||
const char *name, const void *value, size_t size,
|
||||
int xerr)
|
||||
{
|
||||
int err;
|
||||
struct ovl_fs *ofs = dentry->d_sb->s_fs_info;
|
||||
|
||||
if (ofs->noxattr)
|
||||
return xerr;
|
||||
|
||||
err = ovl_do_setxattr(upperdentry, name, value, size, 0);
|
||||
|
||||
if (err == -EOPNOTSUPP) {
|
||||
pr_warn("overlayfs: cannot set %s xattr on upper\n", name);
|
||||
ofs->noxattr = true;
|
||||
return xerr;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user