nfsd4: release openowners on free in >=4.1 case

We don't need to keep openowners around in the >=4.1 case, because they
aren't needed to handle CLOSE replays any more (that's a problem for
sessions).  And doing so causes unexpected failures on a subsequent
destroy_clientid to fail.

We probably also need something comparable for lock owners on last
unlock.

Signed-off-by: J. Bruce Fields <bfields@redhat.com>
This commit is contained in:
J. Bruce Fields 2012-06-06 12:53:48 -04:00
Родитель 2930d381d2
Коммит 74dbafaf5d
1 изменённых файлов: 13 добавлений и 6 удалений

Просмотреть файл

@ -3763,12 +3763,19 @@ nfsd4_close(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
nfsd4_close_open_stateid(stp);
oo->oo_last_closed_stid = stp;
/* place unused nfs4_stateowners on so_close_lru list to be
* released by the laundromat service after the lease period
* to enable us to handle CLOSE replay
*/
if (list_empty(&oo->oo_owner.so_stateids))
move_to_close_lru(oo);
if (list_empty(&oo->oo_owner.so_stateids)) {
if (cstate->minorversion) {
release_openowner(oo);
cstate->replay_owner = NULL;
} else {
/*
* In the 4.0 case we need to keep the owners around a
* little while to handle CLOSE replay.
*/
if (list_empty(&oo->oo_owner.so_stateids))
move_to_close_lru(oo);
}
}
out:
if (!cstate->replay_owner)
nfs4_unlock_state();