On Mon, May 16, 2011 at 03:43:40PM -0400, bjschuma@xxxxxxxxxx wrote: > +static __be32 > +nfsd4_free_file_stateid(stateid_t *stateid) > +{ > + struct nfs4_stateid *stp = search_for_stateid(stateid); > + if (!stp) > + return nfserr_bad_stateid; > + if (stateid->si_generation != 0) { > + if (stateid->si_generation < stp->st_stateid.si_generation) > + return nfserr_old_stateid; > + if (stateid->si_generation > stp->st_stateid.si_generation) > + return nfserr_bad_stateid; > + } > + > + if (check_for_locks(stp->st_file, stp->st_stateowner)) > + return nfserr_locks_held; I think this catches a lock stateid, but not an open stateid that has associated lock stateid's that in turn hold locks. Hm, also: "The FREE_STATEID operation is used to free a stateid that no longer has any associated locks (including opens, byte-range locks, delegations, and layouts)" So an open stateid also shouldn't be freeable as long as there are opens associated with it. Also I guess a client shouldn't be permitted to free a delegation that it still holds. That means we'll always just return nfserr_locks for delegation stateid's. I assume free_stateid is only useful in this case for the case where a server forcibly revokes part of the client's state and leaves some "stub" stateid's around in place of the revoked ones. --b. -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html