mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	jbd2: change disk layout for metadata checksumming
Define flags and allocate space in on-disk journal structures to support checksumming of journal metadata. Signed-off-by: Darrick J. Wong <djwong@us.ibm.com> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
This commit is contained in:
		
							parent
							
								
									f32aaf2d2b
								
							
						
					
					
						commit
						8f888ef846
					
				
					 3 changed files with 33 additions and 7 deletions
				
			
		| 
						 | 
					@ -627,7 +627,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		tag = (journal_block_tag_t *) tagp;
 | 
							tag = (journal_block_tag_t *) tagp;
 | 
				
			||||||
		write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
 | 
							write_tag_block(tag_bytes, tag, jh2bh(jh)->b_blocknr);
 | 
				
			||||||
		tag->t_flags = cpu_to_be32(tag_flag);
 | 
							tag->t_flags = cpu_to_be16(tag_flag);
 | 
				
			||||||
		tagp += tag_bytes;
 | 
							tagp += tag_bytes;
 | 
				
			||||||
		space_left -= tag_bytes;
 | 
							space_left -= tag_bytes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -651,7 +651,7 @@ void jbd2_journal_commit_transaction(journal_t *journal)
 | 
				
			||||||
                           submitting the IOs.  "tag" still points to
 | 
					                           submitting the IOs.  "tag" still points to
 | 
				
			||||||
                           the last tag we set up. */
 | 
					                           the last tag we set up. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			tag->t_flags |= cpu_to_be32(JBD2_FLAG_LAST_TAG);
 | 
								tag->t_flags |= cpu_to_be16(JBD2_FLAG_LAST_TAG);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
