Unionfs: fixes to cache-coherency checking code
authorErez_Zadok <ezk@cs.sunysb.edu>
Tue, 31 Jul 2007 07:33:24 +0000 (03:33 -0400)
committerErez Zadok <ezk@cs.sunysb.edu>
Sun, 6 Mar 2011 08:42:37 +0000 (03:42 -0500)
Under memory pressure, in_newer_lower could be called on uninitialized
dentries or inodes.  So return 0 safely in that case (rather than oops).
This is OK because is_newer_lower will be called again on the same object(s)
and cache-coherency will be validated and maintained then.

Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/unionfs/dentry.c

index 11d898d342ef78d44ec7a98399364728aa9ff27e..f3c1258f7551e57669698ee75862711538a08bef 100644 (file)
@@ -189,10 +189,15 @@ out:
 int is_newer_lower(const struct dentry *dentry)
 {
        int bindex;
-       struct inode *inode = dentry->d_inode;
+       struct inode *inode;
        struct inode *lower_inode;
 
-       if (!inode)
+       /* ignore if we're called on semi-initialized dentries/inodes */
+       if (!dentry || !UNIONFS_D(dentry))
+               return 0;
+       inode = dentry->d_inode;
+       if (!inode || !UNIONFS_I(inode) ||
+           ibstart(inode) < 0 || ibend(inode) < 0)
                return 0;
 
        for (bindex = ibstart(inode); bindex <= ibend(inode); bindex++) {