NFS: Fix the fsid revalidation in nfs_update_inode()
When we detect that we've crossed a mountpoint on the remote server, we must take care not to use that inode to revalidate the fsid on our current superblock. To do so, we label the inode as a remote mountpoint, and check for that in nfs_update_inode(). Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
		
							parent
							
								
									ee1a2c564f
								
							
						
					
					
						commit
						c37dcd334c
					
				| @ -299,6 +299,7 @@ nfs_fhget(struct super_block *sb, struct nfs_fh *fh, struct nfs_fattr *fattr) | ||||
| 				else | ||||
| 					inode->i_op = &nfs_mountpoint_inode_operations; | ||||
| 				inode->i_fop = NULL; | ||||
| 				set_bit(NFS_INO_MOUNTPOINT, &nfsi->flags); | ||||
| 			} | ||||
| 		} else if (S_ISLNK(inode->i_mode)) | ||||
| 			inode->i_op = &nfs_symlink_inode_operations; | ||||
| @ -1003,8 +1004,9 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr) | ||||
| 
 | ||||
| 	server = NFS_SERVER(inode); | ||||
| 	/* Update the fsid? */ | ||||
| 	if (S_ISDIR(inode->i_mode) | ||||
| 			&& !nfs_fsid_equal(&server->fsid, &fattr->fsid)) | ||||
| 	if (S_ISDIR(inode->i_mode) && | ||||
| 			!nfs_fsid_equal(&server->fsid, &fattr->fsid) && | ||||
| 			!test_bit(NFS_INO_MOUNTPOINT, &nfsi->flags)) | ||||
| 		server->fsid = fattr->fsid; | ||||
| 
 | ||||
| 	/*
 | ||||
|  | ||||
| @ -195,6 +195,7 @@ struct nfs_inode { | ||||
| #define NFS_INO_ADVISE_RDPLUS	(1)		/* advise readdirplus */ | ||||
| #define NFS_INO_STALE		(2)		/* possible stale inode */ | ||||
| #define NFS_INO_ACL_LRU_SET	(3)		/* Inode is on the LRU list */ | ||||
| #define NFS_INO_MOUNTPOINT	(4)		/* inode is remote mountpoint */ | ||||
| 
 | ||||
| static inline struct nfs_inode *NFS_I(const struct inode *inode) | ||||
| { | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user