start_journal_io:
 | 
					start_journal_io:
 | 
				
			||||||
			for (i = 0; i < bufs; i++) {
 | 
								for (i = 0; i < bufs; i++) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -193,10 +193,10 @@ static int count_tags(journal_t *journal, struct buffer_head *bh)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		nr++;
 | 
							nr++;
 | 
				
			||||||
		tagp += tag_bytes;
 | 
							tagp += tag_bytes;
 | 
				
			||||||
		if (!(tag->t_flags & cpu_to_be32(JBD2_FLAG_SAME_UUID)))
 | 
							if (!(tag->t_flags & cpu_to_be16(JBD2_FLAG_SAME_UUID)))
 | 
				
			||||||
			tagp += 16;
 | 
								tagp += 16;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (tag->t_flags & cpu_to_be32(JBD2_FLAG_LAST_TAG))
 | 
							if (tag->t_flags & cpu_to_be16(JBD2_FLAG_LAST_TAG))
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -485,7 +485,7 @@ static int do_one_pass(journal_t *journal,
 | 
				
			||||||
				unsigned long io_block;
 | 
									unsigned long io_block;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				tag = (journal_block_tag_t *) tagp;
 | 
									tag = (journal_block_tag_t *) tagp;
 | 
				
			||||||
				flags = be32_to_cpu(tag->t_flags);
 | 
									flags = be16_to_cpu(tag->t_flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				io_block = next_log_block++;
 | 
									io_block = next_log_block++;
 | 
				
			||||||
				wrap(journal, next_log_block);
 | 
									wrap(journal, next_log_block);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -147,12 +147,24 @@ typedef struct journal_header_s
 | 
				
			||||||
#define JBD2_CRC32_CHKSUM   1
 | 
					#define JBD2_CRC32_CHKSUM   1
 | 
				
			||||||
#define JBD2_MD5_CHKSUM     2
 | 
					#define JBD2_MD5_CHKSUM     2
 | 
				
			||||||
#define JBD2_SHA1_CHKSUM    3
 | 
					#define JBD2_SHA1_CHKSUM    3
 | 
				
			||||||
 | 
					#define JBD2_CRC32C_CHKSUM  4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define JBD2_CRC32_CHKSUM_SIZE 4
 | 
					#define JBD2_CRC32_CHKSUM_SIZE 4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define JBD2_CHECKSUM_BYTES (32 / sizeof(u32))
 | 
					#define JBD2_CHECKSUM_BYTES (32 / sizeof(u32))
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Commit block header for storing transactional checksums:
 | 
					 * Commit block header for storing transactional checksums:
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * NOTE: If FEATURE_COMPAT_CHECKSUM (checksum v1) is set, the h_chksum*
 | 
				
			||||||
 | 
					 * fields are used to store a checksum of the descriptor and data blocks.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * If FEATURE_INCOMPAT_CSUM_V2 (checksum v2) is set, then the h_chksum
 | 
				
			||||||
 | 
					 * field is used to store crc32c(uuid+commit_block).  Each journal metadata
 | 
				
			||||||
 | 
					 * block gets its own checksum, and data block checksums are stored in
 | 
				
			||||||
 | 
					 * journal_block_tag (in the descriptor).  The other h_chksum* fields are
 | 
				
			||||||
 | 
					 * not used.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Checksum v1 and v2 are mutually exclusive features.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
struct commit_header {
 | 
					struct commit_header {
 | 
				
			||||||
	__be32		h_magic;
 | 
						__be32		h_magic;
 | 
				
			||||||
| 
						 | 
					@ -175,13 +187,19 @@ struct commit_header {
 | 
				
			||||||
typedef struct journal_block_tag_s
 | 
					typedef struct journal_block_tag_s
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	__be32		t_blocknr;	/* The on-disk block number */
 | 
						__be32		t_blocknr;	/* The on-disk block number */
 | 
				
			||||||
	__be32		t_flags;	/* See below */
 | 
						__be16		t_checksum;	/* truncated crc32c(uuid+seq+block) */
 | 
				
			||||||
 | 
						__be16		t_flags;	/* See below */
 | 
				
			||||||
	__be32		t_blocknr_high; /* most-significant high 32bits. */
 | 
						__be32		t_blocknr_high; /* most-significant high 32bits. */
 | 
				
			||||||
} journal_block_tag_t;
 | 
					} journal_block_tag_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define JBD2_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high))
 | 
					#define JBD2_TAG_SIZE32 (offsetof(journal_block_tag_t, t_blocknr_high))
 | 
				
			||||||
#define JBD2_TAG_SIZE64 (sizeof(journal_block_tag_t))
 | 
					#define JBD2_TAG_SIZE64 (sizeof(journal_block_tag_t))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Tail of descriptor block, for checksumming */
 | 
				
			||||||
 | 
					struct jbd2_journal_block_tail {
 | 
				
			||||||
 | 
						__be32		t_checksum;	/* crc32c(uuid+descr_block) */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * The revoke descriptor: used on disk to describe a series of blocks to
 | 
					 * The revoke descriptor: used on disk to describe a series of blocks to
 | 
				
			||||||
 * be revoked from the log
 | 
					 * be revoked from the log
 | 
				
			||||||
| 
						 | 
					@ -192,6 +210,10 @@ typedef struct jbd2_journal_revoke_header_s
 | 
				
			||||||
	__be32		 r_count;	/* Count of bytes used in the block */
 | 
						__be32		 r_count;	/* Count of bytes used in the block */
 | 
				
			||||||
} jbd2_journal_revoke_header_t;
 | 
					} jbd2_journal_revoke_header_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Tail of revoke block, for checksumming */
 | 
				
			||||||
 | 
					struct jbd2_journal_revoke_tail {
 | 
				
			||||||
 | 
						__be32		r_checksum;	/* crc32c(uuid+revoke_block) */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Definitions for the journal tag flags word: */
 | 
					/* Definitions for the journal tag flags word: */
 | 
				
			||||||
#define JBD2_FLAG_ESCAPE		1	/* on-disk block is escaped */
 | 
					#define JBD2_FLAG_ESCAPE		1	/* on-disk block is escaped */
 | 
				
			||||||
| 
						 | 
					@ -241,7 +263,10 @@ typedef struct journal_superblock_s
 | 
				
			||||||
	__be32	s_max_trans_data;	/* Limit of data blocks per trans. */
 | 
						__be32	s_max_trans_data;	/* Limit of data blocks per trans. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* 0x0050 */
 | 
					/* 0x0050 */
 | 
				
			||||||
	__u32	s_padding[44];
 | 
						__u8	s_checksum_type;	/* checksum type */
 | 
				
			||||||
 | 
						__u8	s_padding2[3];
 | 
				
			||||||
 | 
						__u32	s_padding[42];
 | 
				
			||||||
 | 
						__be32	s_checksum;		/* crc32c(superblock) */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* 0x0100 */
 | 
					/* 0x0100 */
 | 
				
			||||||
	__u8	s_users[16*48];		/* ids of all fs'es sharing the log */
 | 
						__u8	s_users[16*48];		/* ids of all fs'es sharing the log */
 | 
				
			||||||
| 
						 | 
					@ -263,6 +288,7 @@ typedef struct journal_superblock_s
 | 
				
			||||||
#define JBD2_FEATURE_INCOMPAT_REVOKE		0x00000001
 | 
					#define JBD2_FEATURE_INCOMPAT_REVOKE		0x00000001
 | 
				
			||||||
#define JBD2_FEATURE_INCOMPAT_64BIT		0x00000002
 | 
					#define JBD2_FEATURE_INCOMPAT_64BIT		0x00000002
 | 
				
			||||||
#define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT	0x00000004
 | 
					#define JBD2_FEATURE_INCOMPAT_ASYNC_COMMIT	0x00000004
 | 
				
			||||||
 | 
					#define JBD2_FEATURE_INCOMPAT_CSUM_V2		0x00000008
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Features known to this kernel version: */
 | 
					/* Features known to this kernel version: */
 | 
				
			||||||
#define JBD2_KNOWN_COMPAT_FEATURES	JBD2_FEATURE_COMPAT_CHECKSUM
 | 
					#define JBD2_KNOWN_COMPAT_FEATURES	JBD2_FEATURE_COMPAT_CHECKSUM
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue