NFSv4.1: Fix umount when filelayout DS is also the MDS
authorTrond Myklebust <Trond.Myklebust@netapp.com>
Thu, 14 Jun 2012 17:08:38 +0000 (13:08 -0400)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Mon, 18 Jun 2012 12:45:16 +0000 (08:45 -0400)
commit2a4c8994eeef50796015f8a2005e4a75c1929166
tree2a81f88f63dfd1cabcbf0b968a027cd39f66b319
parent39a50b42f7026027b54131291ad0f350100eac95
NFSv4.1: Fix umount when filelayout DS is also the MDS

Currently there is a 'chicken and egg' issue when the DS is also the mounted
MDS. The nfs_match_client() reference from nfs4_set_ds_client bumps the
cl_count, the nfs_client is not freed at umount, and nfs4_deviceid_purge_client
is not called to dereference the MDS usage of a deviceid which holds a
reference to the DS nfs_client.  The result is the umount program returns,
but the nfs_client is not freed, and the cl_session hearbeat continues.

The MDS (and all other nfs mounts) lose their last nfs_client reference in
nfs_free_server when the last nfs_server (fsid) is umounted.
The file layout DS lose their last nfs_client reference in destroy_ds
when the last deviceid referencing the data server is put and destroy_ds is
called. This is triggered by a call to nfs4_deviceid_purge_client which
removes references to a pNFS deviceid used by an MDS mount.

The fix is to track how many pnfs enabled filesystems are mounted from
this server, and then to purge the device id cache once that count reaches
zero.

Reported-by: Jorge Mora <Jorge.Mora@netapp.com>
Reported-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
fs/nfs/client.c
fs/nfs/pnfs.c
include/linux/nfs_fs_sb.h