nf = nfsd_file_alloc(&key, may_flags);
        if (!nf) {
                status = nfserr_jukebox;
-               goto out_status;
+               goto out;
        }
 
        ret = rhashtable_lookup_insert_key(&nfsd_file_rhash_tbl,
        if (likely(ret == 0))
                goto open_file;
 
-       nfsd_file_slab_free(&nf->nf_rcu);
-       nf = NULL;
        if (ret == -EEXIST)
                goto retry;
        trace_nfsd_file_insert_err(rqstp, key.inode, may_flags, ret);
        status = nfserr_jukebox;
-       goto out_status;
+       goto construction_err;
 
 wait_for_construction:
        wait_on_bit(&nf->nf_flags, NFSD_FILE_PENDING, TASK_UNINTERRUPTIBLE);
                trace_nfsd_file_cons_err(rqstp, key.inode, may_flags, nf);
                if (!open_retry) {
                        status = nfserr_jukebox;
-                       goto out;
+                       goto construction_err;
                }
                open_retry = false;
-               if (refcount_dec_and_test(&nf->nf_ref))
-                       nfsd_file_free(nf);
                goto retry;
        }
-
        this_cpu_inc(nfsd_file_cache_hits);
 
        status = nfserrno(nfsd_open_break_lease(file_inode(nf->nf_file), may_flags));
+       if (status != nfs_ok) {
+               nfsd_file_put(nf);
+               nf = NULL;
+       }
+
 out:
        if (status == nfs_ok) {
                this_cpu_inc(nfsd_file_acquisitions);
                nfsd_file_check_write_error(nf);
                *pnf = nf;
-       } else {
-               if (refcount_dec_and_test(&nf->nf_ref))
-                       nfsd_file_free(nf);
-               nf = NULL;
        }
-
-out_status:
        put_cred(key.cred);
        trace_nfsd_file_acquire(rqstp, key.inode, may_flags, nf, status);
        return status;
        if (status != nfs_ok)
                nfsd_file_unhash(nf);
        clear_and_wake_up_bit(NFSD_FILE_PENDING, &nf->nf_flags);
+       if (status == nfs_ok)
+               goto out;
+
+construction_err:
+       if (refcount_dec_and_test(&nf->nf_ref))
+               nfsd_file_free(nf);
+       nf = NULL;
        goto out;
 }