Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757854AbcJYLZC (ORCPT ); Tue, 25 Oct 2016 07:25:02 -0400 Received: from mail-wm0-f68.google.com ([74.125.82.68]:36041 "EHLO mail-wm0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752711AbcJYLY7 (ORCPT ); Tue, 25 Oct 2016 07:24:59 -0400 MIME-Version: 1.0 In-Reply-To: <1477380887-21333-2-git-send-email-mszeredi@redhat.com> References: <1477380887-21333-1-git-send-email-mszeredi@redhat.com> <1477380887-21333-2-git-send-email-mszeredi@redhat.com> From: Amir Goldstein Date: Tue, 25 Oct 2016 14:24:56 +0300 Message-ID: Subject: Re: [PATCH 1/3] ovl: check fs features To: Miklos Szeredi Cc: linux-unionfs@vger.kernel.org, Guillem Jover , Raphael Hertzog , linux-fsdevel , linux-kernel , stable@vger.kernel.org Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 4888 Lines: 133 On Tue, Oct 25, 2016 at 10:34 AM, Miklos Szeredi wrote: > To allow adding new, backward incompatible features to overlayfs, we need a > way to store the list of features in the overlay. This is done via > "trusted.overlay.features" xattr on the root of the upper layer (or one of > the lower layers, that previously acted as an upper layer). It's a comma > separated list of case sensitive strings. > > If an overlay has an unknown feature, mount shall return an error. So > mechanism should only be used for backward incompatible features. So maybe be explicit and call the attribute trusted.overlay.incompat_features, to allow future addition of compat and rocompat feature sets? > > This patch doesn't add any features. If the "trusted.overlay.features" > xattr contains a non-empty list, then return EINVAL error for the mount. > > Signed-off-by: Miklos Szeredi > Cc: > --- > Documentation/filesystems/overlayfs.txt | 12 ++++++++++ > fs/overlayfs/overlayfs.h | 1 + > fs/overlayfs/super.c | 41 +++++++++++++++++++++++++++++++++ > 3 files changed, 54 insertions(+) > > diff --git a/Documentation/filesystems/overlayfs.txt b/Documentation/filesystems/overlayfs.txt > index 7aeb8e8d80cf..5108425157ac 100644 > --- a/Documentation/filesystems/overlayfs.txt > +++ b/Documentation/filesystems/overlayfs.txt > @@ -175,6 +175,18 @@ The specified lower directories will be stacked beginning from the > rightmost one and going left. In the above example lower1 will be the > top, lower2 the middle and lower3 the bottom layer. > > +Filesystem features > +------------------- > + > +Features are enabled via "trusted.overlay.features" xattr on the root of the > +upper layer. E.g. the following command can be used to enable features "foo" > +and "bar" on the overlay: > + > + setfattr -n "trusted.overlay.features" -v "foo,bar" /upper > + mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,\ > +workdir=/work /merged > + > +If an overlay has an unknown feature, mount shall return an error. > > Non-standard behavior > --------------------- > diff --git a/fs/overlayfs/overlayfs.h b/fs/overlayfs/overlayfs.h > index f6e4d3539a25..d61d5b9d0d91 100644 > --- a/fs/overlayfs/overlayfs.h > +++ b/fs/overlayfs/overlayfs.h > @@ -19,6 +19,7 @@ enum ovl_path_type { > > #define OVL_XATTR_PREFIX XATTR_TRUSTED_PREFIX "overlay." > #define OVL_XATTR_OPAQUE OVL_XATTR_PREFIX "opaque" > +#define OVL_XATTR_FEATURES OVL_XATTR_PREFIX "features" > > #define OVL_ISUPPER_MASK 1UL > > diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c > index 30263a541fd5..d6dc8d905d00 100644 > --- a/fs/overlayfs/super.c > +++ b/fs/overlayfs/super.c > @@ -397,6 +397,39 @@ static struct dentry *ovl_workdir_create(struct vfsmount *mnt, > goto out_unlock; > } > > +static int ovl_check_features(struct dentry *root) > +{ > + int res; > + char *buf, *tmp, *p; > + > + res = vfs_getxattr(root, OVL_XATTR_FEATURES, NULL, 0); > + if (res <= 0) { > + if (res == -EOPNOTSUPP || res == -ENODATA) > + res = 0; > + return res; > + } > + > + buf = kmalloc(res + 1, GFP_TEMPORARY); > + if (!buf) > + return -ENOMEM; > + > + res = vfs_getxattr(root, OVL_XATTR_FEATURES, buf, res); > + if (res <= 0) > + goto out_free; > + > + buf[res] = '\0'; > + res = 0; > + tmp = buf; > + while ((p = strsep(&tmp, ",")) != NULL) { > + res = -EINVAL; > + pr_err("overlayfs: feature '%s' not supported\n", p); > + } > +out_free: > + kfree(buf); > + > + return res; > +} > + > static void ovl_unescape(char *s) > { > char *d = s; > @@ -471,6 +504,10 @@ static int ovl_lower_dir(const char *name, struct path *path, long *namelen, > if (err) > goto out; > > + err = ovl_check_features(path->dentry); > + if (err) > + goto out_put; > + > err = vfs_statfs(path, &statfs); > if (err) { > pr_err("overlayfs: statfs failed on '%s'\n", name); > @@ -693,6 +730,10 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) > goto out_put_upperpath; > } > > + err = ovl_check_features(upperpath.dentry); > + if (err) > + goto out_put_upperpath; > + > err = ovl_mount_dir(ufs->config.workdir, &workpath); > if (err) > goto out_put_upperpath; > -- > 2.5.5 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-unionfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html