diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 24 | 
1 files changed, 23 insertions, 1 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index c93c12063b3a..a691fa10b3e9 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -4023,6 +4023,23 @@ static void test_fs_location_for_trunking(struct nfs4_fs_location *location,  	}  } +static bool _is_same_nfs4_pathname(struct nfs4_pathname *path1, +				   struct nfs4_pathname *path2) +{ +	int i; + +	if (path1->ncomponents != path2->ncomponents) +		return false; +	for (i = 0; i < path1->ncomponents; i++) { +		if (path1->components[i].len != path2->components[i].len) +			return false; +		if (memcmp(path1->components[i].data, path2->components[i].data, +				path1->components[i].len)) +			return false; +	} +	return true; +} +  static int _nfs4_discover_trunking(struct nfs_server *server,  				   struct nfs_fh *fhandle)  { @@ -4056,9 +4073,13 @@ static int _nfs4_discover_trunking(struct nfs_server *server,  	if (status)  		goto out_free_3; -	for (i = 0; i < locations->nlocations; i++) +	for (i = 0; i < locations->nlocations; i++) { +		if (!_is_same_nfs4_pathname(&locations->fs_path, +					&locations->locations[i].rootpath)) +			continue;  		test_fs_location_for_trunking(&locations->locations[i], clp,  					      server); +	}  out_free_3:  	kfree(locations->fattr);  out_free_2: @@ -6268,6 +6289,7 @@ nfs4_set_security_label(struct inode *inode, const void *buf, size_t buflen)  	if (status == 0)  		nfs_setsecurity(inode, fattr); +	nfs_free_fattr(fattr);  	return status;  }  #endif	/* CONFIG_NFS_V4_SECURITY_LABEL */  |