장치 전원을 껐다가 켠 후 잘못된 NVMe 장치에 바인드 포인트를 마운트하는 경우

장치 전원을 껐다가 켠 후 잘못된 NVMe 장치에 바인드 포인트를 마운트하는 경우

저는 올플래시 스토리지 애플리케이션을 개발 중입니다. NVMe 장치의 전원을 끄거나 켤 때 마운트 바인딩이 이상한 동작을 하는 것을 발견했습니다. 배포판: SUSE Linux Enterprise Server 15 SP4 5.14.21-150400.24.46-기본값

/dev/nvme10n1p1 파티션을 /mnt/10n1p1에 마운트합니다.

# mount --bind /dev/nvme10n1p1 /mnt/10n1p1
# lsblk /mnt/10n1p1
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
nvme10n1p1 259:11   0  3.6T  0 part

# stat /dev/nvme10n1p1
  File: /dev/nvme10n1p1
  Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 5h/5d   Inode: 23620       Links: 1     Device type: 103,b

# stat /mnt/10n1
  File: /mnt/10n1
  Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 5h/5d   Inode: 23620       Links: 1     Device type: 103,b

핫 플러깅 또는 전력 서지를 시뮬레이션하기 위해 짧은 시간 동안 NVME 장치를 끄거나 켭니다.

# ls -lat /sys/block | grep "nvme10n1"
.../0000:be:00.0/nvme/nvme2/nvme10n1
# lspci -vmms 0000:be:00.0
...PhySlot:        168
# date && echo 0|sudo tee /sys/bus/pci/slots/${PHYSLOT}/power
# sleep 5
# date && echo 1|sudo tee /sys/bus/pci/slots/${PHYSLOT}/power

전원을 껐다 켠 후 방금 전원을 켠 새 드라이브에 바인딩 포인트를 마운트합니다.

# lsblk /mnt/10n1
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
nvme30n2     259:11   0  3.6T  0 disk
└─nvme30n2p1 259:51   0  3.6T  0 part

# stat /dev/nvme30n2
  File: /dev/nvme30n2
  Size: 0               Blocks: 0          IO Block: 4096   block special file
Device: 5h/5d   Inode: 24836       Links: 1     Device type: 103,b

사전 테스트를 마친 후 원래 드라이브의 전원이 꺼진 후 짧은 시간 동안에도 마운트 바인드가 전원이 켜진 다른 드라이브를 가리킬 수 있다는 사실을 발견했습니다.

# mount --bind  /dev/nvme0n1p1 /mnt/0n1
# lsblk 0n1
NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
nvme0n1p1 259:44   0  3.6T  0 part
# nvme id-ctrl /dev/nvme0n1 | grep sn
sn:       : PHLJ043200234P0DGN
# nvme id-ctrl /dev/nvme1n1 | grep sn
sn:       : PHLJ043105AU4P0DGN

# PHYSLOT_0=195
# PHYSLOT_1=194
# date && echo 0|sudo tee /sys/bus/pci/slots/${PHYSLOT_1}/power
# sleep 5
# date && echo 0|sudo tee /sys/bus/pci/slots/${PHYSLOT_0}/power
# sleep 5
# date && echo 1|sudo tee /sys/bus/pci/slots/${PHYSLOT_1}/power
# sleep 5
# date && echo 1|sudo tee /sys/bus/pci/slots/${PHYSLOT_0}/power

# lsblk /mnt/0n1
NAME       MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
nvme31n2p1 259:44   0  3.6T  0 part

# nvme id-ctrl /dev/nvme31n2 | grep sn
sn        : PHLJ043105AU4P0DGN
# nvme id-ctrl /dev/nvme32n2 | grep sn
sn        : PHLJ043200234P0DGN

정전/켜짐 후 마운트 포인트의 inode 번호는 새 드라이브 장치의 inode 번호와 다르지만 마운트 포인트의 inode와 새 드라이브 장치의 inode는 동일한 마이너 번호를 공유하는 것으로 나타났습니다. 이것이 원래 마운트 지점이 새 드라이브 장치에 액세스하여 데이터 손상을 일으킬 수 있는 이유라고 생각합니다. 내 생각엔 마운트 지점이 전원이 꺼진 드라이브의 인덱스에 대한 참조를 유지했기 때문에 인덱스 노드가 삭제되지 않은 것 같습니다. 그런 다음 새 드라이브의 전원이 켜지고 원래 드라이브와 동일한 재활용 마이너 번호를 얻습니다. 이 동작이 예상되는지 또는 바인딩 설치의 제한 사항이나 버그인지 확실하지 않습니다.

답변1

이는 Linux 커널 bdev수명주기 버그이며 버전 5.15에서 수정되었습니다.

관련 패치 링크여기.

관련 정보