aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Dong <hao.bigrat@gmail.com>2012-03-12 13:44:59 +0800
committerJohn Rigby <john.rigby@linaro.org>2012-06-25 15:02:27 -0600
commitdd6f02b65ad382045f6c57e482fef3f57222f098 (patch)
tree35b6836d5264866767e4c0c3760d5f92682bf7e2
parentb89fd5023055d37aca9408c57554717f220e4c0b (diff)
UBUNTU: ubuntu: overlayfs -- overlayfs: create new inode in ovl_link
Imaging using ext4 as upperdir which has a file "hello" and lowdir is totally empty. 1. mount -t overlayfs overlayfs -o lowerdir=/lower,upperdir=/upper /overlay 2. cd /overlay 3. ln hello bye then the overlayfs code will call vfs_link to create a real ext4 dentry for "bye" and create a new overlayfs dentry point to overlayfs inode (which standed for "hello"). That means: two overlayfs dentries and only one overlayfs inode. and then 4. umount /overlay 5. mount -t overlayfs overlayfs -o lowerdir=/lower,upperdir=/upper /overlay (again) 6. cd /overlay 7. ls hello bye the overlayfs will create two inodes(one for the "hello", another for the "bye") and two dentries (each point a inode).That means: two dentries and two inodes. As above, with different order of "create link" and "mount", the result is not the same. In order to make the behavior coherent, we need to create inode in ovl_link. Signed-off-by: Robin Dong <sanbai@taobao.com> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
-rw-r--r--fs/overlayfs/dir.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c
index 00aa6d99cb6..c914c9770ca 100644
--- a/fs/overlayfs/dir.c
+++ b/fs/overlayfs/dir.c
@@ -417,6 +417,7 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
struct dentry *olddentry;
struct dentry *newdentry;
struct dentry *upperdir;
+ struct inode *newinode;
err = ovl_copy_up(old);
if (err)
@@ -441,13 +442,17 @@ static int ovl_link(struct dentry *old, struct inode *newdir,
err = -ENOENT;
goto out_unlock;
}
+ newinode = ovl_new_inode(old->d_sb, newdentry->d_inode->i_mode,
+ new->d_fsdata);
+ if (!newinode)
+ goto link_fail;
ovl_dentry_version_inc(new->d_parent);
ovl_dentry_update(new, newdentry);
- ihold(old->d_inode);
- d_instantiate(new, old->d_inode);
+ d_instantiate(new, newinode);
} else {
+link_fail:
if (ovl_dentry_is_opaque(new))
ovl_whiteout(upperdir, new);
dput(newdentry);