2 #include <linux/random.h>
4 #include <linux/utsname.h>
12 struct ext4_sb_info *sbi =
EXT4_SB(sb);
16 csum = ext4_chksum(sbi, sbi->s_csum_seed, (
char *)mmp, offset);
27 return mmp->mmp_checksum == ext4_mmp_csum(sb, mmp);
36 mmp->mmp_checksum = ext4_mmp_csum(sb, mmp);
43 static int write_mmp_block(
struct super_block *
sb,
struct buffer_head *bh)
45 struct mmp_struct *mmp = (
struct mmp_struct *)(bh->b_data);
70 static int read_mmp_block(
struct super_block *sb,
struct buffer_head **bh,
73 struct mmp_struct *mmp;
76 clear_buffer_uptodate(*bh);
82 *bh = sb_getblk(sb, mmp_block);
89 if (!buffer_uptodate(*bh)) {
95 ext4_warning(sb,
"Error while reading MMP block %llu",
100 mmp = (
struct mmp_struct *)((*bh)->b_data);
101 if (
le32_to_cpu(mmp->mmp_magic) != EXT4_MMP_MAGIC ||
112 const char *
function,
unsigned int line,
const char *
msg)
116 "MMP failure info: last update time: %llu, last update "
117 "node: %s, last update device: %s\n",
118 (
long long unsigned int)
le64_to_cpu(mmp->mmp_time),
119 mmp->mmp_nodename, mmp->mmp_bdevname);
125 static int kmmpd(
void *
data)
127 struct super_block *sb = ((
struct mmpd_data *) data)->sb;
128 struct buffer_head *bh = ((
struct mmpd_data *) data)->bh;
130 struct mmp_struct *mmp;
133 unsigned long failed_writes = 0;
135 unsigned mmp_check_interval;
136 unsigned long last_update_time;
141 mmp = (
struct mmp_struct *)(bh->b_data);
147 mmp_check_interval =
max(EXT4_MMP_CHECK_MULT * mmp_update_interval,
148 EXT4_MMP_MIN_CHECK_INTERVAL);
149 mmp->mmp_check_interval =
cpu_to_le16(mmp_check_interval);
150 bdevname(bh->b_bdev, mmp->mmp_bdevname);
152 memcpy(mmp->mmp_nodename, init_utsname()->nodename,
153 sizeof(mmp->mmp_nodename));
156 if (++seq > EXT4_MMP_SEQ_MAX)
163 retval = write_mmp_block(sb, bh);
169 if ((failed_writes % 60) == 0)
170 ext4_error(sb,
"Error writing to MMP block");
176 ext4_warning(sb,
"kmmpd being stopped since MMP feature"
177 " has been disabled.");
183 ext4_warning(sb,
"kmmpd being stopped since filesystem "
184 "has been remounted as readonly.");
189 diff =
jiffies - last_update_time;
190 if (diff < mmp_update_interval *
HZ)
199 diff =
jiffies - last_update_time;
200 if (diff > mmp_check_interval * HZ) {
201 struct buffer_head *bh_check =
NULL;
202 struct mmp_struct *mmp_check;
204 retval = read_mmp_block(sb, &bh_check, mmp_block);
206 ext4_error(sb,
"error reading MMP data: %d",
213 mmp_check = (
struct mmp_struct *)(bh_check->b_data);
214 if (mmp->mmp_seq != mmp_check->mmp_seq ||
215 memcmp(mmp->mmp_nodename, mmp_check->mmp_nodename,
216 sizeof(mmp->mmp_nodename))) {
217 dump_mmp_msg(sb, mmp_check,
218 "Error while updating MMP info. "
219 "The filesystem seems to have been"
220 " multiply mounted.");
221 ext4_error(sb,
"abort");
231 mmp_check_interval =
max(
min(EXT4_MMP_CHECK_MULT * diff / HZ,
232 EXT4_MMP_MAX_CHECK_INTERVAL),
233 EXT4_MMP_MIN_CHECK_INTERVAL);
234 mmp->mmp_check_interval =
cpu_to_le16(mmp_check_interval);
243 retval = write_mmp_block(sb, bh);
255 static unsigned int mmp_new_seq(
void)
261 }
while (new_seq > EXT4_MMP_SEQ_MAX);
273 struct buffer_head *bh =
NULL;
274 struct mmp_struct *mmp =
NULL;
275 struct mmpd_data *mmpd_data;
282 mmp_block >= ext4_blocks_count(es)) {
283 ext4_warning(sb,
"Invalid MMP block in superblock");
287 retval = read_mmp_block(sb, &bh, mmp_block);
291 mmp = (
struct mmp_struct *)(bh->b_data);
293 if (mmp_check_interval < EXT4_MMP_MIN_CHECK_INTERVAL)
294 mmp_check_interval = EXT4_MMP_MIN_CHECK_INTERVAL;
300 if (
le16_to_cpu(mmp->mmp_check_interval) > mmp_check_interval)
301 mmp_check_interval =
le16_to_cpu(mmp->mmp_check_interval);
304 if (seq == EXT4_MMP_SEQ_CLEAN)
307 if (seq == EXT4_MMP_SEQ_FSCK) {
308 dump_mmp_msg(sb, mmp,
"fsck is running on the filesystem");
312 wait_time =
min(mmp_check_interval * 2 + 1,
313 mmp_check_interval + 60);
316 if (wait_time > EXT4_MMP_MIN_CHECK_INTERVAL * 4)
317 ext4_warning(sb,
"MMP interval %u higher than expected, please"
318 " wait.\n", wait_time * 2);
321 ext4_warning(sb,
"MMP startup interrupted, failing mount\n");
325 retval = read_mmp_block(sb, &bh, mmp_block);
328 mmp = (
struct mmp_struct *)(bh->b_data);
330 dump_mmp_msg(sb, mmp,
331 "Device is already active on another node.");
342 retval = write_mmp_block(sb, bh);
350 ext4_warning(sb,
"MMP startup interrupted, failing mount\n");
354 retval = read_mmp_block(sb, &bh, mmp_block);
357 mmp = (
struct mmp_struct *)(bh->b_data);
359 dump_mmp_msg(sb, mmp,
360 "Device is already active on another node.");
366 ext4_warning(sb,
"not enough memory for mmpd_data");
378 if (IS_ERR(
EXT4_SB(sb)->s_mmp_tsk)) {
381 ext4_warning(sb,
"Unable to create kmmpd thread for %s.",