Esempio n. 1
0
File: utility.c Progetto: Zkin/tux3
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);
}
Esempio n. 2
0
/* 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;
}
Esempio n. 3
0
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;
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
/* 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;
}