FAILED: patch "[PATCH] NFS: Fix inode corruption in nfs_prime_dcache()" failed to apply to 4.4-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
7dc72d5f7a0ec97a53e126c46e2cbd2560757955Mon Sep 17 00:00:00 2001
From: Trond Myklebust <[email protected]>
Date: Thu, 22 Sep 2016 13:38:52 -0400
Subject: [PATCH] NFS: Fix inode corruption in nfs_prime_dcache()
Due to inode number reuse in filesystems, we can end up corrupting the inode on our client if we apply the file attributes without ensuring that the filehandle matches.
Typical symptoms include spurious "mode changed" reports in the syslog.
We still do want to ensure that we don't invalidate the dentry if the inode number matches, but we don't have a filehandle.
fs/nfs/dir.c +11 -5
@@ -435,11 +435,11 @@ int nfs_same_file(struct dentry *dentry, struct nfs_entry *entry)return 0 ; nfsi =NFS_I (inode); -if (entry->fattr->fileid == nfsi->fileid) -return 1 ; -if (nfs_compare_fh (entry->fh, &nfsi->fh) ==0 ) -return 1 ; -return 0 ; +if (entry->fattr->fileid != nfsi->fileid) +return 0 ; +if (entry->fh->size &&nfs_compare_fh (entry->fh, &nfsi->fh) !=0 ) +return 0 ; +return 1 ; } static
@@ -525,6 +525,8 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) &entry->fattr->fsid)) goto out;if (nfs_same_file (dentry, entry)) { +if (!entry->fh->size) + goto out;nfs_set_verifier (dentry,nfs_save_change_attribute (dir)); status =nfs_refresh_inode (d_inode (dentry), entry->fattr);if (!status)
@@ -537,6 +539,10 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) goto again; } } +if (!entry->fh->size) { +d_lookup_done (dentry); + goto out; + } inode =nfs_fhget (dentry->d_sb, entry->fh, entry->fattr, entry->label); alias =d_splice_alias (inode, dentry);