Commit 13c72075 authored by Miklos Szeredi's avatar Miklos Szeredi

ovl: move impure to ovl_inode

Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
parent cf31c463
...@@ -490,6 +490,10 @@ struct inode *ovl_get_inode(struct dentry *dentry, struct dentry *upperdentry) ...@@ -490,6 +490,10 @@ struct inode *ovl_get_inode(struct dentry *dentry, struct dentry *upperdentry)
} }
ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev); ovl_fill_inode(inode, realinode->i_mode, realinode->i_rdev);
ovl_inode_init(inode, upperdentry, lowerdentry); ovl_inode_init(inode, upperdentry, lowerdentry);
if (upperdentry && ovl_is_impuredir(upperdentry))
ovl_set_flag(OVL_IMPURE, inode);
if (inode->i_state & I_NEW) if (inode->i_state & I_NEW)
unlock_new_inode(inode); unlock_new_inode(inode);
out: out:
......
...@@ -341,7 +341,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -341,7 +341,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
unsigned int ctr = 0; unsigned int ctr = 0;
struct inode *inode = NULL; struct inode *inode = NULL;
bool upperopaque = false; bool upperopaque = false;
bool upperimpure = false;
char *upperredirect = NULL; char *upperredirect = NULL;
struct dentry *this; struct dentry *this;
unsigned int i; unsigned int i;
...@@ -386,8 +385,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -386,8 +385,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
poe = roe; poe = roe;
} }
upperopaque = d.opaque; upperopaque = d.opaque;
if (upperdentry && d.is_dir)
upperimpure = ovl_is_impuredir(upperdentry);
} }
if (!d.stop && poe->numlower) { if (!d.stop && poe->numlower) {
...@@ -434,7 +431,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry, ...@@ -434,7 +431,6 @@ struct dentry *ovl_lookup(struct inode *dir, struct dentry *dentry,
goto out_put; goto out_put;
oe->opaque = upperopaque; oe->opaque = upperopaque;
oe->impure = upperimpure;
memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr); memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr);
dentry->d_fsdata = oe; dentry->d_fsdata = oe;
......
...@@ -26,6 +26,10 @@ enum ovl_path_type { ...@@ -26,6 +26,10 @@ enum ovl_path_type {
#define OVL_XATTR_ORIGIN OVL_XATTR_PREFIX "origin" #define OVL_XATTR_ORIGIN OVL_XATTR_PREFIX "origin"
#define OVL_XATTR_IMPURE OVL_XATTR_PREFIX "impure" #define OVL_XATTR_IMPURE OVL_XATTR_PREFIX "impure"
enum ovl_flag {
OVL_IMPURE,
};
/* /*
* The tuple (fh,uuid) is a universal unique identifier for a copy up origin, * The tuple (fh,uuid) is a universal unique identifier for a copy up origin,
* where: * where:
...@@ -195,7 +199,6 @@ struct inode *ovl_inode_real(struct inode *inode); ...@@ -195,7 +199,6 @@ struct inode *ovl_inode_real(struct inode *inode);
struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry); struct ovl_dir_cache *ovl_dir_cache(struct dentry *dentry);
void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache); void ovl_set_dir_cache(struct dentry *dentry, struct ovl_dir_cache *cache);
bool ovl_dentry_is_opaque(struct dentry *dentry); bool ovl_dentry_is_opaque(struct dentry *dentry);
bool ovl_dentry_is_impure(struct dentry *dentry);
bool ovl_dentry_is_whiteout(struct dentry *dentry); bool ovl_dentry_is_whiteout(struct dentry *dentry);
void ovl_dentry_set_opaque(struct dentry *dentry); void ovl_dentry_set_opaque(struct dentry *dentry);
bool ovl_redirect_dir(struct super_block *sb); bool ovl_redirect_dir(struct super_block *sb);
...@@ -215,6 +218,8 @@ int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry, ...@@ -215,6 +218,8 @@ int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
const char *name, const void *value, size_t size, const char *name, const void *value, size_t size,
int xerr); int xerr);
int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry); int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry);
void ovl_set_flag(unsigned long flag, struct inode *inode);
bool ovl_test_flag(unsigned long flag, struct inode *inode);
static inline bool ovl_is_impuredir(struct dentry *dentry) static inline bool ovl_is_impuredir(struct dentry *dentry)
{ {
......
...@@ -41,7 +41,6 @@ struct ovl_entry { ...@@ -41,7 +41,6 @@ struct ovl_entry {
struct { struct {
u64 version; u64 version;
bool opaque; bool opaque;
bool impure;
bool copying; bool copying;
}; };
struct rcu_head rcu; struct rcu_head rcu;
...@@ -54,6 +53,7 @@ struct ovl_entry *ovl_alloc_entry(unsigned int numlower); ...@@ -54,6 +53,7 @@ struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
struct ovl_inode { struct ovl_inode {
const char *redirect; const char *redirect;
unsigned long flags;
struct inode vfs_inode; struct inode vfs_inode;
struct dentry *__upperdentry; struct dentry *__upperdentry;
struct inode *lower; struct inode *lower;
......
...@@ -170,6 +170,7 @@ static struct inode *ovl_alloc_inode(struct super_block *sb) ...@@ -170,6 +170,7 @@ static struct inode *ovl_alloc_inode(struct super_block *sb)
struct ovl_inode *oi = kmem_cache_alloc(ovl_inode_cachep, GFP_KERNEL); struct ovl_inode *oi = kmem_cache_alloc(ovl_inode_cachep, GFP_KERNEL);
oi->redirect = NULL; oi->redirect = NULL;
oi->flags = 0;
oi->__upperdentry = NULL; oi->__upperdentry = NULL;
oi->lower = NULL; oi->lower = NULL;
...@@ -1004,7 +1005,8 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent) ...@@ -1004,7 +1005,8 @@ static int ovl_fill_super(struct super_block *sb, void *data, int silent)
kfree(lowertmp); kfree(lowertmp);
if (upperpath.dentry) { if (upperpath.dentry) {
oe->impure = ovl_is_impuredir(upperpath.dentry); if (ovl_is_impuredir(upperpath.dentry))
ovl_set_flag(OVL_IMPURE, d_inode(root_dentry));
} }
for (i = 0; i < numlower; i++) { for (i = 0; i < numlower; i++) {
oe->lowerstack[i].dentry = stack[i].dentry; oe->lowerstack[i].dentry = stack[i].dentry;
......
...@@ -178,13 +178,6 @@ bool ovl_dentry_is_opaque(struct dentry *dentry) ...@@ -178,13 +178,6 @@ bool ovl_dentry_is_opaque(struct dentry *dentry)
return oe->opaque; return oe->opaque;
} }
bool ovl_dentry_is_impure(struct dentry *dentry)
{
struct ovl_entry *oe = dentry->d_fsdata;
return oe->impure;
}
bool ovl_dentry_is_whiteout(struct dentry *dentry) bool ovl_dentry_is_whiteout(struct dentry *dentry)
{ {
return !dentry->d_inode && ovl_dentry_is_opaque(dentry); return !dentry->d_inode && ovl_dentry_is_opaque(dentry);
...@@ -344,9 +337,8 @@ int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry, ...@@ -344,9 +337,8 @@ int ovl_check_setxattr(struct dentry *dentry, struct dentry *upperdentry,
int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry) int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry)
{ {
int err; int err;
struct ovl_entry *oe = dentry->d_fsdata;
if (oe->impure) if (ovl_test_flag(OVL_IMPURE, d_inode(dentry)))
return 0; return 0;
/* /*
...@@ -356,7 +348,17 @@ int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry) ...@@ -356,7 +348,17 @@ int ovl_set_impure(struct dentry *dentry, struct dentry *upperdentry)
err = ovl_check_setxattr(dentry, upperdentry, OVL_XATTR_IMPURE, err = ovl_check_setxattr(dentry, upperdentry, OVL_XATTR_IMPURE,
"y", 1, 0); "y", 1, 0);
if (!err) if (!err)
oe->impure = true; ovl_set_flag(OVL_IMPURE, d_inode(dentry));
return err; return err;
} }
void ovl_set_flag(unsigned long flag, struct inode *inode)
{
set_bit(flag, &OVL_I(inode)->flags);
}
bool ovl_test_flag(unsigned long flag, struct inode *inode)
{
return test_bit(flag, &OVL_I(inode)->flags);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment