]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - fs/overlayfs/inode.c
ovl: fix false positive ESTALE on lookup
[mirror_ubuntu-artful-kernel.git] / fs / overlayfs / inode.c
index 5bc71642b22605367ee319abdf8e45a0ec9adcde..ef55c926463ca5d77a24f6c53b0342298c5ca2c6 100644 (file)
@@ -576,10 +576,13 @@ static int ovl_inode_set(struct inode *inode, void *data)
 static bool ovl_verify_inode(struct inode *inode, struct dentry *lowerdentry,
                             struct dentry *upperdentry)
 {
-       struct inode *lowerinode = lowerdentry ? d_inode(lowerdentry) : NULL;
-
-       /* Lower (origin) inode must match, even if NULL */
-       if (ovl_inode_lower(inode) != lowerinode)
+       /*
+        * Allow non-NULL lower inode in ovl_inode even if lowerdentry is NULL.
+        * This happens when finding a copied up overlay inode for a renamed
+        * or hardlinked overlay dentry and lower dentry cannot be followed
+        * by origin because lower fs does not support file handles.
+        */
+       if (lowerdentry && ovl_inode_lower(inode) != d_inode(lowerdentry))
                return false;
 
        /*