oe->opaque = upperopaque;
oe->impure = upperimpure;
- oe->redirect = upperredirect;
memcpy(oe->lowerstack, stack, sizeof(struct path) * ctr);
dentry->d_fsdata = oe;
inode = ovl_get_inode(dentry, upperdentry);
if (!inode)
goto out_free_oe;
+
+ OVL_I(inode)->redirect = upperredirect;
}
revert_creds(old_cred);
union {
struct {
u64 version;
- const char *redirect;
bool opaque;
bool impure;
bool copying;
struct ovl_entry *ovl_alloc_entry(unsigned int numlower);
struct ovl_inode {
+ const char *redirect;
struct inode vfs_inode;
struct dentry *__upperdentry;
struct inode *lower;
if (oe) {
unsigned int i;
- kfree(oe->redirect);
for (i = 0; i < oe->numlower; i++)
dput(oe->lowerstack[i].dentry);
kfree_rcu(oe, rcu);
{
struct ovl_inode *oi = kmem_cache_alloc(ovl_inode_cachep, GFP_KERNEL);
+ oi->redirect = NULL;
oi->__upperdentry = NULL;
oi->lower = NULL;
struct ovl_inode *oi = OVL_I(inode);
dput(oi->__upperdentry);
+ kfree(oi->redirect);
call_rcu(&inode->i_rcu, ovl_i_callback);
}
const char *ovl_dentry_get_redirect(struct dentry *dentry)
{
- struct ovl_entry *oe = dentry->d_fsdata;
-
- return oe->redirect;
+ return OVL_I(d_inode(dentry))->redirect;
}
void ovl_dentry_set_redirect(struct dentry *dentry, const char *redirect)
{
- struct ovl_entry *oe = dentry->d_fsdata;
+ struct ovl_inode *oi = OVL_I(d_inode(dentry));
- kfree(oe->redirect);
- oe->redirect = redirect;
+ kfree(oi->redirect);
+ oi->redirect = redirect;
}
void ovl_inode_init(struct inode *inode, struct dentry *upperdentry,