⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tstfs.c

📁 be文件系统实现的源码
💻 C
字号:
/*  This file contains a simple test program that can be used as a sort  of stress test for the file system. It's not exhaustive but it provides  a decent first level sanity check on whether a file system will work.  Basically it just randomly creates and deletes files.  The defines  just after the includes control how many files and how many iterations.  Be careful if you just bump up the numbers really high -- it will take  a long time to run and if you only have a 16 megabyte file system  it will probably run out of space.      THIS CODE COPYRIGHT DOMINIC GIAMPAOLO.  NO WARRANTY IS EXPRESSED   OR IMPLIED.  YOU MAY USE THIS CODE AND FREELY DISTRIBUTE IT FOR  NON-COMMERCIAL USE AS LONG AS THIS NOTICE REMAINS ATTACHED.  FOR COMMERCIAL USE, CONTACT DOMINIC GIAMPAOLO (dbg@be.com).  Dominic Giampaolo  dbg@be.com*/#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <string.h>#include <time.h>#include <fcntl.h>#include <sys/types.h>#include <sys/time.h>#include <errno.h>#include "myfs.h"#include "kprotos.h"#define MAX_LOOPS  1024#define MAX_FILES  512#define MAX_NAME   24char      buf[MAX_FILES][MAX_NAME];fs_off_t  sizes[MAX_FILES];static voidmake_random_name(char *buf, int len){    int i, max = (rand() % (len - 7)) + 6;    for(i=0; i < max; i++) {        buf[i] = 'a' + (rand() % 26);    }    buf[i] = '\0';}static voidSubTime(struct timeval *a, struct timeval *b, struct timeval *c){  if ((long)(a->tv_usec - b->tv_usec) < 0)   {     a->tv_sec--;     a->tv_usec += 1000000;   }  c->tv_sec  = a->tv_sec  - b->tv_sec;  c->tv_usec = a->tv_usec - b->tv_usec;}static voidwrite_rand_data(int fd, int max_data){    int    i, k, err;    size_t j;    static char buf[4096];    ulong  sum = 0;    for(i=0; max_data > 0; i++) {        j = rand() % sizeof(buf);        if ((int)(max_data - j) < 0)            j = max_data;                memset(buf, rand() >> 8, j);        for(k=0; k < j; k++)            sum += buf[k];                /* printf("write: %d\n", j); */        err = sys_write(1, fd, buf, j);        if (err != j) {            errno = err;            perror("write_rand_data");            printf("err %d j %d\n", err, j);            if (errno != ENOSPC)                while(1)                    sleep(1);            break;        }        max_data -= j;    }#if INSANELY_SLOW_CHECKSUM    pos = 0;    err = sys_lseek(1, fd, SEEK_SET, &pos);    for(i=0; i < max; i++) {        j = sizeof(buf);        sys_read(1, fd, buf, j);        for(k=0; k < j; k++)            nsum += buf[k];    }    if (sum != nsum)        printf("sum = 0x%x, nsum 0x%x\n", sum, nsum);#endif}intmain(int argc, char **argv){    int             i, j, fd, seed, err, size, sum, name_size = 0;    struct my_stat  st;    struct timeval  start, end, result;    char           *disk_name = "big_file";    myfs_info      *myfs;            if (argv[1] != NULL && !isdigit(argv[1][0]))        disk_name = argv[1];    else if (argv[1] && isdigit(argv[1][0]))        seed = strtoul(argv[1], NULL, 0);    else        seed = getpid() * time(NULL) | 1;    printf("random seed == 0x%x\n", seed);    srand(seed);    myfs = init_fs(disk_name);    for(i=0; i < MAX_FILES; i++)        buf[i][0] = '\0';        printf("creating & deleting files...\n"); fflush(stdout);    gettimeofday(&start, NULL);    for(i=0,sum=0; i < MAX_LOOPS; i++) {        j = rand() % MAX_FILES;        size = (rand() % 65536) + 1;            #if 1        if ((i % 10) == 0) {            printf("\r                                \r");             printf("iteration: %7d", i);            fflush(stdout);        }#endif        if (buf[j][0] == '\0') {     /* then create a file */            strcpy(&buf[j][0], "/myfs/");            make_random_name(&buf[j][6], MAX_NAME-6);            name_size += strlen(&buf[j][6]);                        sum += sizes[j] = size;                        /* printf("\rcreating: %s %d bytes", &buf[j][0], size); */            fd = sys_open(1, -1, &buf[j][0], O_CREAT|O_RDWR,                          MY_S_IFREG|MY_S_IRWXU, 0);             if (fd < 0) {                printf("error creating: %s\n", &buf[j][0]);                break;            }                        write_rand_data(fd, size);            sys_close(1, fd);        } else {                      /* then delete the file */            /* printf("\runlinking %s", &buf[j][0]); */            name_size -= strlen(&buf[j][6]);            err = sys_unlink(1, -1, &buf[j][0]);            if (err != 0) {                printf("error removing: %s: %s\n", &buf[j][0], strerror(err));                break;            }            buf[j][0] = '\0';            sum -= sizes[j];        }#if 0   /* doing this is really anal */        for(k=0; k < MAX_FILES; k++) {            if (buf[k][0] == '\0')                continue;                        fd = sys_open(1, -1, &buf[k][0], O_RDWR, 0, 0);            if (fd < 0) {                printf("file: %s is not present and should be!\n", &buf[k][0]);                sys_unmount(1, -1, "/myfs");                exit(0);            }                        sys_close(1, fd);        }#endif    }    gettimeofday(&end, NULL);    SubTime(&end, &start, &result);    printf("\rcreated %d files in %2ld.%.6ld seconds (%d k data)\n", i,           result.tv_sec, result.tv_usec, sum/1024);        printf("now verifying files....\n");    for(i=0; i < MAX_FILES; i++) {        if (buf[i][0] == '\0')            continue;        printf("                                                       \r");        printf("opening: %s\r", &buf[i][0]);        fflush(stdout);                fd = sys_open(1, -1, &buf[i][0], O_RDWR, 0, 0);        if (fd != 0) {             printf("file: %s is not present and should be!\n", &buf[i][0]);            sys_unmount(1, -1, "/myfs");            exit(0);        }                    err = sys_rstat(1, -1, &buf[i][0], &st, 1);        if (err != 0) {            printf("stat failed for: %s\n", &buf[i][0]);            continue;        }                if (st.size != sizes[i]) {            printf("size mismatch on %s: %ld != %ld\n", &buf[i][0],                   st.size, sizes[i]);        }        sys_close(1, fd);    }    printf("done verifying files                                         \n");    if (sys_unmount(1, -1, "/myfs") != 0) {        printf("could not UNmount /myfs\n");        return 5;    }    shutdown_block_cache();    /* check_mem();  */        return 0;   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -