1.. SPDX-License-Identifier: GPL-2.0 2 3Multiple Mount Protection 4------------------------- 5 6Multiple mount protection (MMP) is a feature that protects the 7filesystem against multiple hosts trying to use the filesystem 8simultaneously. When a filesystem is opened (for mounting, or fsck, 9etc.), the MMP code running on the node (call it node A) checks a 10sequence number. If the sequence number is EXT4_MMP_SEQ_CLEAN, the 11open continues. If the sequence number is EXT4_MMP_SEQ_FSCK, then 12fsck is (hopefully) running, and open fails immediately. Otherwise, the 13open code will wait for twice the specified MMP check interval and check 14the sequence number again. If the sequence number has changed, then the 15filesystem is active on another machine and the open fails. If the MMP 16code passes all of those checks, a new MMP sequence number is generated 17and written to the MMP block, and the mount proceeds. 18 19While the filesystem is live, the kernel sets up a timer to re-check the 20MMP block at the specified MMP check interval. To perform the re-check, 21the MMP sequence number is re-read; if it does not match the in-memory 22MMP sequence number, then another node (node B) has mounted the 23filesystem, and node A remounts the filesystem read-only. If the 24sequence numbers match, the sequence number is incremented both in 25memory and on disk, and the re-check is complete. 26 27The hostname and device filename are written into the MMP block whenever 28an open operation succeeds. The MMP code does not use these values; they 29are provided purely for informational purposes. 30 31The checksum is calculated against the FS UUID and the MMP structure. 32The MMP structure (``struct mmp_struct``) is as follows: 33 34.. list-table:: 35 :widths: 8 12 20 40 36 :header-rows: 1 37 38 * - Offset 39 - Type 40 - Name 41 - Description 42 * - 0x0 43 - __le32 44 - mmp_magic 45 - Magic number for MMP, 0x004D4D50 (“MMP”). 46 * - 0x4 47 - __le32 48 - mmp_seq 49 - Sequence number, updated periodically. 50 * - 0x8 51 - __le64 52 - mmp_time 53 - Time that the MMP block was last updated. 54 * - 0x10 55 - char[64] 56 - mmp_nodename 57 - Hostname of the node that opened the filesystem. 58 * - 0x50 59 - char[32] 60 - mmp_bdevname 61 - Block device name of the filesystem. 62 * - 0x70 63 - __le16 64 - mmp_check_interval 65 - The MMP re-check interval, in seconds. 66 * - 0x72 67 - __le16 68 - mmp_pad1 69 - Zero. 70 * - 0x74 71 - __le32[226] 72 - mmp_pad2 73 - Zero. 74 * - 0x3FC 75 - __le32 76 - mmp_checksum 77 - Checksum of the MMP block. 78