ext4: fix metadata checksum calculation for the superblock
authorTheodore Ts'o <tytso@mit.edu>
Wed, 10 Oct 2012 05:06:58 +0000 (01:06 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 26 Nov 2012 20:14:31 +0000 (12:14 -0800)
commit19dfc178ae0ed43e3cc8407f7876497a3ee5ba95
treeb9e3c1a3e3a70eabaeb528b3456c30e38f26d773
parent03faff7a2288f69b0a2218f1cd0e0d81e31e6509
ext4: fix metadata checksum calculation for the superblock

commit 06db49e68ae70cf16819b85a14057acb2820776a upstream.

The function ext4_handle_dirty_super() was calculating the superblock
on the wrong block data.  As a result, when the superblock is modified
while it is mounted (most commonly, when inodes are added or removed
from the orphan list), the superblock checksum would be wrong.  We
didn't notice because the superblock *was* being correctly calculated
in ext4_commit_super(), and this would get called when the file system
was unmounted.  So the problem only became obvious if the system
crashed while the file system was mounted.

Fix this by removing the poorly designed function signature for
ext4_superblock_csum_set(); if it only took a single argument, the
pointer to a struct superblock, the ambiguity which caused this
mistake would have been impossible.

Reported-by: George Spelvin <linux@horizon.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Tested-by: George Spelvin <linux@horizon.com>
fs/ext4/ext4.h
fs/ext4/ext4_jbd2.c
fs/ext4/resize.c
fs/ext4/super.c