int blockio(int rw, struct sb *sb, struct buffer_head *buffer, block_t block) { trace("%s: buffer %p, block %Lx", rw ? "write" : "read", buffer, block); return devio(rw, sb_dev(sb), block << sb->blockbits, bufdata(buffer), sb->blocksize); }
/* Clear first and last block to get rid of other magic */ static int clear_other_magic(struct sb *sb) { struct { loff_t loc; unsigned len; } area[] = { { 0, SB_LOC }, { (sb->volblocks - 1) << sb->blockbits, sb->blocksize }, }; void *data; unsigned maxlen = 0; int err; for (int i = 0; i < ARRAY_SIZE(area); i++) maxlen = max(maxlen, area[i].len); data = malloc(maxlen); if (!data) return -ENOMEM; memset(data, 0, maxlen); for (int i = 0; i < ARRAY_SIZE(area); i++) { err = devio(WRITE, sb->dev, area[i].loc, data, area[i].len); if (err) break; } free(data); return err; }
static int clear_other_magic(struct sb *sb) { int err; /* Clear first and last block to get rid of other magic */ for (int i = 0; i <= 1; i++) { loff_t loc = (loff_t[2]){ 0, (sb->volblocks - 1) << sb->blockbits }[i]; unsigned len = (loff_t[2]){ SB_LOC, sb->blocksize }[i]; char data[len]; memset(data, 0, len); err = devio(WRITE, sb->dev, loc, data, len); if (err) break; } return err; }
int save_sb(struct sb *sb) { struct disksuper *super = &sb->super; super->blockbits = cpu_to_be16(sb->blockbits); super->volblocks = cpu_to_be64(sb->volblocks); /* Probably does not belong here (maybe metablock) */ super->iroot = cpu_to_be64(pack_root(&itable_btree(sb)->root)); super->oroot = cpu_to_be64(pack_root(&otable_btree(sb)->root)); super->nextalloc = cpu_to_be64(sb->nextalloc); super->atomdictsize = cpu_to_be64(sb->atomdictsize); super->freeatom = cpu_to_be32(sb->freeatom); super->atomgen = cpu_to_be32(sb->atomgen); /* logchain and logcount are written to super directly */ return devio(WRITE, sb_dev(sb), SB_LOC, super, SB_LEN); }
/* Load on-disk super block, and call setup_sb() with it */ int load_sb(struct sb *sb) { struct disksuper *super = &sb->super; int err; /* At least initialize sb, even if load is failed */ init_sb(sb); err = devio(READ, sb_dev(sb), SB_LOC, super, SB_LEN); if (err) return err; if (memcmp(super->magic, TUX3_MAGIC, sizeof(super->magic))) return -EINVAL; __setup_sb(sb, super); return 0; }