Index: Makefile.in
===================================================================
RCS file: /projects/cvsroot/pvfs2/Makefile.in,v
retrieving revision 1.227.6.3
diff -r1.227.6.3 Makefile.in
269a270,271
> 	LIBS += -lrt
> 
Index: src/apps/admin/pvfs2-cp.c
===================================================================
RCS file: /projects/cvsroot/pvfs2/src/apps/admin/pvfs2-cp.c,v
retrieving revision 1.23.10.1
diff -r1.23.10.1 pvfs2-cp.c
22a23
> #include <aio.h>
72a74,78
> typedef struct pvfs_write_object_s {
>     PVFS_sysresp_io resp_io;
>     PVFS_Request mem_req;
>     PVFS_sys_op_id id;
> } pvfs_write_object;
86c92,93
<                            PVFS_credentials *credentials);
---
>                            PVFS_credentials *credentials, 
>                            void ** opid, void ** buffer, int buffer_count);
89a97,100
> static int generic_start_write(file_object *dest, char *buffer,
>                                int64_t offset, size_t count, 
>                                PVFS_credentials * credentials, void ** opid);
> static size_t generic_wait_for_write_completion(file_object *dest, void *opid);
121,122c132
<     int current_size=0;
<     int64_t total_written=0, buffer_size=0;
---
>     int64_t read_offset=0;
124a135,136
>     int64_t bytes_read[2];
>     void* opid[2];
125a138
>     int i, bi;
148a162,175
>     for(i = 0; i < 2; ++i)
>     {
>         buffer[i] = malloc(user_opts->buf_size);
>         if(!buffer)
>         {
>             perror("malloc");
>             ret = -1;
>             goto main_out;
>         }
> 
>         opid[i] = 0;
>         bytes_read[i] = 0;
>     }
> 
166,169c193,203
<     for(; i < 2; ++i)
<     {
<         buffer[0] = malloc(user_opts->buf_size);
<         if(!buffer)
---
> 
>     bi = 0;
>     time1 = Wtime();
> 
>     while((bytes_read[bi] = generic_read(
>                 &src, buffer[bi], read_offset,
>                 user_opts->buf_size, &credentials)) > 0)
>     {
>         ret = generic_start_write(&dest, buffer[bi], read_offset, 
>                                   bytes_read[bi], &credentials, &opid[bi]);
>         if(ret < 0)
171c205,225
<             perror("malloc");
---
>             perror("start_write");
>             ret = -1;
>             goto main_out;
>         }
>         else
>         {
>             read_offset += bytes_read[bi];
>         }
> 
>         bi = (bi + 1) % 2;
>         ret = generic_wait_for_write_completion(&dest, opid[bi]);
>         if(ret < 0)
>         {
>             perror("wait_for_write_completion");
>             ret = -1;
>             goto main_out;
>         }
>         
>         if(ret != bytes_read[bi])
>         {
>             fprintf(stderr, "Error in write\n");
177,180c231,234
<     bi = 0;
<     time1 = Wtime();
<     while((current_size = generic_read(&src, buffer[bi], 
< 		    total_written, user_opts->buf_size, &credentials)) > 0)
---
>     /* must wait for last write */
>     bi = (bi + 1) % 2;
>     ret = generic_wait_for_write_completion(&dest, opid[bi]);
>     if(ret < 0)
182,196c236,245
< 	buffer_size = current_size;
< 	
< 	ret = generic_write(&dest, buffer[bi], total_written, 
< 		buffer_size, &credentials);
< 	if (ret != current_size)
< 	{
< 	    if (ret == -1) {
< 		perror("generic_write");
< 	    } else {
< 		fprintf(stderr, "Error in write\n");
< 	    }
< 	    ret = -1;
< 	    goto main_out;
< 	}
< 	total_written += current_size;
---
>         perror("wait_for_write_completion");
>         ret = -1;
>         goto main_out;
>     }
> 
>     if(ret != bytes_read[bi])
>     {
>         fprintf(stderr, "Error in write\n");
>         ret = -1;
>         goto main_out;
203c252
< 	print_timings(time2-time1, total_written);
---
> 	print_timings(time2-time1, read_offset);
208c257
<     generic_cleanup(&src, &dest, &credentials);
---
>     generic_cleanup(&src, &dest, &credentials, opid, buffer, 2);
211d259
<     free(buffer);
349a398,515
> static int generic_start_write(file_object *dest, char *buffer,
>                                int64_t offset, size_t count, 
>                                PVFS_credentials *credentials,
>                                void ** opid)
> {
>     int ret;
>     if (dest->fs_type == UNIX_FILE)
>     {
>         struct aiocb * cb = (struct aiocb *) *opid;
> 
>         if(!cb)
>         {
>             cb = malloc(sizeof(struct aiocb));
>             if(!cb)
>             {
>                 errno = ENOMEM;
>                 return -1;
>             }
>         }
>         
>         memset(cb, 0, sizeof(struct aiocb));
> 
>         cb->aio_fildes = dest->u.ufs.fd;
>         cb->aio_lio_opcode = LIO_WRITE;
>         cb->aio_buf = buffer;
>         cb->aio_nbytes = count;
>         cb->aio_offset = offset;
>         cb->aio_sigevent.sigev_notify = SIGEV_NONE;
>         cb->aio_sigevent.sigev_notify_attributes = NULL;
>         cb->aio_sigevent.sigev_notify_function = NULL;
>         cb->aio_sigevent.sigev_value.sival_ptr = NULL;
> 
>         ret = aio_write(cb);
>         if(ret == 0)
>         {
>             *opid = cb;
>         }
>         else
>         {
>             *opid = 0;
>         }
>     }
>     else
>     {
>         pvfs_write_object * wobj = (pvfs_write_object *)*opid;
>         PVFS_Request file_req;
>         
>         if(!wobj)
>         {
>             wobj = malloc(sizeof(pvfs_write_object));
>             if(!wobj)
>             {
>                 errno = ENOMEM;
>                 return -1;
>             }
>         }
> 
> 	file_req = PVFS_BYTE;
> 	ret = PVFS_Request_contiguous(count, PVFS_BYTE, &wobj->mem_req);
> 	if (ret < 0)
> 	{
> 	    PVFS_perror("PVFS_Request_contiguous", ret);
> 	    return(ret);
> 	}
> 	ret = PVFS_isys_io(dest->u.pvfs2.ref, file_req, offset,
> 		buffer, wobj->mem_req, credentials, 
>                 &wobj->resp_io, PVFS_IO_WRITE, &wobj->id, NULL);
>         if(ret < 0)
>         {
> 	    PVFS_perror("PVFS_sys_write", ret);
>         }
>         *opid = wobj;
>     }
>     return ret;
> }
> 
> static size_t generic_wait_for_write_completion(file_object * dest, void * opid)
> {
>     int ret;
> 
>     if(opid == 0)
>     {
>         return 0;
>     }
> 
>     if (dest->fs_type == UNIX_FILE)
>     {
>         const struct aiocb * const cb = (const struct aiocb * const) opid;
>         ret = aio_suspend(&cb, 1, NULL);
>         if(ret < 0)
>         {
>             return ret;
>         }
>         else
>         {
>             struct aiocb *rcb = (struct aiocb *) opid;
>             return aio_return(rcb);
>         }
>     }
>     else
>     {
>         pvfs_write_object * wobj = (pvfs_write_object *)opid;
> 
>         PVFS_sys_wait(wobj->id, "write", &ret);
>         PVFS_Request_free(&wobj->mem_req);
>         if(ret < 0)
>         {
>             free(wobj);
>             return PVFS_get_errno_mapping(ret);
>         }
>         else
>         {
>             return wobj->resp_io.total_completed;
>         }
>     }
> }
> 
>         
649c815,818
<                            PVFS_credentials *credentials)
---
>                            PVFS_credentials *credentials,
>                            void ** opid,
>                            void ** buffer,
>                            int buffer_count)
650a820,821
>     int i;
> 
680a852,868
> 
>     if(dest->fs_type == PVFS2_FILE)
>     {
>         for(i = 0; i < buffer_count; ++i)
>         {
>             if(opid[i])
>             {
>                 free(opid[i]);
>             }
>         }
>     }
> 
>     for(i = 0; i < buffer_count; ++i)
>     {
>         free(buffer[i]);
>     }
> 

