GIT: unionfs2-2.6.27.y: Unionfs: file_release must always succeed

Erez Zadok ezk at fsl.cs.sunysb.edu
Thu Aug 12 23:18:11 EDT 2010


commit 2a1daabfbf94dd94e031995a7664f82a18faf2f8
Author: Erez Zadok <ezk at cs.sunysb.edu>
Date:   Wed Sep 17 11:41:28 2008 -0400

    Unionfs: file_release must always succeed
    
    Why does f_op->release return an int if the VFS ignores it?!
    
    Signed-off-by: Erez Zadok <ezk at cs.sunysb.edu>

diff --git a/fs/unionfs/commonfops.c b/fs/unionfs/commonfops.c
index 214ad86..5938adf 100644
--- a/fs/unionfs/commonfops.c
+++ b/fs/unionfs/commonfops.c
@@ -656,15 +656,15 @@ int unionfs_file_release(struct inode *inode, struct file *file)
 	unionfs_lock_dentry(dentry, UNIONFS_DMUTEX_CHILD);
 
 	/*
-	 * Yes, we have to revalidate this file even if it's being released.
-	 * This is important for open-but-unlinked files, as well as mmap
-	 * support.
+	 * We try to revalidate, but the VFS ignores return return values
+	 * from file->release, so we must always try to succeed here,
+	 * including to do the kfree and dput below.  So if revalidation
+	 * failed, all we can do is print some message and keep going.
 	 */
 	err = unionfs_file_revalidate(file, parent,
 				      UNIONFS_F(file)->wrote_to_file);
-	if (unlikely(err))
-		goto out;
-	unionfs_check_file(file);
+	if (!err)
+		unionfs_check_file(file);
 	fileinfo = UNIONFS_F(file);
 	BUG_ON(file->f_path.dentry->d_inode != inode);
 	inodeinfo = UNIONFS_I(inode);
@@ -705,7 +705,6 @@ int unionfs_file_release(struct inode *inode, struct file *file)
 	}
 	kfree(fileinfo);
 
-out:
 	unionfs_unlock_dentry(dentry);
 	unionfs_unlock_parent(dentry, parent);
 	unionfs_read_unlock(sb);


More information about the unionfs-cvs mailing list