1 #define _FILE_OFFSET_BITS 64
2 #define __USE_FILE_OFFSET64
3 #define _XOPEN_SOURCE 500
11 #include <sys/ioctl.h>
12 #include <sys/types.h>
15 #include <uuid/uuid.h>
21 long getblocks(int fd)
25 if (fstat(fd, &statbuf)) {
26 perror("stat error\n");
29 ret = statbuf.st_size / 512;
30 if (S_ISBLK(statbuf.st_mode))
31 if (ioctl(fd, BLKGETSIZE, &ret)) {
32 perror("ioctl error");
38 long hatoi(const char *s)
41 long long i = strtol(s, &e, 10);
65 int main(int argc, char **argv)
67 int64_t nblocks, bucketsize = 32, blocksize = 8;
72 uuid_generate(sb.uuid);
74 while ((c = getopt(argc, argv, "U:b:")) != -1)
77 bucketsize = hatoi(optarg) / 512;
80 if (uuid_parse(optarg, sb.uuid)) {
88 printf("Please supply a device\n");
92 fd = open(argv[optind], O_RDWR);
94 perror("Can't open dev\n");
97 nblocks = getblocks(fd);
98 printf("device is %li sectors\n", nblocks);
100 if (bucketsize < blocksize ||
101 bucketsize > nblocks / 8) {
102 printf("Bad bucket size %li\n", bucketsize);
106 memcpy(sb.magic, bcache_magic, 16);
108 sb.block_size = blocksize;
109 sb.bucket_size = bucketsize;
110 sb.nbuckets = nblocks / sb.bucket_size;
111 uuid_unparse(sb.uuid, uuid);
114 sb.first_bucket = ((--sb.nbuckets * sizeof(struct bucket_disk)) + (24 << 9)) / (sb.bucket_size << 9) + 1;
115 while ((sb.nbuckets + sb.first_bucket) * sb.bucket_size > nblocks);
117 sb.journal_start = sb.first_bucket;
119 sb.btree_root = sb.first_bucket * sb.bucket_size;
122 printf("block_size: %u\n"
124 "journal_start: %u\n"
135 /* Zero out priorities */
136 lseek(fd, 4096, SEEK_SET);
137 for (i = 8; i < sb.first_bucket * sb.bucket_size; i++)
138 if (write(fd, zero, 512) != 512)
141 if (pwrite(fd, &sb, sizeof(sb), 4096) != sizeof(sb))
147 perror("write error\n");