162306a36Sopenharmony_ci==========
262306a36Sopenharmony_ciMD Cluster
362306a36Sopenharmony_ci==========
462306a36Sopenharmony_ci
562306a36Sopenharmony_ciThe cluster MD is a shared-device RAID for a cluster, it supports
662306a36Sopenharmony_citwo levels: raid1 and raid10 (limited support).
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci1. On-disk format
1062306a36Sopenharmony_ci=================
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciSeparate write-intent-bitmaps are used for each cluster node.
1362306a36Sopenharmony_ciThe bitmaps record all writes that may have been started on that node,
1462306a36Sopenharmony_ciand may not yet have finished. The on-disk layout is::
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci  0                    4k                     8k                    12k
1762306a36Sopenharmony_ci  -------------------------------------------------------------------
1862306a36Sopenharmony_ci  | idle                | md super            | bm super [0] + bits |
1962306a36Sopenharmony_ci  | bm bits[0, contd]   | bm super[1] + bits  | bm bits[1, contd]   |
2062306a36Sopenharmony_ci  | bm super[2] + bits  | bm bits [2, contd]  | bm super[3] + bits  |
2162306a36Sopenharmony_ci  | bm bits [3, contd]  |                     |                     |
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ciDuring "normal" functioning we assume the filesystem ensures that only
2462306a36Sopenharmony_cione node writes to any given block at a time, so a write request will
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci - set the appropriate bit (if not already set)
2762306a36Sopenharmony_ci - commit the write to all mirrors
2862306a36Sopenharmony_ci - schedule the bit to be cleared after a timeout.
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ciReads are just handled normally. It is up to the filesystem to ensure
3162306a36Sopenharmony_cione node doesn't read from a location where another node (or the same
3262306a36Sopenharmony_cinode) is writing.
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci2. DLM Locks for management
3662306a36Sopenharmony_ci===========================
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciThere are three groups of locks for managing the device:
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci2.1 Bitmap lock resource (bm_lockres)
4162306a36Sopenharmony_ci-------------------------------------
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci The bm_lockres protects individual node bitmaps. They are named in
4462306a36Sopenharmony_ci the form bitmap000 for node 1, bitmap001 for node 2 and so on. When a
4562306a36Sopenharmony_ci node joins the cluster, it acquires the lock in PW mode and it stays
4662306a36Sopenharmony_ci so during the lifetime the node is part of the cluster. The lock
4762306a36Sopenharmony_ci resource number is based on the slot number returned by the DLM
4862306a36Sopenharmony_ci subsystem. Since DLM starts node count from one and bitmap slots
4962306a36Sopenharmony_ci start from zero, one is subtracted from the DLM slot number to arrive
5062306a36Sopenharmony_ci at the bitmap slot number.
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci The LVB of the bitmap lock for a particular node records the range
5362306a36Sopenharmony_ci of sectors that are being re-synced by that node.  No other
5462306a36Sopenharmony_ci node may write to those sectors.  This is used when a new nodes
5562306a36Sopenharmony_ci joins the cluster.
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci2.2 Message passing locks
5862306a36Sopenharmony_ci-------------------------
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci Each node has to communicate with other nodes when starting or ending
6162306a36Sopenharmony_ci resync, and for metadata superblock updates.  This communication is
6262306a36Sopenharmony_ci managed through three locks: "token", "message", and "ack", together
6362306a36Sopenharmony_ci with the Lock Value Block (LVB) of one of the "message" lock.
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci2.3 new-device management
6662306a36Sopenharmony_ci-------------------------
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci A single lock: "no-new-dev" is used to coordinate the addition of
6962306a36Sopenharmony_ci new devices - this must be synchronized across the array.
7062306a36Sopenharmony_ci Normally all nodes hold a concurrent-read lock on this device.
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci3. Communication
7362306a36Sopenharmony_ci================
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci Messages can be broadcast to all nodes, and the sender waits for all
7662306a36Sopenharmony_ci other nodes to acknowledge the message before proceeding.  Only one
7762306a36Sopenharmony_ci message can be processed at a time.
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci3.1 Message Types
8062306a36Sopenharmony_ci-----------------
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci There are six types of messages which are passed:
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci3.1.1 METADATA_UPDATED
8562306a36Sopenharmony_ci^^^^^^^^^^^^^^^^^^^^^^
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci   informs other nodes that the metadata has
8862306a36Sopenharmony_ci   been updated, and the node must re-read the md superblock. This is
8962306a36Sopenharmony_ci   performed synchronously. It is primarily used to signal device
9062306a36Sopenharmony_ci   failure.
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci3.1.2 RESYNCING
9362306a36Sopenharmony_ci^^^^^^^^^^^^^^^
9462306a36Sopenharmony_ci   informs other nodes that a resync is initiated or
9562306a36Sopenharmony_ci   ended so that each node may suspend or resume the region.  Each
9662306a36Sopenharmony_ci   RESYNCING message identifies a range of the devices that the
9762306a36Sopenharmony_ci   sending node is about to resync. This overrides any previous
9862306a36Sopenharmony_ci   notification from that node: only one ranged can be resynced at a
9962306a36Sopenharmony_ci   time per-node.
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci3.1.3 NEWDISK
10262306a36Sopenharmony_ci^^^^^^^^^^^^^
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci   informs other nodes that a device is being added to
10562306a36Sopenharmony_ci   the array. Message contains an identifier for that device.  See
10662306a36Sopenharmony_ci   below for further details.
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci3.1.4 REMOVE
10962306a36Sopenharmony_ci^^^^^^^^^^^^
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci   A failed or spare device is being removed from the
11262306a36Sopenharmony_ci   array. The slot-number of the device is included in the message.
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci 3.1.5 RE_ADD:
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ci   A failed device is being re-activated - the assumption
11762306a36Sopenharmony_ci   is that it has been determined to be working again.
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci 3.1.6 BITMAP_NEEDS_SYNC:
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci   If a node is stopped locally but the bitmap
12262306a36Sopenharmony_ci   isn't clean, then another node is informed to take the ownership of
12362306a36Sopenharmony_ci   resync.
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci3.2 Communication mechanism
12662306a36Sopenharmony_ci---------------------------
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci The DLM LVB is used to communicate within nodes of the cluster. There
12962306a36Sopenharmony_ci are three resources used for the purpose:
13062306a36Sopenharmony_ci
13162306a36Sopenharmony_ci3.2.1 token
13262306a36Sopenharmony_ci^^^^^^^^^^^
13362306a36Sopenharmony_ci   The resource which protects the entire communication
13462306a36Sopenharmony_ci   system. The node having the token resource is allowed to
13562306a36Sopenharmony_ci   communicate.
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci3.2.2 message
13862306a36Sopenharmony_ci^^^^^^^^^^^^^
13962306a36Sopenharmony_ci   The lock resource which carries the data to communicate.
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci3.2.3 ack
14262306a36Sopenharmony_ci^^^^^^^^^
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci   The resource, acquiring which means the message has been
14562306a36Sopenharmony_ci   acknowledged by all nodes in the cluster. The BAST of the resource
14662306a36Sopenharmony_ci   is used to inform the receiving node that a node wants to
14762306a36Sopenharmony_ci   communicate.
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ciThe algorithm is:
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_ci 1. receive status - all nodes have concurrent-reader lock on "ack"::
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	sender                         receiver                 receiver
15462306a36Sopenharmony_ci	"ack":CR                       "ack":CR                 "ack":CR
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci 2. sender get EX on "token",
15762306a36Sopenharmony_ci    sender get EX on "message"::
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	sender                        receiver                 receiver
16062306a36Sopenharmony_ci	"token":EX                    "ack":CR                 "ack":CR
16162306a36Sopenharmony_ci	"message":EX
16262306a36Sopenharmony_ci	"ack":CR
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci    Sender checks that it still needs to send a message. Messages
16562306a36Sopenharmony_ci    received or other events that happened while waiting for the
16662306a36Sopenharmony_ci    "token" may have made this message inappropriate or redundant.
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci 3. sender writes LVB
16962306a36Sopenharmony_ci
17062306a36Sopenharmony_ci    sender down-convert "message" from EX to CW
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_ci    sender try to get EX of "ack"
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_ci    ::
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci      [ wait until all receivers have *processed* the "message" ]
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_ci                                       [ triggered by bast of "ack" ]
17962306a36Sopenharmony_ci                                       receiver get CR on "message"
18062306a36Sopenharmony_ci                                       receiver read LVB
18162306a36Sopenharmony_ci                                       receiver processes the message
18262306a36Sopenharmony_ci                                       [ wait finish ]
18362306a36Sopenharmony_ci                                       receiver releases "ack"
18462306a36Sopenharmony_ci                                       receiver tries to get PR on "message"
18562306a36Sopenharmony_ci
18662306a36Sopenharmony_ci     sender                         receiver                  receiver
18762306a36Sopenharmony_ci     "token":EX                     "message":CR              "message":CR
18862306a36Sopenharmony_ci     "message":CW
18962306a36Sopenharmony_ci     "ack":EX
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci 4. triggered by grant of EX on "ack" (indicating all receivers
19262306a36Sopenharmony_ci    have processed message)
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci    sender down-converts "ack" from EX to CR
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ci    sender releases "message"
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci    sender releases "token"
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci    ::
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_ci                                 receiver upconvert to PR on "message"
20362306a36Sopenharmony_ci                                 receiver get CR of "ack"
20462306a36Sopenharmony_ci                                 receiver release "message"
20562306a36Sopenharmony_ci
20662306a36Sopenharmony_ci     sender                      receiver                   receiver
20762306a36Sopenharmony_ci     "ack":CR                    "ack":CR                   "ack":CR
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci4. Handling Failures
21162306a36Sopenharmony_ci====================
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci4.1 Node Failure
21462306a36Sopenharmony_ci----------------
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci When a node fails, the DLM informs the cluster with the slot
21762306a36Sopenharmony_ci number. The node starts a cluster recovery thread. The cluster
21862306a36Sopenharmony_ci recovery thread:
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci	- acquires the bitmap<number> lock of the failed node
22162306a36Sopenharmony_ci	- opens the bitmap
22262306a36Sopenharmony_ci	- reads the bitmap of the failed node
22362306a36Sopenharmony_ci	- copies the set bitmap to local node
22462306a36Sopenharmony_ci	- cleans the bitmap of the failed node
22562306a36Sopenharmony_ci	- releases bitmap<number> lock of the failed node
22662306a36Sopenharmony_ci	- initiates resync of the bitmap on the current node
22762306a36Sopenharmony_ci	  md_check_recovery is invoked within recover_bitmaps,
22862306a36Sopenharmony_ci	  then md_check_recovery -> metadata_update_start/finish,
22962306a36Sopenharmony_ci	  it will lock the communication by lock_comm.
23062306a36Sopenharmony_ci	  Which means when one node is resyncing it blocks all
23162306a36Sopenharmony_ci	  other nodes from writing anywhere on the array.
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci The resync process is the regular md resync. However, in a clustered
23462306a36Sopenharmony_ci environment when a resync is performed, it needs to tell other nodes
23562306a36Sopenharmony_ci of the areas which are suspended. Before a resync starts, the node
23662306a36Sopenharmony_ci send out RESYNCING with the (lo,hi) range of the area which needs to
23762306a36Sopenharmony_ci be suspended. Each node maintains a suspend_list, which contains the
23862306a36Sopenharmony_ci list of ranges which are currently suspended. On receiving RESYNCING,
23962306a36Sopenharmony_ci the node adds the range to the suspend_list. Similarly, when the node
24062306a36Sopenharmony_ci performing resync finishes, it sends RESYNCING with an empty range to
24162306a36Sopenharmony_ci other nodes and other nodes remove the corresponding entry from the
24262306a36Sopenharmony_ci suspend_list.
24362306a36Sopenharmony_ci
24462306a36Sopenharmony_ci A helper function, ->area_resyncing() can be used to check if a
24562306a36Sopenharmony_ci particular I/O range should be suspended or not.
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci4.2 Device Failure
24862306a36Sopenharmony_ci==================
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci Device failures are handled and communicated with the metadata update
25162306a36Sopenharmony_ci routine.  When a node detects a device failure it does not allow
25262306a36Sopenharmony_ci any further writes to that device until the failure has been
25362306a36Sopenharmony_ci acknowledged by all other nodes.
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci5. Adding a new Device
25662306a36Sopenharmony_ci----------------------
25762306a36Sopenharmony_ci
25862306a36Sopenharmony_ci For adding a new device, it is necessary that all nodes "see" the new
25962306a36Sopenharmony_ci device to be added. For this, the following algorithm is used:
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci   1.  Node 1 issues mdadm --manage /dev/mdX --add /dev/sdYY which issues
26262306a36Sopenharmony_ci       ioctl(ADD_NEW_DISK with disc.state set to MD_DISK_CLUSTER_ADD)
26362306a36Sopenharmony_ci   2.  Node 1 sends a NEWDISK message with uuid and slot number
26462306a36Sopenharmony_ci   3.  Other nodes issue kobject_uevent_env with uuid and slot number
26562306a36Sopenharmony_ci       (Steps 4,5 could be a udev rule)
26662306a36Sopenharmony_ci   4.  In userspace, the node searches for the disk, perhaps
26762306a36Sopenharmony_ci       using blkid -t SUB_UUID=""
26862306a36Sopenharmony_ci   5.  Other nodes issue either of the following depending on whether
26962306a36Sopenharmony_ci       the disk was found:
27062306a36Sopenharmony_ci       ioctl(ADD_NEW_DISK with disc.state set to MD_DISK_CANDIDATE and
27162306a36Sopenharmony_ci       disc.number set to slot number)
27262306a36Sopenharmony_ci       ioctl(CLUSTERED_DISK_NACK)
27362306a36Sopenharmony_ci   6.  Other nodes drop lock on "no-new-devs" (CR) if device is found
27462306a36Sopenharmony_ci   7.  Node 1 attempts EX lock on "no-new-dev"
27562306a36Sopenharmony_ci   8.  If node 1 gets the lock, it sends METADATA_UPDATED after
27662306a36Sopenharmony_ci       unmarking the disk as SpareLocal
27762306a36Sopenharmony_ci   9.  If not (get "no-new-dev" lock), it fails the operation and sends
27862306a36Sopenharmony_ci       METADATA_UPDATED.
27962306a36Sopenharmony_ci   10. Other nodes get the information whether a disk is added or not
28062306a36Sopenharmony_ci       by the following METADATA_UPDATED.
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci6. Module interface
28362306a36Sopenharmony_ci===================
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci There are 17 call-backs which the md core can make to the cluster
28662306a36Sopenharmony_ci module.  Understanding these can give a good overview of the whole
28762306a36Sopenharmony_ci process.
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci6.1 join(nodes) and leave()
29062306a36Sopenharmony_ci---------------------------
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci These are called when an array is started with a clustered bitmap,
29362306a36Sopenharmony_ci and when the array is stopped.  join() ensures the cluster is
29462306a36Sopenharmony_ci available and initializes the various resources.
29562306a36Sopenharmony_ci Only the first 'nodes' nodes in the cluster can use the array.
29662306a36Sopenharmony_ci
29762306a36Sopenharmony_ci6.2 slot_number()
29862306a36Sopenharmony_ci-----------------
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci Reports the slot number advised by the cluster infrastructure.
30162306a36Sopenharmony_ci Range is from 0 to nodes-1.
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci6.3 resync_info_update()
30462306a36Sopenharmony_ci------------------------
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci This updates the resync range that is stored in the bitmap lock.
30762306a36Sopenharmony_ci The starting point is updated as the resync progresses.  The
30862306a36Sopenharmony_ci end point is always the end of the array.
30962306a36Sopenharmony_ci It does *not* send a RESYNCING message.
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci6.4 resync_start(), resync_finish()
31262306a36Sopenharmony_ci-----------------------------------
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ci These are called when resync/recovery/reshape starts or stops.
31562306a36Sopenharmony_ci They update the resyncing range in the bitmap lock and also
31662306a36Sopenharmony_ci send a RESYNCING message.  resync_start reports the whole
31762306a36Sopenharmony_ci array as resyncing, resync_finish reports none of it.
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci resync_finish() also sends a BITMAP_NEEDS_SYNC message which
32062306a36Sopenharmony_ci allows some other node to take over.
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_ci6.5 metadata_update_start(), metadata_update_finish(), metadata_update_cancel()
32362306a36Sopenharmony_ci-------------------------------------------------------------------------------
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci metadata_update_start is used to get exclusive access to
32662306a36Sopenharmony_ci the metadata.  If a change is still needed once that access is
32762306a36Sopenharmony_ci gained, metadata_update_finish() will send a METADATA_UPDATE
32862306a36Sopenharmony_ci message to all other nodes, otherwise metadata_update_cancel()
32962306a36Sopenharmony_ci can be used to release the lock.
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci6.6 area_resyncing()
33262306a36Sopenharmony_ci--------------------
33362306a36Sopenharmony_ci
33462306a36Sopenharmony_ci This combines two elements of functionality.
33562306a36Sopenharmony_ci
33662306a36Sopenharmony_ci Firstly, it will check if any node is currently resyncing
33762306a36Sopenharmony_ci anything in a given range of sectors.  If any resync is found,
33862306a36Sopenharmony_ci then the caller will avoid writing or read-balancing in that
33962306a36Sopenharmony_ci range.
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci Secondly, while node recovery is happening it reports that
34262306a36Sopenharmony_ci all areas are resyncing for READ requests.  This avoids races
34362306a36Sopenharmony_ci between the cluster-filesystem and the cluster-RAID handling
34462306a36Sopenharmony_ci a node failure.
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci6.7 add_new_disk_start(), add_new_disk_finish(), new_disk_ack()
34762306a36Sopenharmony_ci---------------------------------------------------------------
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci These are used to manage the new-disk protocol described above.
35062306a36Sopenharmony_ci When a new device is added, add_new_disk_start() is called before
35162306a36Sopenharmony_ci it is bound to the array and, if that succeeds, add_new_disk_finish()
35262306a36Sopenharmony_ci is called the device is fully added.
35362306a36Sopenharmony_ci
35462306a36Sopenharmony_ci When a device is added in acknowledgement to a previous
35562306a36Sopenharmony_ci request, or when the device is declared "unavailable",
35662306a36Sopenharmony_ci new_disk_ack() is called.
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci6.8 remove_disk()
35962306a36Sopenharmony_ci-----------------
36062306a36Sopenharmony_ci
36162306a36Sopenharmony_ci This is called when a spare or failed device is removed from
36262306a36Sopenharmony_ci the array.  It causes a REMOVE message to be send to other nodes.
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci6.9 gather_bitmaps()
36562306a36Sopenharmony_ci--------------------
36662306a36Sopenharmony_ci
36762306a36Sopenharmony_ci This sends a RE_ADD message to all other nodes and then
36862306a36Sopenharmony_ci gathers bitmap information from all bitmaps.  This combined
36962306a36Sopenharmony_ci bitmap is then used to recovery the re-added device.
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci6.10 lock_all_bitmaps() and unlock_all_bitmaps()
37262306a36Sopenharmony_ci------------------------------------------------
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci These are called when change bitmap to none. If a node plans
37562306a36Sopenharmony_ci to clear the cluster raid's bitmap, it need to make sure no other
37662306a36Sopenharmony_ci nodes are using the raid which is achieved by lock all bitmap
37762306a36Sopenharmony_ci locks within the cluster, and also those locks are unlocked
37862306a36Sopenharmony_ci accordingly.
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci7. Unsupported features
38162306a36Sopenharmony_ci=======================
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_ciThere are somethings which are not supported by cluster MD yet.
38462306a36Sopenharmony_ci
38562306a36Sopenharmony_ci- change array_sectors.
386