#define CURRENT_STATEID(stateid) (!memcmp((stateid), ¤tstateid, sizeof(stateid_t)))
 
 /* forward declarations */
-static int check_for_locks(struct nfs4_file *filp, struct nfs4_lockowner *lowner);
+static bool check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner);
 
 /* Locking: */
 
        if (atomic_dec_and_lock(&fi->fi_ref, &state_lock)) {
                hlist_del(&fi->fi_hash);
                spin_unlock(&state_lock);
-               iput(fi->fi_inode);
                nfsd4_free_file(fi);
        }
 }
 }
 
 /* OPEN Share state helper functions */
-static void nfsd4_init_file(struct nfs4_file *fp, struct inode *ino,
-               struct knfsd_fh *fh)
+static void nfsd4_init_file(struct nfs4_file *fp, struct knfsd_fh *fh)
 {
        unsigned int hashval = file_hashval(fh);
 
        spin_lock_init(&fp->fi_lock);
        INIT_LIST_HEAD(&fp->fi_stateids);
        INIT_LIST_HEAD(&fp->fi_delegations);
-       ihold(ino);
-       fp->fi_inode = ino;
        fh_copy_shallow(&fp->fi_fhandle, fh);
        fp->fi_had_conflict = false;
        fp->fi_lease = NULL;
 }
 
 static struct nfs4_file *
-find_or_add_file(struct inode *ino, struct nfs4_file *new, struct knfsd_fh *fh)
+find_or_add_file(struct nfs4_file *new, struct knfsd_fh *fh)
 {
        struct nfs4_file *fp;
 
        spin_lock(&state_lock);
        fp = find_file_locked(fh);
        if (fp == NULL) {
-               nfsd4_init_file(new, ino, fh);
+               nfsd4_init_file(new, fh);
                fp = new;
        }
        spin_unlock(&state_lock);
        struct nfsd4_compoundres *resp = rqstp->rq_resp;
        struct nfs4_client *cl = open->op_openowner->oo_owner.so_client;
        struct nfs4_file *fp = NULL;
-       struct inode *ino = current_fh->fh_dentry->d_inode;
        struct nfs4_ol_stateid *stp = NULL;
        struct nfs4_delegation *dp = NULL;
        __be32 status;
         * and check for delegations in the process of being recalled.
         * If not found, create the nfs4_file struct
         */
-       fp = find_or_add_file(ino, open->op_file, ¤t_fh->fh_handle);
+       fp = find_or_add_file(open->op_file, ¤t_fh->fh_handle);
        if (fp != open->op_file) {
                status = nfs4_check_deleg(cl, open, &dp);
                if (status)
 }
 
 static struct nfs4_ol_stateid *
-alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp, struct nfs4_ol_stateid *open_stp)
+alloc_init_lock_stateid(struct nfs4_lockowner *lo, struct nfs4_file *fp,
+               struct inode *inode,
+               struct nfs4_ol_stateid *open_stp)
 {
        struct nfs4_ol_stateid *stp;
        struct nfs4_client *clp = lo->lo_owner.so_client;
        struct nfs4_file *fi = ost->st_file;
        struct nfs4_openowner *oo = openowner(ost->st_stateowner);
        struct nfs4_client *cl = oo->oo_owner.so_client;
+       struct inode *inode = cstate->current_fh.fh_dentry->d_inode;
        struct nfs4_lockowner *lo;
        unsigned int strhashval;
        struct nfsd_net *nn = net_generic(cl->net, nfsd_net_id);
 
        *lst = find_lock_stateid(lo, fi);
        if (*lst == NULL) {
-               *lst = alloc_init_lock_stateid(lo, fi, ost);
+               *lst = alloc_init_lock_stateid(lo, fi, inode, ost);
                if (*lst == NULL) {
                        release_lockowner_if_empty(lo);
                        return nfserr_jukebox;
 
 /*
  * returns
- *     1: locks held by lockowner
- *     0: no locks held by lockowner
+ *     true:  locks held by lockowner
+ *     false: no locks held by lockowner
  */
-static int
-check_for_locks(struct nfs4_file *filp, struct nfs4_lockowner *lowner)
+static bool
+check_for_locks(struct nfs4_file *fp, struct nfs4_lockowner *lowner)
 {
        struct file_lock **flpp;
-       struct inode *inode = filp->fi_inode;
-       int status = 0;
+       int status = false;
+       struct file *filp = find_any_file(fp);
+       struct inode *inode;
+
+       if (!filp) {
+               /* Any valid lock stateid should have some sort of access */
+               WARN_ON_ONCE(1);
+               return status;
+       }
+
+       inode = file_inode(filp);
 
        spin_lock(&inode->i_lock);
        for (flpp = &inode->i_flock; *flpp != NULL; flpp = &(*flpp)->fl_next) {
                if ((*flpp)->fl_owner == (fl_owner_t)lowner) {
-                       status = 1;
-                       goto out;
+                       status = true;
+                       break;
                }
        }
-out:
        spin_unlock(&inode->i_lock);
+       fput(filp);
        return status;
 }