This commit is contained in:
Kent Overstreet 2010-07-29 23:05:51 -07:00
parent 8dc5698fe9
commit e7b1ba1bd0
3 changed files with 48 additions and 26 deletions

View File

@ -1,9 +1,15 @@
PREFIX=/usr/local
CFLAGS=-O2 -Wall -g CFLAGS=-O2 -Wall -g
all: make-bcache bcache-test all: make-bcache
clean: clean:
rm -f make-bcache bcache-test *.o rm -f make-bcache bcache-test *.o
install: make-bcache
install -m0755 make-bcache ${PREFIX}/sbin/
install -m0755 bcache-test ${PREFIX}/sbin/
bcache-test: LDFLAGS += -lm -lssl -lcrypto bcache-test: LDFLAGS += -lm -lssl -lcrypto

View File

@ -28,6 +28,8 @@ static const unsigned char bcache_magic[] = {
unsigned char zero[4096]; unsigned char zero[4096];
bool klog = false;
#define Pread(fd, buf, size, offset) do { \ #define Pread(fd, buf, size, offset) do { \
int _read = 0, _r; \ int _read = 0, _r; \
while (_read < size) { \ while (_read < size) { \
@ -97,9 +99,29 @@ struct pagestuff {
int writecount; int writecount;
}; };
void flushlog(int fd, char *logbuf) void flushlog(void)
{ {
int w = 0, len = klogctl(4, logbuf, 1 << 21); char logbuf[1 << 21];
int w = 0, len;
static int fd;
if (!klog)
return;
if (!fd) {
klogctl(8, 0, 6);
sprintf(logbuf, "log.%i", abs(random()) % 1000);
fd = open(logbuf, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (fd == -1) {
perror("Error opening log file");
exit(EXIT_FAILURE);
}
}
len = klogctl(4, logbuf, 1 << 21);
if (len == -1) { if (len == -1) {
perror("Error reading kernel log"); perror("Error reading kernel log");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -127,20 +149,19 @@ void usage()
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
bool walk = false, randsize = false, verbose = false, csum = false, destructive = false, log = false; bool walk = false, randsize = false, verbose = false, csum = false, destructive = false;
int fd1, fd2 = 0, logfd, direct = 0, nbytes = 4096, j, o; int fd1, fd2 = 0, direct = 0, nbytes = 4096, j, o;
unsigned long size, i, offset = 0, done = 0, unique = 0, benchmark = 0; unsigned long size, i, offset = 0, done = 0, unique = 0, benchmark = 0;
void *buf1 = NULL, *buf2 = NULL; void *buf1 = NULL, *buf2 = NULL;
struct pagestuff *pages, *p; struct pagestuff *pages, *p;
unsigned char c[16]; unsigned char c[16];
char logbuf[1 << 21];
time_t last_printed = 0; time_t last_printed = 0;
extern char *optarg; extern char *optarg;
RC4_KEY writedata; RC4_KEY writedata;
RC4_set_key(&writedata, 16, bcache_magic); RC4_set_key(&writedata, 16, bcache_magic);
while ((o = getopt(argc, argv, "dwvscwlb:")) != EOF) while ((o = getopt(argc, argv, "dnwvscwlb:")) != EOF)
switch (o) { switch (o) {
case 'd': case 'd':
direct = O_DIRECT; direct = O_DIRECT;
@ -161,7 +182,7 @@ int main(int argc, char **argv)
destructive = true; destructive = true;
break; break;
case 'l': case 'l':
log = true; klog = true;
break; break;
case 'b': case 'b':
benchmark = atol(optarg); benchmark = atol(optarg);
@ -207,16 +228,6 @@ int main(int argc, char **argv)
} }
//setvbuf(stdout, NULL, _IONBF, 0); //setvbuf(stdout, NULL, _IONBF, 0);
if (log) {
sprintf(logbuf, "log.%i", abs(random()) % 1000);
logfd = open(logbuf, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (logfd == -1) {
perror("Error opening log file");
exit(EXIT_FAILURE);
}
klogctl(8, 0, 6);
}
for (i = 0; !benchmark || i < benchmark; i++) { for (i = 0; !benchmark || i < benchmark; i++) {
bool writing = destructive && (i & 1); bool writing = destructive && (i & 1);
nbytes = randsize ? drand48() * 16 + 1 : 1; nbytes = randsize ? drand48() * 16 + 1 : 1;
@ -227,8 +238,8 @@ int main(int argc, char **argv)
offset %= size; offset %= size;
offset <<= 12; offset <<= 12;
if (log && !(i % 200)) if (!(i % 200))
flushlog(logfd, logbuf); flushlog();
if (!verbose) { if (!verbose) {
time_t now = time(NULL); time_t now = time(NULL);
@ -278,11 +289,12 @@ print: printf("Loop %6li offset %9li sectors %3i, %6lu mb done, %6lu mb unique
if (writing && !csum && !benchmark) if (writing && !csum && !benchmark)
Pwrite(fd2, buf2, nbytes, offset); Pwrite(fd2, buf2, nbytes, offset);
} }
printf("Loop %6li offset %9li sectors %3i, %6lu mb done, %6lu mb unique\n",
i, offset >> 9, nbytes >> 9, done >> 11, unique >> 11);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
err: err:
perror("IO error"); perror("IO error");
if (log) flushlog();
flushlog(logfd, logbuf);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
bad: bad:
printf("Bad read! loop %li offset %li readcount %i writecount %i\n", printf("Bad read! loop %li offset %li readcount %i writecount %i\n",
@ -291,6 +303,6 @@ bad:
if (!memcmp(&p->oldcsum[0], c, 16)) if (!memcmp(&p->oldcsum[0], c, 16))
printf("Matches previous csum\n"); printf("Matches previous csum\n");
flushlog(logfd, logbuf); flushlog();
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }

View File

@ -8,7 +8,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
@ -75,19 +74,24 @@ long hatoi(const char *s)
return i; return i;
} }
void usage()
{
printf("");
exit(EXIT_FAILURE);
}
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
int64_t nblocks, bucketsize = 32, blocksize = 8; int64_t nblocks, bucketsize = 32, blocksize = 8;
int fd, i, c; int fd, i, c;
struct cache_sb sb; struct cache_sb sb;
while ((c = getopt(argc, argv, "b:")) != -1) { while ((c = getopt(argc, argv, "b:")) != -1)
switch (c) { switch (c) {
case 'b': case 'b':
bucketsize = hatoi(optarg) / 512; bucketsize = hatoi(optarg) / 512;
break; break;
} }
}
if (argc <= optind) { if (argc <= optind) {
printf("Please supply a device\n"); printf("Please supply a device\n");