sgh_dd.cpp (sg3_utils-1.47r908.tgz) | : | sgh_dd.cpp (sg3_utils-1.47r915.tar.xz) | ||
---|---|---|---|---|
skipping to change at line 39 | skipping to change at line 39 | |||
* sgp_dd and sg_dd only perform special tasks when one or both of the given | * sgp_dd and sg_dd only perform special tasks when one or both of the given | |||
* devices belong to the Linux sg driver. | * devices belong to the Linux sg driver. | |||
* | * | |||
* sgh_dd further extends sgp_dd to use the experimental kernel buffer | * sgh_dd further extends sgp_dd to use the experimental kernel buffer | |||
* sharing feature added in 3.9.02 . | * sharing feature added in 3.9.02 . | |||
* N.B. This utility was previously called sgs_dd but there was already an | * N.B. This utility was previously called sgs_dd but there was already an | |||
* archived version of a dd variant called sgs_dd so this utility name was | * archived version of a dd variant called sgs_dd so this utility name was | |||
* renamed [20181221] | * renamed [20181221] | |||
*/ | */ | |||
static const char * version_str = "2.14 20210801"; | static const char * version_str = "2.16 20210906"; | |||
#define _XOPEN_SOURCE 600 | #define _XOPEN_SOURCE 600 | |||
#ifndef _GNU_SOURCE | #ifndef _GNU_SOURCE | |||
#define _GNU_SOURCE 1 | #define _GNU_SOURCE 1 | |||
#endif | #endif | |||
#include <unistd.h> | #include <unistd.h> | |||
#include <fcntl.h> | #include <fcntl.h> | |||
#include <stdio.h> | #include <stdio.h> | |||
#include <stdlib.h> | #include <stdlib.h> | |||
skipping to change at line 319 | skipping to change at line 319 | |||
int resid; | int resid; | |||
int rd_p_id; | int rd_p_id; | |||
int rep_count; | int rep_count; | |||
int rq_id; | int rq_id; | |||
int mmap_len; | int mmap_len; | |||
int mrq_id; | int mrq_id; | |||
int mrq_index; | int mrq_index; | |||
uint32_t in_mrq_q_blks; | uint32_t in_mrq_q_blks; | |||
uint32_t out_mrq_q_blks; | uint32_t out_mrq_q_blks; | |||
long seed; | long seed; | |||
struct drand48_data drand; /* opaque, used by srand48_r and mrand48_r */ | #ifdef HAVE_SRAND48_R /* gcc extension. N.B. non-reentrant version slower */ | |||
struct drand48_data drand;/* opaque, used by srand48_r and mrand48_r */ | ||||
#endif | ||||
pthread_t mrq_abort_thread_id; | pthread_t mrq_abort_thread_id; | |||
Mrq_abort_info mai; | Mrq_abort_info mai; | |||
} Rq_elem; | } Rq_elem; | |||
typedef struct thread_info | typedef struct thread_info | |||
{ | { | |||
int id; | int id; | |||
struct global_collection * gcp; | struct global_collection * gcp; | |||
pthread_t a_pthr; | pthread_t a_pthr; | |||
} Thread_info; | } Thread_info; | |||
skipping to change at line 1534 | skipping to change at line 1536 | |||
if (ssz < (ssize_t)sizeof(rep->seed)) { | if (ssz < (ssize_t)sizeof(rep->seed)) { | |||
pr2serr_lk("thread=%d: getrandom() failed, ret=%d\n", | pr2serr_lk("thread=%d: getrandom() failed, ret=%d\n", | |||
rep->id, (int)ssz); | rep->id, (int)ssz); | |||
rep->seed = (long)time(NULL); | rep->seed = (long)time(NULL); | |||
} | } | |||
#else | #else | |||
rep->seed = (long)time(NULL); /* use seconds since epoch as proxy */ | rep->seed = (long)time(NULL); /* use seconds since epoch as proxy */ | |||
#endif | #endif | |||
if (vb > 1) | if (vb > 1) | |||
pr2serr_lk("thread=%d: seed=%ld\n", rep->id, rep->seed); | pr2serr_lk("thread=%d: seed=%ld\n", rep->id, rep->seed); | |||
#ifdef HAVE_SRAND48_R | ||||
srand48_r(rep->seed, &rep->drand); | srand48_r(rep->seed, &rep->drand); | |||
#else | ||||
srand48(rep->seed); | ||||
#endif | ||||
} | } | |||
if (clp->in_flags.same_fds || clp->out_flags.same_fds) | if (clp->in_flags.same_fds || clp->out_flags.same_fds) | |||
; | ; | |||
else { | else { | |||
int fd; | int fd; | |||
if (in_is_sg && clp->infp) { | if (in_is_sg && clp->infp) { | |||
fd = sg_in_open(clp, clp->infp, (in_mmap ? &rep->buffp : NULL), | fd = sg_in_open(clp, clp->infp, (in_mmap ? &rep->buffp : NULL), | |||
(in_mmap ? &rep->mmap_len : NULL)); | (in_mmap ? &rep->mmap_len : NULL)); | |||
if (fd < 0) | if (fd < 0) | |||
skipping to change at line 1855 | skipping to change at line 1861 | |||
uint8_t * bp; | uint8_t * bp; | |||
if (clp->in_flags.zero) | if (clp->in_flags.zero) | |||
memset(rep->buffp, 0, blocks * clp->bs); | memset(rep->buffp, 0, blocks * clp->bs); | |||
else if (clp->in_flags.ff) | else if (clp->in_flags.ff) | |||
memset(rep->buffp, 0xff, blocks * clp->bs); | memset(rep->buffp, 0xff, blocks * clp->bs); | |||
else { | else { | |||
for (k = 0, bp = rep->buffp; k < blocks; ++k, bp += clp->bs) { | for (k = 0, bp = rep->buffp; k < blocks; ++k, bp += clp->bs) { | |||
for (j = 0; j < clp->bs; j += jbump) { | for (j = 0; j < clp->bs; j += jbump) { | |||
/* mrand48 takes uniformly from [-2^31, 2^31) */ | /* mrand48 takes uniformly from [-2^31, 2^31) */ | |||
#ifdef HAVE_SRAND48_R | ||||
mrand48_r(&rep->drand, &rn); | mrand48_r(&rep->drand, &rn); | |||
#else | ||||
rn = mrand48(); | ||||
#endif | ||||
*((uint32_t *)(bp + j)) = (uint32_t)rn; | *((uint32_t *)(bp + j)) = (uint32_t)rn; | |||
} | } | |||
} | } | |||
} | } | |||
clp->in_rem_count -= blocks; | clp->in_rem_count -= blocks; | |||
return stop_after_write; | return stop_after_write; | |||
} | } | |||
if (! same_fds) { /* each has own file pointer, so we need to move it */ | if (! same_fds) { /* each has own file pointer, so we need to move it */ | |||
int64_t pos = rep->iblk * clp->bs; | int64_t pos = rep->iblk * clp->bs; | |||
End of changes. 6 change blocks. | ||||
2 lines changed or deleted | 12 lines changed or added |