return ret;
 }
 
-static struct nfsd_file *find_deleg_file(struct nfs4_file *f)
+static struct nfsd_file *find_any_file_locked(struct nfs4_file *f)
 {
-       struct nfsd_file *ret = NULL;
+       lockdep_assert_held(&f->fi_lock);
+
+       if (f->fi_fds[O_RDWR])
+               return f->fi_fds[O_RDWR];
+       if (f->fi_fds[O_WRONLY])
+               return f->fi_fds[O_WRONLY];
+       if (f->fi_fds[O_RDONLY])
+               return f->fi_fds[O_RDONLY];
+       return NULL;
+}
+
+static struct nfsd_file *find_deleg_file_locked(struct nfs4_file *f)
+{
+       lockdep_assert_held(&f->fi_lock);
 
-       spin_lock(&f->fi_lock);
        if (f->fi_deleg_file)
-               ret = nfsd_file_get(f->fi_deleg_file);
-       spin_unlock(&f->fi_lock);
-       return ret;
+               return f->fi_deleg_file;
+       return NULL;
 }
 
 static atomic_long_t num_delegations;
        ols = openlockstateid(st);
        oo = ols->st_stateowner;
        nf = st->sc_file;
-       file = find_any_file(nf);
+
+       spin_lock(&nf->fi_lock);
+       file = find_any_file_locked(nf);
        if (!file)
-               return 0;
+               goto out;
 
        seq_printf(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
        seq_printf(s, ", ");
        nfs4_show_owner(s, oo);
        seq_printf(s, " }\n");
-       nfsd_file_put(file);
-
+out:
+       spin_unlock(&nf->fi_lock);
        return 0;
 }
 
        ols = openlockstateid(st);
        oo = ols->st_stateowner;
        nf = st->sc_file;
-       file = find_any_file(nf);
+       spin_lock(&nf->fi_lock);
+       file = find_any_file_locked(nf);
        if (!file)
-               return 0;
+               goto out;
 
        seq_printf(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
        seq_printf(s, ", ");
        nfs4_show_owner(s, oo);
        seq_printf(s, " }\n");
-       nfsd_file_put(file);
-
+out:
+       spin_unlock(&nf->fi_lock);
        return 0;
 }
 
 
        ds = delegstateid(st);
        nf = st->sc_file;
-       file = find_deleg_file(nf);
+       spin_lock(&nf->fi_lock);
+       file = find_deleg_file_locked(nf);
        if (!file)
-               return 0;
+               goto out;
 
        seq_printf(s, "- ");
        nfs4_show_stateid(s, &st->sc_stateid);
        seq_printf(s, ", ");
        nfs4_show_fname(s, file);
        seq_printf(s, " }\n");
-       nfsd_file_put(file);
-
+out:
+       spin_unlock(&nf->fi_lock);
        return 0;
 }