ovl: move impure to ovl_inode
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
cf31c46347
commit
13c72075ac
@ -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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
#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);
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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);
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user