1 #define _FILE_OFFSET_BITS 64
2 #define __USE_FILE_OFFSET64
3 #define _XOPEN_SOURCE 500
12 #include <sys/ioctl.h>
13 #include <sys/types.h>
17 static const char bcache_magic[] = {
18 0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca,
19 0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81 };
24 uint16_t block_size; /* sectors */
25 uint16_t bucket_size; /* sectors */
26 uint32_t journal_start; /* buckets */
27 uint32_t first_bucket; /* start of data */
28 uint64_t nbuckets; /* device size */
36 } __attribute((packed));
40 long getblocks(int fd)
44 if (fstat(fd, &statbuf)) {
45 perror("stat error\n");
48 ret = statbuf.st_size / 512;
49 if (S_ISBLK(statbuf.st_mode))
50 if (ioctl(fd, BLKGETSIZE, &ret)) {
51 perror("ioctl error");
57 long hatoi(const char *s)
60 long long i = strtol(s, &e, 10);
78 int main(int argc, char **argv)
80 int64_t nblocks, bucketsize = 32, blocksize = 8;
84 while ((c = getopt(argc, argv, "b:")) != -1) {
87 bucketsize = hatoi(optarg) / 512;
93 printf("Please supply a device\n");
97 fd = open(argv[optind], O_RDWR);
99 perror("Can't open dev\n");
102 nblocks = getblocks(fd);
103 printf("device is %li sectors\n", nblocks);
105 if (bucketsize < blocksize ||
106 bucketsize > nblocks / 8) {
107 printf("Bad bucket size %li\n", bucketsize);
111 memcpy(sb.magic, bcache_magic, 16);
113 sb.block_size = blocksize;
114 sb.bucket_size = bucketsize;
115 sb.nbuckets = nblocks / sb.bucket_size;
118 sb.first_bucket = ((--sb.nbuckets * sizeof(struct bucket_disk)) + (24 << 9)) / (sb.bucket_size << 9) + 1;
119 while ((sb.nbuckets + sb.first_bucket) * sb.bucket_size > nblocks);
121 sb.journal_start = sb.first_bucket;
123 sb.btree_root = sb.first_bucket * sb.bucket_size;
126 printf("block_size: %u\n"
128 "journal_start: %u\n"
137 /* Zero out priorities */
138 lseek(fd, 4096, SEEK_SET);
139 for (i = 8; i < sb.first_bucket * sb.bucket_size; i++)
140 if (write(fd, zero, 512) != 512)
143 if (pwrite(fd, &sb, sizeof(sb), 4096) != sizeof(sb))
148 perror("write error\n");