]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Merge remote-tracking branch 'overlayfs/overlayfs-next'
authorStephen Rothwell <sfr@canb.auug.org.au>
Thu, 5 Nov 2015 00:16:32 +0000 (11:16 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 5 Nov 2015 00:16:32 +0000 (11:16 +1100)
1  2 
fs/overlayfs/super.c

diff --combined fs/overlayfs/super.c
index e38ee0fed24a2f7a343f294a793b6abea93f6f97,97cacb525974d934fec6a5cd6bef740a305c688b..30128bbc2c4e8ae4a264d99af1ef0bed4bae8200
@@@ -30,6 -30,7 +30,7 @@@ struct ovl_config 
        char *lowerdir;
        char *upperdir;
        char *workdir;
+       bool default_permissions;
  };
  
  /* private information held for overlayfs's superblock */
@@@ -154,6 -155,18 +155,18 @@@ struct dentry *ovl_entry_real(struct ov
        return realdentry;
  }
  
+ struct vfsmount *ovl_entry_mnt_real(struct ovl_entry *oe, struct inode *inode,
+                                   bool is_upper)
+ {
+       if (is_upper) {
+               struct ovl_fs *ofs = inode->i_sb->s_fs_info;
+               return ofs->upper_mnt;
+       } else {
+               return oe->numlower ? oe->lowerstack[0].mnt : NULL;
+       }
+ }
  struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry)
  {
        struct ovl_entry *oe = dentry->d_fsdata;
        return oe->cache;
  }
  
+ bool ovl_is_default_permissions(struct inode *inode)
+ {
+       struct ovl_fs *ofs = inode->i_sb->s_fs_info;
+       return ofs->config.default_permissions;
+ }
  void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache)
  {
        struct ovl_entry *oe = dentry->d_fsdata;
@@@ -589,11 -609,13 +609,13 @@@ static int ovl_show_options(struct seq_
        struct super_block *sb = dentry->d_sb;
        struct ovl_fs *ufs = sb->s_fs_info;
  
 -      seq_printf(m, ",lowerdir=%s", ufs->config.lowerdir);
 +      seq_show_option(m, "lowerdir", ufs->config.lowerdir);
        if (ufs->config.upperdir) {
 -              seq_printf(m, ",upperdir=%s", ufs->config.upperdir);
 -              seq_printf(m, ",workdir=%s", ufs->config.workdir);
 +              seq_show_option(m, "upperdir", ufs->config.upperdir);
 +              seq_show_option(m, "workdir", ufs->config.workdir);
        }
+       if (ufs->config.default_permissions)
+               seq_puts(m, ",default_permissions");
        return 0;
  }
  
@@@ -618,6 -640,7 +640,7 @@@ enum 
        OPT_LOWERDIR,
        OPT_UPPERDIR,
        OPT_WORKDIR,
+       OPT_DEFAULT_PERMISSIONS,
        OPT_ERR,
  };
  
@@@ -625,6 -648,7 +648,7 @@@ static const match_table_t ovl_tokens 
        {OPT_LOWERDIR,                  "lowerdir=%s"},
        {OPT_UPPERDIR,                  "upperdir=%s"},
        {OPT_WORKDIR,                   "workdir=%s"},
+       {OPT_DEFAULT_PERMISSIONS,       "default_permissions"},
        {OPT_ERR,                       NULL}
  };
  
@@@ -685,6 -709,10 +709,10 @@@ static int ovl_parse_opt(char *opt, str
                                return -ENOMEM;
                        break;
  
+               case OPT_DEFAULT_PERMISSIONS:
+                       config->default_permissions = true;
+                       break;
                default:
                        pr_err("overlayfs: unrecognized mount option \"%s\" or missing value\n", p);
                        return -EINVAL;