diff options
author | Miklos Szeredi <mszeredi@redhat.com> | 2016-07-29 12:05:24 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@redhat.com> | 2016-07-29 12:05:24 +0200 |
commit | 39b681f8026c170a73972517269efc830db0d7ce (patch) | |
tree | 592a1c87e7b3f16d5422577ee9aa9bd6e93f49e9 /fs/overlayfs/dir.c | |
parent | ovl: permission: return ECHILD instead of ENOENT (diff) | |
download | linux-39b681f8026c170a73972517269efc830db0d7ce.tar.xz linux-39b681f8026c170a73972517269efc830db0d7ce.zip |
ovl: store real inode pointer in ->i_private
To get from overlay inode to real inode we currently use 'struct
ovl_entry', which has lifetime connected to overlay dentry. This is okay,
since each overlay dentry had a new overlay inode allocated.
Following patch will break that assumption, so need to leave out ovl_entry.
This patch stores the real inode directly in i_private, with the lowest bit
used to indicate whether the inode is upper or lower.
Lifetime rules remain, using ovl_inode_real() must only be done while
caller holds ref on overlay dentry (and hence on real dentry), or within
RCU protected regions.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Diffstat (limited to 'fs/overlayfs/dir.c')
-rw-r--r-- | fs/overlayfs/dir.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index b4eac8173f93..96b1bdcf3674 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -167,6 +167,7 @@ static void ovl_instantiate(struct dentry *dentry, struct inode *inode, { ovl_dentry_version_inc(dentry->d_parent); ovl_dentry_update(dentry, newdentry); + ovl_inode_update(inode, d_inode(newdentry)); ovl_copyattr(newdentry->d_inode, inode); d_instantiate(dentry, inode); } @@ -416,7 +417,7 @@ static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev, }; err = -ENOMEM; - inode = ovl_new_inode(dentry->d_sb, mode, dentry->d_fsdata); + inode = ovl_new_inode(dentry->d_sb, mode); if (!inode) goto out; |