3 * Given an index block with some ->uninc blocks, add all the addresses
4 * of those blocks into the index info.
7 * For now we only support Indirect index in the inode as that is enough
11 #include <lafs/lafs.h>
16 #define encode16(p,n) ({ *(p++) = (n)&255; *(p++) = ((n)>>8) & 255; })
17 #define encode32(p,n) ({ encode16(p,n); encode16(p, ((n)>>16)); })
18 #define encode48(p,n) ({ encode32(p,n); encode16(p, ((n)>>32)); })
20 void lafs_incorporate(struct lafs_iblk *ib)
22 struct lafs *fs = ib->b.ino->fs;
26 if (ib->uninc == NULL)
33 ip = (void*)(ib->b.ino->dblock->b.data + ib->b.ino->metadata_size);
34 if (*(u16*)ip != __cpu_to_le16(IBLK_INDIRECT))
38 max_addr = fs->blocksize - ib->b.ino->metadata_size;
39 max_addr -= 2; /* for type field */
40 max_addr /= 6; /* 6 bytes per address */
43 struct lafs_blk *b = ib->uninc;
45 unsigned char *ip2 = ip;
50 addr = b->fileaddr - ib->b.fileaddr;
54 encode48(ip2, b->physaddr);
56 trace(1, "incorporate %d/%lld\n", ib->b.ino->dblock->b.ino->inum,
57 (long long)ib->b.ino->dblock->b.fileaddr);
58 lafs_dirty_blk(&ib->b);