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 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]); > } >