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>
16 static const char bcache_magic[] = {
17 0xc6, 0x85, 0x73, 0xf6, 0x4e, 0x1a, 0x45, 0xca,
18 0x82, 0x65, 0xf5, 0x7f, 0x48, 0xba, 0x6d, 0x81 };
23 uint16_t block_size; /* sectors */
24 uint16_t bucket_size; /* sectors */
25 uint32_t journal_start; /* buckets */
26 uint32_t first_bucket; /* start of data */
27 uint64_t nbuckets; /* device size */
35 } __attribute((packed));
39 long getblocks(int fd)
43 if (fstat(fd, &statbuf)) {
44 perror("stat error\n");
47 ret = statbuf.st_size / 512;
48 if (S_ISBLK(statbuf.st_mode))
49 if (ioctl(fd, BLKGETSIZE, &ret)) {
50 perror("ioctl error");
56 long hatoi(const char *s)
59 long long i = strtol(s, &e, 10);
83 int main(int argc, char **argv)
85 int64_t nblocks, bucketsize = 32, blocksize = 8;
89 while ((c = getopt(argc, argv, "b:")) != -1)
92 bucketsize = hatoi(optarg) / 512;
97 printf("Please supply a device\n");
101 fd = open(argv[optind], O_RDWR);
103 perror("Can't open dev\n");
106 nblocks = getblocks(fd);
107 printf("device is %li sectors\n", nblocks);
109 if (bucketsize < blocksize ||
110 bucketsize > nblocks / 8) {
111 printf("Bad bucket size %li\n", bucketsize);
115 memcpy(sb.magic, bcache_magic, 16);
117 sb.block_size = blocksize;
118 sb.bucket_size = bucketsize;
119 sb.nbuckets = nblocks / sb.bucket_size;
122 sb.first_bucket = ((--sb.nbuckets * sizeof(struct bucket_disk)) + (24 << 9)) / (sb.bucket_size << 9) + 1;
123 while ((sb.nbuckets + sb.first_bucket) * sb.bucket_size > nblocks);
125 sb.journal_start = sb.first_bucket;
127 sb.btree_root = sb.first_bucket * sb.bucket_size;
130 printf("block_size: %u\n"
132 "journal_start: %u\n"
141 /* Zero out priorities */
142 lseek(fd, 4096, SEEK_SET);
143 for (i = 8; i < sb.first_bucket * sb.bucket_size; i++)
144 if (write(fd, zero, 512) != 512)
147 if (pwrite(fd, &sb, sizeof(sb), 4096) != sizeof(sb))
153 perror("write error\n");