rewrite_list;   /* saved nfs_write_data structs */
        struct nfs_open_context *ctx;           /* file open context info */
        struct kiocb *          iocb;           /* controlling i/o request */
-       wait_queue_head_t       wait;           /* wait for i/o completion */
        struct inode *          inode;          /* target file of i/o */
        unsigned long           user_addr;      /* location of user's buffer */
        size_t                  user_count;     /* total bytes to move */
        int                     outstanding;    /* i/os we're waiting for */
        ssize_t                 count,          /* bytes actually processed */
                                error;          /* any reported error */
+       struct completion       completion;     /* wait for i/o completion */
 
        /* commit state */
        struct nfs_write_data * commit_data;    /* special write_data for commits */
                return NULL;
 
        kref_init(&dreq->kref);
-       init_waitqueue_head(&dreq->wait);
+       init_completion(&dreq->completion);
        INIT_LIST_HEAD(&dreq->list);
        INIT_LIST_HEAD(&dreq->rewrite_list);
        dreq->iocb = NULL;
        if (dreq->iocb)
                goto out;
 
-       result = wait_event_interruptible(dreq->wait, (dreq->outstanding == 0));
+       result = wait_for_completion_interruptible(&dreq->completion);
 
        if (!result)
                result = dreq->error;
                if (!res)
                        res = (long) dreq->count;
                aio_complete(dreq->iocb, res, 0);
-       } else
-               wake_up(&dreq->wait);
+       }
+       complete_all(&dreq->completion);
 
        kref_put(&dreq->kref, nfs_direct_req_release);
 }