diff options
Diffstat (limited to 'usr/src/cmd/avs/sdbc/sd_diag.c')
-rw-r--r-- | usr/src/cmd/avs/sdbc/sd_diag.c | 1169 |
1 files changed, 0 insertions, 1169 deletions
diff --git a/usr/src/cmd/avs/sdbc/sd_diag.c b/usr/src/cmd/avs/sdbc/sd_diag.c deleted file mode 100644 index 706f547226..0000000000 --- a/usr/src/cmd/avs/sdbc/sd_diag.c +++ /dev/null @@ -1,1169 +0,0 @@ -/* - * CDDL HEADER START - * - * The contents of this file are subject to the terms of the - * Common Development and Distribution License (the "License"). - * You may not use this file except in compliance with the License. - * - * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE - * or http://www.opensolaris.org/os/licensing. - * See the License for the specific language governing permissions - * and limitations under the License. - * - * When distributing Covered Code, include this CDDL HEADER in each - * file and include the License file at usr/src/OPENSOLARIS.LICENSE. - * If applicable, add the following below this CDDL HEADER, with the - * fields enclosed by brackets "[]" replaced with your own identifying - * information: Portions Copyright [yyyy] [name of copyright owner] - * - * CDDL HEADER END - */ - -/* - * Copyright 2010 Sun Microsystems, Inc. All rights reserved. - * Use is subject to license terms. - */ - -/* #include <version.h> SKK */ -#include <errno.h> -#include <sys/types.h> -#include <sys/time.h> -#include <sys/param.h> -#include <sys/inttypes.h> -#include <stdio.h> -#include <strings.h> -#include <fcntl.h> -#include <sys/shm.h> -#include <sys/wait.h> -#include <unistd.h> -#include <nsctl.h> - -#include <sys/nsctl/sd_cache.h> -#include <sys/nsctl/sd_conf.h> - -#include <stdlib.h> -#include <thread.h> -#include <synch.h> - -#define MAXPARTS 100 /* Max disks */ -#define MAXBUF 65536 /* Max buffer size in long words */ -#define DISKLIST "disk_config" /* Default config file */ -#define DEF_SIZE 8192 /* Default buffer size */ -#define DEF_LOOP 1000 /* Loops for test */ -#define RAND_LOOPS DEF_LOOP /* # of random ios to do */ - -/* - * >>>>>>>>> USER LEVEL SD CACHE DIAGNOSTICS <<<<<<<<<< - * - * Write and read data blocks w/multiple processes - * Starts one process for each partition specified in - * the config file - */ - -int buf1[MAXBUF]; -int buf2[MAXBUF]; -char name[MAXPARTS][80]; -int pattern[MAXPARTS]; -int bufsize = DEF_SIZE; -int fba_num_bufsize; -nsc_size_t loops = DEF_LOOP; -nsc_size_t r_loops = RAND_LOOPS; -int fsize = -1; -int readercount = 3; -int Rflag = O_EXCL; -char config_file[32]; - -int -read_parts() -{ - FILE *dfile; - int partitions = 0; - int i; - - dfile = fopen(config_file, "r"); - if (dfile == NULL) { - (void) printf("cannot open file: %s\n", config_file); - perror("fopen"); - exit(errno); - } - for (i = 0; i < MAXPARTS; i++) { - if (fscanf(dfile, "%s %x", name[i], (uint_t *)&pattern[i]) == - EOF) { - break; - } else - if (name[i][0] == '#' || strchr(name[i], '/') == NULL) { - i--; - continue; - } - partitions++; - } - (void) fclose(dfile); - (void) printf("No. of partitions listed in file '%s' = %d\n\n", - config_file, partitions); - return (partitions); -} - -void -print_usage() -{ - (void) printf("Usage:\n"); - (void) printf( -"sd_diag [-R] [-b <bufsize>] [-d <datasize>] [-l <loops>] [-r <readers>]\n"); - (void) printf( -" [-f <disk_config_file>] <test#>\n"); - (void) printf(" test 1 = random read/write\n"); - (void) printf(" 2 = random read/write/verify, read after write\n"); - (void) printf(" 3 = random read/write/verify,"); - (void) printf(" all reads after all writes\n"); - (void) printf(" 4 = sequential read/write\n"); - (void) printf(" 5 = sequential write/read/verify,"); - (void) printf(" all reads after all writes\n"); - (void) printf( - " 6 = altenating top/bottom sequential read/write/verify\n"); - (void) printf(" 7 = multiple readers/1 random writer\n"); - (void) printf(" 8 = random writes\n"); - (void) printf(" 9 = sequential write of known data\n"); - (void) printf(" 10 = sequential copy of datasize disk/verify\n"); - (void) printf(" 11 = sequential read/verify test 9 data -"); - (void) printf(" then clear data with timestamp\n"); - (void) printf(" 12 = sequential read/verify test 9 data -"); - (void) printf(" no clear data\n"); - (void) printf("\n"); - (void) printf(" <bufsize> in bytes (minimum is 512 bytes)\n"); - (void) printf(" <datasize> in Mbytes per disk\n"); - (void) printf(" <loops> is count of reads/writes,\n"); - (void) printf(" loops = 0 tests entire datasize disk"); - (void) printf(" for sequential tests.\n"); - (void) printf(" loops = 0 performs %d I/Os for the random " - "tests\n", RAND_LOOPS); - (void) printf(" <readers> is count of readers for test #7 (default " - "is 3).\n"); - (void) printf(" [ defaults: bufsize = %d bytes, loops = %d,", - DEF_SIZE, DEF_LOOP); - (void) printf(" datasize = disksize ]\n"); - (void) printf("\n"); - (void) printf(" -R : do nsc_reserve(), nsc_release(0 around each " - "I/O\n"); -} - -void -parse_opts(int argc, char *argv[]) -{ - extern char *optarg; - int c; - - while ((c = getopt(argc, argv, "b:d:l:r:Rf:")) != -1) { - switch (c) { - case 'f': - /* printf("\n%s", optarg); */ - (void) strcpy(config_file, optarg); - break; - case 'b': - /* bufsize between 1*512 and 512*512 */ - bufsize = strtol(optarg, 0, 0); - if (bufsize > (MAXBUF*4)) - bufsize = MAXBUF*4; - else if (bufsize < FBA_SIZE(1)) - bufsize = FBA_SIZE(1); - break; - case 'd': - /* convert datasize from Mb's to fba */ - fsize = strtol(optarg, 0, 0) * FBA_NUM(1 << 20); - break; - case 'l': - loops = (nsc_size_t)strtoll(optarg, 0, 0); - break; - case 'r': - /* count of readers for test 7 */ - readercount = strtol(optarg, 0, 0); - break; - case 'R': - /* do reserve, release on a per io basis */ - Rflag = 0; - break; - case '?': - print_usage(); - exit(0); - } - } - bufsize &= ~FBA_MASK; /* multiple of 512 bytes for SECTMODE I/O */ - fba_num_bufsize = FBA_NUM(bufsize); - - /* set #ios for random io tests */ - if (loops != 0) - r_loops = loops; - -} - -nsc_size_t -set_part_size(char *path, nsc_fd_t *sdfd) -{ - nsc_size_t filesize; - int rc; - - rc = nsc_partsize(sdfd, &filesize); /* partsize in FBAs (512 bytes) */ - if (rc < 0 || filesize == 0) { - (void) fprintf(stderr, - "set_part_size: cannot access partition size"); - (void) fprintf(stderr, " for %s\n", path); - (void) nsc_close(sdfd); - exit(1); - } - - (void) printf("Partition %s, size:%" NSC_SZFMT " blocks\n", path, - filesize); - - if (fsize != -1 && fsize < filesize) - filesize = fsize; - filesize -= fba_num_bufsize; - if (filesize < fba_num_bufsize) { - (void) printf("ERROR: Max block size %" NSC_SZFMT "\n", - filesize); - (void) nsc_close(sdfd); - exit(0); - } - - return (filesize); -} - -int -do_sdtest1(int fd, nsc_size_t loops, nsc_size_t filesize) -{ - nsc_off_t seekpos; - nsc_size_t i; - ssize_t r; - - for (i = 0; i < loops; i++) { - seekpos = ( -#ifdef NSC_MULTI_TERABYTE - ((nsc_off_t)rand() << 48) | ((nsc_off_t)rand() << 32) | -#endif - (rand() << 16) | rand()) % filesize; - r = pwrite(fd, buf1, bufsize, (off_t)(seekpos << SCTRSHFT)); - if (r <= 0) { - perror("Test1: write"); - return (1); - } - seekpos = ( -#ifdef NSC_MULTI_TERABYTE - ((nsc_off_t)rand() << 48) | ((nsc_off_t)rand() << 32) | -#endif - (rand() << 16) | rand()) % filesize; - r = pread(fd, buf2, bufsize, (off_t)(seekpos << SCTRSHFT)); - if (r <= 0) { - perror("Test1: read"); - return (1); - } - } - return (0); -} - -void -gen_data(int *buffer, int size) -{ - int i; - - size /= 4; - for (i = 0; i < size; i++) - buffer[i] = rand() << 16 | rand(); -} - -int -do_sdtest2(int fd, nsc_size_t loops, nsc_size_t filesize, int h) -{ - nsc_off_t seekpos; - int err = 0; - ssize_t r; - nsc_size_t i; - - for (i = 0; i < loops; i++) { - seekpos = ( -#ifdef NSC_MULTI_TERABYTE - ((nsc_off_t)rand() << 48) | ((nsc_off_t)rand() << 32) | -#endif - (rand() << 16) | rand()) % filesize; - gen_data(buf1, bufsize); - r = pwrite(fd, buf1, bufsize, (off_t)(seekpos << SCTRSHFT)); - if (r <= 0) { - perror("Test2: write"); - err++; - return (err); - } - r = pread(fd, buf2, bufsize, (off_t)(seekpos << SCTRSHFT)); - if (r <= 0) { - perror("Test2: read"); - err++; - return (err); - } - if (memcmp(buf1, buf2, bufsize)) { - (void) printf("Test2: Data corruption," - " fd:%s, fpos:%" PRId64 ", len:%d\n", - name[h], (int64_t)(seekpos << SCTRSHFT), - bufsize); - err++; - } - } - return (err); -} - -int -do_sdtest3(int fd, nsc_size_t loops, nsc_size_t filesize, int h, nsc_fd_t *sdfd) -{ - nsc_off_t *seekpos; - int err = 0; - nsc_size_t i; - ssize_t r; - - seekpos = malloc(loops*sizeof (nsc_off_t)); - if (seekpos == NULL) { - perror("Test3: malloc"); - (void) nsc_close(sdfd); - exit(errno); - } - gen_data(buf1, bufsize); - - for (i = 0; i < loops; i++) { - seekpos[i] = ( -#ifdef NSC_MULTI_TERABYTE - ((nsc_off_t)rand() << 48) | ((nsc_off_t)rand() << 32) | -#endif - (rand() << 16) | rand()) % filesize; - seekpos[i] -= seekpos[i] % fba_num_bufsize; - r = pwrite(fd, buf1, bufsize, (off_t)(seekpos[i] << SCTRSHFT)); - if (r <= 0) { - perror("Test3: write"); - err++; - goto cleanup; - } - } - for (i = 0; i < loops; i++) { - buf2[0] = '\0'; /* clear buf to make sure something is read */ - r = pread(fd, buf2, bufsize, (off_t)(seekpos[i] << SCTRSHFT)); - if (r <= 0) { - perror("Test3: read"); - err++; - goto cleanup; - } - if (memcmp(buf1, buf2, bufsize)) { - (void) printf("Data corruption, fd:%s, fpos:%" PRId64 - ", len:%d\n", name[h], - (int64_t)(seekpos[i] << SCTRSHFT), bufsize); - err++; - } - } - -cleanup: - free(seekpos); - return (err); -} - -int -do_sdtest4(int fd, nsc_size_t loops, nsc_size_t filesize) -{ - ssize_t r; - nsc_size_t i; - - /* - * Do sequential reads/writes for loops number - * of bufsize chunks, unless loops == 0, then do - * entire disk. - * 1. sequential reads from the top down, - * 2. sequential writes from the top down, - * 3. sequential reads from the bottom up, - * 4. sequential writes from the bottom up. - */ - if ((loops > (filesize / fba_num_bufsize)) || (!loops)) - loops = filesize / fba_num_bufsize; /* entire disk */ - - for (i = 0; i < loops; i++) { - r = pread(fd, buf2, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test4: read"); - return (1); - } - } - for (i = 0; i < loops; i++) { - r = pwrite(fd, buf1, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test4: write"); - return (1); - } - } - for (i = loops - 1; i + 1 > 0; i--) { - r = pread(fd, buf2, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test4: read"); - return (1); - } - } - for (i = loops - 1; i + 1 > 0; i--) { - r = pwrite(fd, buf1, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test4: write"); - return (1); - } - } - return (0); -} - -int -do_sdtest5(int fd, nsc_size_t loops, nsc_size_t filesize, int h) -{ - int err = 0; - ssize_t r; - nsc_size_t i; - - /* - * Do sequential writes with verify reads for loops number - * of bufsize chunks, unless loops == 0, then do - * entire disk. - * 1. sequential writes from the top down, - * 2. sequential reads from the top down with verify, - * 3. sequential writes from the bottom up, - * 4. sequential reads from the bottom up with verify. - */ - if ((loops > (filesize / fba_num_bufsize)) || (!loops)) - loops = filesize / fba_num_bufsize; /* entire disk */ - - gen_data(buf1, bufsize); - - for (i = 0; i < loops; i++) { - r = pwrite(fd, buf1, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test5: write"); - err++; - return (err); - } - } - for (i = 0; i < loops; i++) { - buf2[0] = '\0'; /* clear buf to make sure something is read */ - r = pread(fd, buf2, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test5: read"); - err++; - return (err); - } - if (memcmp(buf1, buf2, bufsize)) { - (void) printf("Test5: Data corruption," - " fd:%s, fpos:%" NSC_SZFMT ", len:%d\n", - name[h], i, bufsize); - err++; - } - } - - gen_data(buf1, bufsize); - - for (i = loops - 1; i + 1 > 0; i--) { - r = pwrite(fd, buf1, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test5: write"); - err++; - return (err); - } - } - for (i = loops - 1; i + 1 > 0; i--) { - buf2[0] = '\0'; /* clear buf to make sure something is read */ - r = pread(fd, buf2, bufsize, (i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test5: read"); - err++; - return (err); - } - if (memcmp(buf1, buf2, bufsize)) { - (void) printf("Test5: Data corruption," - " fd:%s, fpos:%" NSC_SZFMT ", len:%d\n", - name[h], i, bufsize); - err++; - } - } - return (err); -} - - -int -do_sdtest6(int fd, nsc_size_t loops, nsc_size_t filesize, int h) -{ - int err = 0; - nsc_size_t i; - ssize_t r; - nsc_size_t endloop = filesize / fba_num_bufsize; - int buf3[MAXBUF]; - int buf4[MAXBUF]; - nsc_off_t top_pos, bottom_pos; - - /* - * Do alternating top down and bottom up sequential writes - * (working towards middle) and verify with reads - * for loops number of bufsize chunks, unless loops == 0, then do - * entire disk. - */ - if ((loops > (filesize / fba_num_bufsize)) || (!loops)) - loops = filesize / fba_num_bufsize; /* entire disk */ - - for (i = 0; i < loops; i++) { - gen_data(buf1, bufsize); - bottom_pos = i*fba_num_bufsize; - r = pwrite(fd, buf1, bufsize, (off_t)(bottom_pos << SCTRSHFT)); - if (r <= 0) { - perror("Test6: write"); - err++; - return (err); - } - gen_data(buf2, bufsize); - top_pos = (endloop - i - 1)*fba_num_bufsize; - - /* Make sure we don't collide in the middle */ - - if (abs(top_pos - bottom_pos) < fba_num_bufsize) - top_pos = bottom_pos + fba_num_bufsize; - - r = pwrite(fd, buf2, bufsize, (off_t)(top_pos << SCTRSHFT)); - if (r <= 0) { - perror("Test6: write"); - err++; - return (err); - } - r = pread(fd, buf3, bufsize, (off_t)(bottom_pos << SCTRSHFT)); - if (r <= 0) { - perror("Test6: read"); - err++; - return (err); - } - if (memcmp(buf1, buf3, bufsize)) { - (void) printf("Data corruption(1), fd:%s, fpos:%" - PRId64 ", len:%d\n", name[h], - (int64_t)(bottom_pos << SCTRSHFT), bufsize); - err++; - } - r = pread(fd, buf4, bufsize, (off_t)(top_pos << SCTRSHFT)); - if (r <= 0) { - perror("Test6: read"); - return (1); - } - if (memcmp(buf2, buf4, bufsize)) { - (void) printf("Test6: Data corruption(2)," - " fd:%s, fpos:%" PRId64 ", len:%d\n", - name[h], (int64_t)(top_pos << SCTRSHFT), bufsize); - err++; - } - } - return (err); -} - -int shmid; - -#define MAXREADERS 32 - -struct shm_struct { - int writebuf[MAXBUF]; - volatile nsc_off_t writepos; - int quit; - int err; - mutex_t err_mutex; - int rd_done[MAXREADERS]; - int rd_done_mask[MAXREADERS]; -} *shm; - -#define WRITEBUF (shm->writebuf) -#define WRITEPOS (shm->writepos) - -#define QUIT (shm->quit) -#define ERR (shm->err) -#define ERRMUTEX (shm->err_mutex) -#define RD_DONE (shm->rd_done) -#define RD_DONE_MASK (shm->rd_done_mask) - -#define LOCKWRITE -#define LOCKREAD(i) - -/* Clear RD_DONE and Set WRITEPOS */ -#define FREEWRITE { \ - bzero(RD_DONE, sizeof (RD_DONE)); \ - WRITEPOS = wr_pos; } - -/* Reader i+1 marks himself as finished */ -#define FREEREAD(i) (RD_DONE[(i)] = 1) - - -int -do_sdtest7read(int fd, int h, int which) -{ - int err; - ssize_t r_rd; - nsc_off_t curr_pos; - nsc_size_t loop_cnt; - err = 0; curr_pos = 0; loop_cnt = 0; - for (;;) { - /* Already read this? */ - if (curr_pos == WRITEPOS) { - if (!QUIT) { - continue; - } else { - /* Time to go! */ - /* printf("Quitting [%d]\n", which+1); */ - break; - } - } - - /* get location to read from */ - curr_pos = WRITEPOS; - - r_rd = pread(fd, buf1, bufsize, (curr_pos << SCTRSHFT)); - loop_cnt += 1; - if (r_rd <= 0) { - FREEREAD(which); - perror("Test7: read"); - err += 1; - continue; - } - - if (memcmp(buf1, WRITEBUF, bufsize)) { - FREEREAD(which); - (void) printf("\nTest7: Data corruption, reader #%d, " - "fd:%s, \ - fpos:%" PRId64 ", len:%d\n", which + 1, name[h], - (int64_t)(curr_pos << SCTRSHFT), bufsize); - err += 1; - continue; - } - - FREEREAD(which); - } - - (void) printf( - "Partition %s, Test 7, reader #%d: %d errors %lld loops\n", - name[h], which+1, err, loop_cnt); - - if (err > 0) { - (void) mutex_lock(&ERRMUTEX); - ERR += err; - (void) mutex_unlock(&ERRMUTEX); - } - - if (err) - return (1); - else - return (0); -} - - -int -do_sdtest7write(int fd, nsc_size_t filesize, int h) -{ - int err = 0; - ssize_t r; - nsc_off_t wr_pos; - - /* Wait for readers to finish */ - while (memcmp(RD_DONE, RD_DONE_MASK, readercount*sizeof (int))) - ; - - gen_data(WRITEBUF, bufsize); - wr_pos = ( -#ifdef NSC_MULTI_TERABYTE - ((nsc_off_t)rand() << 48) | ((nsc_off_t)rand() << 32) | -#endif - (rand() << 16) | rand()) % filesize; - r = pwrite(fd, WRITEBUF, bufsize, (off_t)(wr_pos << SCTRSHFT)); - if (r <= 0) { - FREEWRITE; - perror("Test7: write"); - return (1); - } - FREEWRITE; - - /* verify write */ - r = pread(fd, buf1, bufsize, (off_t)(wr_pos << SCTRSHFT)); - if (r <= 0) { - perror("Test7: writer: read"); - return (1); - } - - - if (memcmp(buf1, WRITEBUF, bufsize)) { - (void) printf("\nTest7: Data corruption in writer," - " fd:%s, fpos:%" PRId64 ", len:%d\n", - name[h], (int64_t)(wr_pos << SCTRSHFT), bufsize); - err++; - } - - - return (err); -} - -void -init_shm() -{ - int i; - - /* Clear out everything */ - bzero(shm, sizeof (struct shm_struct)); - - (void) mutex_init(&ERRMUTEX, USYNC_PROCESS, NULL); - - /* Set up mask (constant) to test reader doneness */ - for (i = 0; i < readercount; i++) - RD_DONE_MASK[i] = 1; - - /* Mark all readers done - so writer can start */ - for (i = 0; i < readercount; i++) - RD_DONE[i] = 1; -} - -int -do_sdtest7(int fd, nsc_size_t loops, nsc_size_t filesize, int h, nsc_fd_t *sdfd) -{ - int r, i, err; - nsc_size_t j; - - if ((shmid = shmget(IPC_PRIVATE, sizeof (struct shm_struct), - IPC_CREAT | 0666)) < 0) { - perror("shmget error: "); - (void) nsc_close(sdfd); - exit(1); - } - - shm = (struct shm_struct *)shmat(shmid, NULL, 0); - if (shm == (struct shm_struct *)-1) { - perror("shmat error: "); - (void) nsc_close(sdfd); - exit(1); /* cleanup exits */ - } - - init_shm(); - - /* Start Readers */ - for (i = 0; i < readercount; i++) { - r = fork(); - if (r == 0) { /* child */ - (void) do_sdtest7read(fd, h, i); - (void) nsc_close(sdfd); - exit(0); - } else - continue; - } - - /* Start Writer */ - srand(getpid()); err = 0; - for (j = 0; j < loops; j++) { - err += do_sdtest7write(fd, filesize, h); - } - QUIT = 1; - - (void) printf("\n\nPartition %s, Test 7, writer: %d errors\n", - name[h], err); - - for (i = 0; i < readercount; i++) - (void) wait(0); - - /* No lock needed here - everybody's finished */ - err += ERR; - - (void) mutex_destroy(&ERRMUTEX); - (void) shmctl(shmid, IPC_RMID, 0); - return (err); -} - -int -do_sdtest8(int fd, nsc_size_t loops, nsc_size_t filesize) -{ - nsc_off_t seekpos; - int err = 0; - ssize_t r; - nsc_size_t i; - - for (i = 0; i < loops; i++) { - seekpos = ( -#ifdef NSC_MULTI_TERABYTE - ((nsc_off_t)rand() << 48) | ((nsc_off_t)rand() << 32) | -#endif - (rand() << 16) | rand()) % filesize; - gen_data(buf1, bufsize); - r = pwrite(fd, buf1, bufsize, (off_t)(seekpos << SCTRSHFT)); - if (r <= 0) { - perror("Test8: write"); - err++; - return (err); - } - } - return (err); -} - -void -gen_data_known(int *buffer, int size, int data) -{ - int i; - - size /= 4; - for (i = 0; i < size; i++) - buffer[i] = data; -} - -int -do_sdtest9(int fd, nsc_size_t loops, nsc_size_t filesize, int h) -{ - int err = 0; - ssize_t r; - nsc_off_t fba_offset; - nsc_size_t i, wrapval; - - /* - * Test 9 will write a given pattern over and over Test 11 or - * Test 12 will read same pattern. - */ - /* Large loop value that would cause write overflow will wrap */ - - gen_data_known(buf1, bufsize, pattern[h]); - - wrapval = filesize / fba_num_bufsize; - - if (loops == 0) - loops = wrapval; /* entire disk */ - - for (i = 0; i < loops; i++) { - fba_offset = i % wrapval; - r = pwrite(fd, buf1, bufsize, - (off_t)(fba_offset * fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test9: write"); - err++; - return (err); - } - } - return (err); -} - -int -do_sdtest10(int fd1, int fd2, nsc_size_t loops, nsc_size_t filesize1, - nsc_size_t filesize2, int h) -{ - nsc_size_t filesize; - int err = 0; - nsc_size_t i; - ssize_t r; - - /* - * Do sequential copy of disk1 to disk2 for loops number - * of bufsize chunks, unless loops == 0, then copy size of - * the smaller disk. - * Go back and verify that the two disks are identical. - */ - - filesize = (filesize1 < filesize2) ? filesize1 : filesize2; - if ((loops > (filesize / fba_num_bufsize)) || (!loops)) - loops = filesize / fba_num_bufsize; - - /* copy disk1 to to disk2 */ - for (i = 0; i < loops; i++) { - r = pread(fd1, buf1, bufsize, - (off_t)(i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test10: read"); - return (1); - } - r = pwrite(fd2, buf1, bufsize, - (off_t)(i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test10: write"); - return (1); - } - } - - /* verify disks are identical */ - for (i = 0; i < loops; i++) { - buf1[0] = '\0'; /* clear buf to make sure something is read */ - r = pread(fd1, buf1, bufsize, - (off_t)(i * fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test10: read"); - return (1); - } - buf2[0] = 'x'; /* make sure something is read */ - r = pread(fd2, buf2, bufsize, - (off_t)(i * fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test10: read"); - return (1); - } - if (memcmp(buf1, buf2, bufsize)) { - (void) printf("Test10: Data corruption," - " fd1:%s, fd2:%s fpos:%" NSC_SZFMT ", len:%d\n", - name[2*h], name[2*h+1], i, bufsize); - err++; - } - } - return (err); -} - -int -buffcmp(int *b1, int *b2, int size) -{ - int i; - - for (i = 0; i < size/4; i++) { - if (b1[i] != b2[i]) { - (void) printf("Word %d does not match b1=0x%x, " - "b2=0x%x\n", i, b1[i], b2[i]); - return (1); - } - } - return (0); - -} - -int -do_sdtest11(int fd, nsc_size_t loops, nsc_size_t filesize, int h) -{ - int err = 0; - nsc_size_t i; - ssize_t r; - int buf3[MAXBUF]; - int buf4[MAXBUF]; - int timestamp; - time_t clock; - struct tm *tm; - - - /* - * Test 9 will write a given pattern over and over Test 11 will read - * same pattern and clear with timestamp data (MM:SS). - */ - - clock = time(NULL); - tm = localtime(&clock); - (void) ascftime((char *)×tamp, "%M""%S", tm); - - gen_data_known(buf1, bufsize, pattern[h]); - gen_data_known(buf4, bufsize, timestamp); - if ((loops > filesize / fba_num_bufsize) || (!loops)) - loops = filesize / fba_num_bufsize; /* entire disk */ - - for (i = 0; i < loops; i++) { - r = pread(fd, buf3, bufsize, - (off_t)(i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test11: read"); - err++; - return (err); - } - if (buffcmp(buf1, buf3, bufsize)) { - (void) printf("Data corr, fd:%s, fpos:%" NSC_SZFMT - ", len:%d\n", name[h], i, bufsize); - err++; - return (err); - } - r = pwrite(fd, buf4, bufsize, - (off_t)(i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test11: write"); - err++; - return (err); - } - } - return (err); -} - -int -do_sdtest12(int fd, nsc_size_t loops, nsc_size_t filesize, int h) -{ - int err = 0; - nsc_size_t i; - ssize_t r; - int buf3[MAXBUF]; - - /* - * Test 9 will write a given pattern over and over Test 12 will read - * same pattern - */ - - gen_data_known(buf1, bufsize, pattern[h]); - if ((loops > filesize / fba_num_bufsize) || (!loops)) - loops = filesize / fba_num_bufsize; /* entire disk */ - - for (i = 0; i < loops; i++) { - r = pread(fd, buf3, bufsize, - (off_t)(i*fba_num_bufsize) << SCTRSHFT); - if (r <= 0) { - perror("Test12: read"); - err++; - return (err); - } - if (buffcmp(buf1, buf3, bufsize)) { - (void) printf("Data corr, fd:%s, fpos:%" NSC_SZFMT - ", len:%d\n", name[h], i, bufsize); - err++; - return (err); - } - } - return (err); -} - -#ifdef lint -int -sd_diag_lintmain(int argc, char *argv[]) -#else -int -main(int argc, char *argv[]) -#endif -{ - int procs; - nsc_size_t filesize, filesize2; - int fd, fd2, r, id, h, i; - nsc_fd_t *sdfd, *sdfd2; - - if (argc < 2) { - print_usage(); - exit(0); - } - (void) strcpy(config_file, DISKLIST); - parse_opts(argc, argv); - - _nsc_nocheck(); - if ((procs = read_parts()) == 0) - exit(0); - - id = strtol(argv[optind], 0, 0); - if (id == 10) { - /* - * each process gets 2 disks and copies disk1 to disk2, - * then goes back and verifies that the two disks are - * identical. - */ - if (procs < 2) { - (void) printf("%s requires having at least 2 disks for test " - "#10.\n", config_file); - exit(0); - } - - for (h = 0; h < procs/2; h++) { - r = fork(); - if (r == 0) { - srand(getpid()); - - - if (!(sdfd = nsc_open(name[2*h], NSC_CACHE, - O_RDWR | Rflag))) { - (void) fprintf(stderr, - "sd_diag: Error opening %s\n", name[2*h]); - exit(1); - } - fd = nsc_fileno(sdfd); - if (fd == -1) { - (void) fprintf(stderr, - "sd_diag: Error opening %s\n", name[2*h]); - (void) nsc_close(sdfd); - exit(1); - } - filesize = set_part_size(name[2*h], sdfd); - if (!(sdfd2 = nsc_open(name[2*h+1], NSC_CACHE, - O_RDWR | Rflag))) { - (void) fprintf(stderr, - "sd_diag: Error opening %s\n", name[2*h+1]); - exit(1); - } - fd2 = nsc_fileno(sdfd2); - if (fd2 == -1) { - (void) fprintf(stderr, - "sd_diag: Error opening %s\n", name[2*h+1]); - (void) nsc_close(sdfd2); - exit(1); - } - filesize2 = set_part_size(name[2*h+1], sdfd2); - (void) sleep(2); - r = do_sdtest10(fd, fd2, loops, filesize, filesize2, h); - - (void) printf("Partitions %s and %s, Test %d," - " Completed %d errors\n", - name[2*h], name[2*h+1], id, r); - (void) nsc_close(sdfd); - (void) nsc_close(sdfd2); - exit(0); - } else if (r == -1) { - perror("fork"); - break; - } else - continue; - } /* for */ - for (i = 0; i < h; i++) - (void) wait(0); - } else { - - for (h = 0; h < procs; h++) { - r = fork(); - if (r == 0) { - srand(getpid()); - - id = strtol(argv[optind], 0, 0); - if (!(sdfd = nsc_open(name[h], NSC_CACHE, - O_RDWR | Rflag))) { - (void) fprintf(stderr, - "sd_diag: Error opening %s\n", name[h]); - exit(1); - } - fd = nsc_fileno(sdfd); - - if (fd == -1) { - (void) fprintf(stderr, - "sd_diag: Error opening %s\n", name[h]); - (void) nsc_close(sdfd); - exit(1); - } - filesize = set_part_size(name[h], sdfd); - - (void) sleep(2); - - - switch (id) { - case 1: - r = do_sdtest1(fd, r_loops, filesize); - break; - case 2: - r = do_sdtest2(fd, r_loops, filesize, h); - break; - case 3: - r = do_sdtest3(fd, r_loops, filesize, h, sdfd); - break; - case 4: - r = do_sdtest4(fd, loops, filesize); - break; - case 5: - r = do_sdtest5(fd, loops, filesize, h); - break; - case 6: - r = do_sdtest6(fd, loops, filesize, h); - break; - case 7: - r = do_sdtest7(fd, r_loops, filesize, h, sdfd); - break; - case 8: - r = do_sdtest8(fd, r_loops, filesize); - break; - case 9: - r = do_sdtest9(fd, loops, filesize, h); - break; - case 11: - r = do_sdtest11(fd, loops, filesize, h); - break; - case 12: - r = do_sdtest12(fd, loops, filesize, h); - break; - default: - break; - } - - (void) printf("Partition %s, Test %d, Completed %d " - "errors\n", name[h], id, r); - (void) nsc_close(sdfd); - exit(r ? 1 : 0); - } else if (r == -1) { - perror("fork"); - break; - } else - continue; - } - for (i = 0; i < h; i++) - (void) wait(0); - } - - return (0); -} |