]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: split mount options into flags and data
authorChristian Brauner <christian.brauner@ubuntu.com>
Sun, 29 Jul 2018 12:35:09 +0000 (14:35 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sun, 29 Jul 2018 16:28:44 +0000 (18:28 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/conf.h
src/lxc/confile.c

index 1eda2fe3d7cba0193c2ff0acf10992018e37bb01..2c70303a21c277fbcf80c31302c6da8e89a70cec 100644 (file)
@@ -150,14 +150,18 @@ struct lxc_tty_info {
  * optionals pivot_root, rootfs mount paths
  * @path       : the rootfs source (directory or device)
  * @mount      : where it is mounted
- * @options    : mount options
  * @bev_type   : optional backing store type
+ * @options    : mount options
+ * @mountflags : the portion of @options that are flags
+ * @data       : the porition of @options that are not flags
  */
 struct lxc_rootfs {
        char *path;
        char *mount;
-       char *options;
        char *bdev_type;
+       char *options;
+       unsigned long mountflags;
+       char *data;
 };
 
 /*
index e05ba9fcf80a38ba0ccd74569e768eec0c88a178..326782eac343204b9e832cd0b020787e51a3f0ca 100644 (file)
@@ -2143,7 +2143,32 @@ static int set_config_rootfs_mount(const char *key, const char *value,
 static int set_config_rootfs_options(const char *key, const char *value,
                                     struct lxc_conf *lxc_conf, void *data)
 {
-       return set_config_string_item(&lxc_conf->rootfs.options, value);
+       int ret;
+       unsigned long mflags = 0, pflags = 0;
+       char *mdata = NULL, *opts = NULL;
+       struct lxc_rootfs *rootfs = &lxc_conf->rootfs;
+
+       ret = parse_mntopts(value, &mflags, &mdata);
+       if (ret < 0)
+               return -EINVAL;
+
+       ret = parse_propagationopts(value, &pflags);
+       if (ret < 0) {
+               free(mdata);
+               return -EINVAL;
+       }
+
+       ret = set_config_string_item(&opts, value);
+       if (ret < 0) {
+               free(mdata);
+               return -ENOMEM;
+       }
+
+       rootfs->mountflags = mflags | pflags;
+       rootfs->options = opts;
+       rootfs->data = mdata;
+
+       return 0;
 }
 
 static int set_config_uts_name(const char *key, const char *value,
@@ -3964,6 +3989,10 @@ static inline int clr_config_rootfs_options(const char *key, struct lxc_conf *c,
 {
        free(c->rootfs.options);
        c->rootfs.options = NULL;
+
+       free(c->rootfs.data);
+       c->rootfs.data = NULL;
+
        return 0;
 }