struct nfs4_opendata, kref);
        struct super_block *sb = p->dentry->d_sb;
 
-       if (p->lgp)
-               nfs4_layoutget_release(p->lgp);
+       nfs4_lgopen_release(p->lgp);
        nfs_free_seqid(p->o_arg.seqid);
        nfs4_sequence_free_slot(&p->o_res.seq_res);
        if (p->state != NULL)
 
                lgp->args.inode = ino;
        } else
                lo = NFS_I(lgp->args.inode)->layout;
-       pnfs_get_layout_hdr(lo);
 
        if (read_seqcount_retry(&srv->nfs_client->cl_callback_count,
                                lgp->callback_count))
-               goto out;
+               return;
        lseg = pnfs_layout_process(lgp);
-       atomic_dec(&lo->plh_outstanding);
        if (IS_ERR(lseg)) {
                /* ignore lseg, but would like to mark not to try lgopen */
                /* clear some lo flags - first and fail ???? */
                pnfs_layout_clear_fail_bit(lo, pnfs_iomode_to_fail_bit(iomode));
                pnfs_put_lseg(lseg);
        }
-out:
-       pnfs_clear_first_layoutget(lo);
-       pnfs_put_layout_hdr(lo);
+}
+
+void nfs4_lgopen_release(struct nfs4_layoutget *lgp)
+{
+       if (lgp != NULL) {
+               struct inode *inode = lgp->args.inode;
+               if (inode) {
+                       struct pnfs_layout_hdr *lo = NFS_I(inode)->layout;
+                       atomic_dec(&lo->plh_outstanding);
+                       pnfs_clear_first_layoutget(lo);
+               }
+               pnfs_layoutget_free(lgp);
+       }
 }
 
 struct pnfs_layout_segment *
 
                         struct nfs_open_context *ctx);
 void pnfs_parse_lgopen(struct inode *ino, struct nfs4_layoutget *lgp,
                       struct nfs_open_context *ctx);
+void nfs4_lgopen_release(struct nfs4_layoutget *lgp);
 
 static inline bool nfs_have_layout(struct inode *inode)
 {
                struct nfs_open_context *ctx)
 {
 }
+
+static inline void nfs4_lgopen_release(struct nfs4_layoutget *lgp)
+{
+}
+
 #endif /* CONFIG_NFS_V4_1 */
 
 #if IS_ENABLED(CONFIG_NFS_V4_2)