struct svc_fh *resfh = NULL;
        struct net *net = SVC_NET(rqstp);
        struct nfsd_net *nn = net_generic(net, nfsd_net_id);
+       bool reclaim = false;
 
        dprintk("NFSD: nfsd4_open filename %.*s op_openowner %p\n",
                (int)open->op_fname.len, open->op_fname.data,
                        if (status)
                                goto out;
                        open->op_openowner->oo_flags |= NFS4_OO_CONFIRMED;
+                       reclaim = true;
                case NFS4_OPEN_CLAIM_FH:
                case NFS4_OPEN_CLAIM_DELEG_CUR_FH:
                        status = do_open_fhandle(rqstp, cstate, open);
        WARN(status && open->op_created,
             "nfsd4_process_open2 failed to open newly-created file! status=%u\n",
             be32_to_cpu(status));
+       if (reclaim && !status)
+               nn->somebody_reclaimed = true;
 out:
        if (resfh && resfh != &cstate->current_fh) {
                fh_dup2(&cstate->current_fh, resfh);
 
         */
 }
 
+/*
+ * If we've waited a lease period but there are still clients trying to
+ * reclaim, wait a little longer to give them a chance to finish.
+ */
+static bool clients_still_reclaiming(struct nfsd_net *nn)
+{
+       unsigned long now = get_seconds();
+       unsigned long double_grace_period_end = nn->boot_time +
+                                               2 * nn->nfsd4_lease;
+
+       if (!nn->somebody_reclaimed)
+               return false;
+       nn->somebody_reclaimed = false;
+       /*
+        * If we've given them *two* lease times to reclaim, and they're
+        * still not done, give up:
+        */
+       if (time_after(now, double_grace_period_end))
+               return false;
+       return true;
+}
+
 static time_t
 nfs4_laundromat(struct nfsd_net *nn)
 {
        time_t t, new_timeo = nn->nfsd4_lease;
 
        dprintk("NFSD: laundromat service - starting\n");
+
+       if (clients_still_reclaiming(nn)) {
+               new_timeo = 0;
+               goto out;
+       }
        nfsd4_end_grace(nn);
        INIT_LIST_HEAD(&reaplist);
        spin_lock(&nn->client_lock);
                posix_unblock_lock(&nbl->nbl_lock);
                free_blocked_lock(nbl);
        }
-
+out:
        new_timeo = max_t(time_t, new_timeo, NFSD_LAUNDROMAT_MINTIMEOUT);
        return new_timeo;
 }
        case 0: /* success! */
                nfs4_inc_and_copy_stateid(&lock->lk_resp_stateid, &lock_stp->st_stid);
                status = 0;
+               if (lock->lk_reclaim)
+                       nn->somebody_reclaimed = true;
                break;
        case FILE_LOCK_DEFERRED:
                nbl = NULL;
 
                goto out_idmap_error;
        nn->nfsd4_lease = 90;   /* default lease time */
        nn->nfsd4_grace = 90;
+       nn->somebody_reclaimed = false;
        nn->clverifier_counter = prandom_u32();
        nn->clientid_counter = prandom_u32();