{
        struct rpc_inode *rpci = RPC_I(inode);
        struct rpc_pipe_ops *ops;
+       int need_release;
 
        mutex_lock(&inode->i_mutex);
        ops = rpci->ops;
        if (ops != NULL) {
                LIST_HEAD(free_list);
-
                spin_lock(&inode->i_lock);
+               need_release = rpci->nreaders != 0 || rpci->nwriters != 0;
                rpci->nreaders = 0;
                list_splice_init(&rpci->in_upcall, &free_list);
                list_splice_init(&rpci->pipe, &free_list);
                spin_unlock(&inode->i_lock);
                rpc_purge_list(rpci, &free_list, ops->destroy_msg, -EPIPE);
                rpci->nwriters = 0;
-               if (ops->release_pipe)
+               if (need_release && ops->release_pipe)
                        ops->release_pipe(inode);
                cancel_delayed_work_sync(&rpci->queue_timeout);
        }
 {
        struct rpc_inode *rpci = RPC_I(inode);
        struct rpc_pipe_msg *msg;
+       int last_close;
 
        mutex_lock(&inode->i_mutex);
        if (rpci->ops == NULL)
                                        rpci->ops->destroy_msg, -EAGAIN);
                }
        }
-       if (rpci->ops->release_pipe)
+       last_close = rpci->nwriters == 0 && rpci->nreaders == 0;
+       if (last_close && rpci->ops->release_pipe)
                rpci->ops->release_pipe(inode);
 out:
        mutex_unlock(&inode->i_mutex);