From 01eca3a18cbe48912d266148c05f0dc0825ec59d Mon Sep 17 00:00:00 2001 From: Erez Zadok Date: Wed, 23 Apr 2008 19:05:40 -0400 Subject: [PATCH] Unionfs: maintain one-open-file invariant for non-directories Signed-off-by: Erez Zadok --- fs/unionfs/commonfops.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/unionfs/commonfops.c b/fs/unionfs/commonfops.c index 2706194feae..82b0eea4734 100644 --- a/fs/unionfs/commonfops.c +++ b/fs/unionfs/commonfops.c @@ -320,7 +320,9 @@ static int __unionfs_file_revalidate(struct file *file, struct dentry *dentry, * to refresh things. */ if (d_deleted(dentry) || - (sbgen <= fgen && dbstart(dentry) == fbstart(file))) + (sbgen <= fgen && + dbstart(dentry) == fbstart(file) && + unionfs_lower_file(file))) goto out_may_copyup; /* save orig branch ID */ @@ -369,6 +371,8 @@ static int __unionfs_file_revalidate(struct file *file, struct dentry *dentry, unionfs_mntput(sb->s_root, branch_id_to_idx(sb, orig_brid)); } + /* regular files have only one open lower file */ + fbend(file) = fbstart(file); } atomic_set(&UNIONFS_F(file)->generation, atomic_read(&UNIONFS_I(dentry->d_inode)->generation)); @@ -381,6 +385,9 @@ out_may_copyup: pr_debug("unionfs: do delay copyup of \"%s\"\n", dentry->d_name.name); err = do_delayed_copyup(file); + /* regular files have only one open lower file */ + if (!err && !S_ISDIR(dentry->d_inode->i_mode)) + fbend(file) = fbstart(file); } out: -- 2.34.1