mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.5 KiB
77 lines
2.5 KiB
.. SPDX-License-Identifier: GPL-2.0 |
|
|
|
Multiple Mount Protection |
|
------------------------- |
|
|
|
Multiple mount protection (MMP) is a feature that protects the |
|
filesystem against multiple hosts trying to use the filesystem |
|
simultaneously. When a filesystem is opened (for mounting, or fsck, |
|
etc.), the MMP code running on the node (call it node A) checks a |
|
sequence number. If the sequence number is EXT4\_MMP\_SEQ\_CLEAN, the |
|
open continues. If the sequence number is EXT4\_MMP\_SEQ\_FSCK, then |
|
fsck is (hopefully) running, and open fails immediately. Otherwise, the |
|
open code will wait for twice the specified MMP check interval and check |
|
the sequence number again. If the sequence number has changed, then the |
|
filesystem is active on another machine and the open fails. If the MMP |
|
code passes all of those checks, a new MMP sequence number is generated |
|
and written to the MMP block, and the mount proceeds. |
|
|
|
While the filesystem is live, the kernel sets up a timer to re-check the |
|
MMP block at the specified MMP check interval. To perform the re-check, |
|
the MMP sequence number is re-read; if it does not match the in-memory |
|
MMP sequence number, then another node (node B) has mounted the |
|
filesystem, and node A remounts the filesystem read-only. If the |
|
sequence numbers match, the sequence number is incremented both in |
|
memory and on disk, and the re-check is complete. |
|
|
|
The hostname and device filename are written into the MMP block whenever |
|
an open operation succeeds. The MMP code does not use these values; they |
|
are provided purely for informational purposes. |
|
|
|
The checksum is calculated against the FS UUID and the MMP structure. |
|
The MMP structure (``struct mmp_struct``) is as follows: |
|
|
|
.. list-table:: |
|
:widths: 8 12 20 40 |
|
:header-rows: 1 |
|
|
|
* - Offset |
|
- Type |
|
- Name |
|
- Description |
|
* - 0x0 |
|
- \_\_le32 |
|
- mmp\_magic |
|
- Magic number for MMP, 0x004D4D50 (“MMP”). |
|
* - 0x4 |
|
- \_\_le32 |
|
- mmp\_seq |
|
- Sequence number, updated periodically. |
|
* - 0x8 |
|
- \_\_le64 |
|
- mmp\_time |
|
- Time that the MMP block was last updated. |
|
* - 0x10 |
|
- char[64] |
|
- mmp\_nodename |
|
- Hostname of the node that opened the filesystem. |
|
* - 0x50 |
|
- char[32] |
|
- mmp\_bdevname |
|
- Block device name of the filesystem. |
|
* - 0x70 |
|
- \_\_le16 |
|
- mmp\_check\_interval |
|
- The MMP re-check interval, in seconds. |
|
* - 0x72 |
|
- \_\_le16 |
|
- mmp\_pad1 |
|
- Zero. |
|
* - 0x74 |
|
- \_\_le32[226] |
|
- mmp\_pad2 |
|
- Zero. |
|
* - 0x3FC |
|
- \_\_le32 |
|
- mmp\_checksum |
|
- Checksum of the MMP block.
|
|
|