new helper: ext2_image_size()
[~shefty/rdma-dev.git] / include / linux / ext2_fs.h
index f28dba518a4af377ce4f76759cdfeb9d6662f788..5f65ec75b48a45a7199cf411475ea2717ea3bc0d 100644 (file)
@@ -536,4 +536,26 @@ enum {
                                         ~EXT2_DIR_ROUND)
 #define EXT2_MAX_REC_LEN               ((1<<16)-1)
 
+#define EXT2_SB_MAGIC_OFFSET   0x38
+#define EXT2_SB_BLOCKS_OFFSET  0x04
+#define EXT2_SB_BSIZE_OFFSET   0x18
+
+static inline u64 ext2_image_size(void *ext2_sb)
+{
+       __u8 *p = ext2_sb;
+       if (*(__le16 *)(p + EXT2_SB_MAGIC_OFFSET) != cpu_to_le16(EXT2_SUPER_MAGIC))
+               return 0;
+       return (u64)le32_to_cpup((__le32 *)(p + EXT2_SB_BLOCKS_OFFSET)) <<
+               le32_to_cpup((__le32 *)(p + EXT2_SB_BSIZE_OFFSET));
+}
+
+static inline void verify_offsets(void)
+{
+#define A(x,y) BUILD_BUG_ON(x != offsetof(struct ext2_super_block, y));
+       A(EXT2_SB_MAGIC_OFFSET, s_magic);
+       A(EXT2_SB_BLOCKS_OFFSET, s_blocks_count);
+       A(EXT2_SB_BSIZE_OFFSET, s_log_block_size);
+#undef A
+}
+
 #endif /* _LINUX_EXT2_FS_H */