Re: [PATCH 1/3] ovl: check fs features

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Oct 25, 2016 at 10:34 AM, Miklos Szeredi <mszeredi@xxxxxxxxxx> 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 <mszeredi@xxxxxxxxxx>
> Cc: <stable@xxxxxxxxxxxxxxx>
> ---
>  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@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]