Shared storage has a property no local disk has: it can vanish
while the host is otherwise perfectly healthy. The CPU is idle,
memory is fine, the network is up, and every process that
touched the array is in D state where no signal reaches it.
It also has a property that makes the incident harder than it
needs to be. The obvious diagnostics hang. df hangs. ls on
the mount point hangs. Tab-completing a path in your own shell
hangs, and now you have lost the session you were investigating
from. Knowing which commands are safe is not a detail here; it
is the first skill.
Four shapes, and they need different responses
Shape
Host symptom
Storage still there?
Fix
Path loss, paths remaining
Nothing visible
Yes
Restore the path; no filesystem work
All paths lost
D-state processes, or sudden I/O errors
No
Restore paths, then check the filesystem
Filesystem shut down
EIO on everything, mount still listed
Yes
Unmount and remount; paths are not the problem
NFS server gone
D state, df hangs, no EIO ever
No
Restore the server; do not force-unmount
The middle two are the ones people confuse, and confusing them
wastes the outage: hunting for a fabric problem when the fabric
is fine and the filesystem shut itself down, or remounting a
filesystem while the paths are still flapping.
Diagnostics that do not hang
The rule is simple. Anything that calls statfs() or stat()
on the affected mount will block. Anything that reads
/proc/self/mountinfo, /sys or /proc/<pid> will not.
Read-only / Safemount table without touching the filesystems— findmnt reads /proc/self/mountinfo, which the kernel maintains in memory. It never issues I/O to the filesystems it lists, so it returns instantly even when every one of them is unreachable. df is the opposite: it statfs()s each mount to get free space, and statfs on an unreachable NFS mount blocks in the same uninterruptible way an application does.
If you must use df, scope it to one filesystem you know is
healthy (df -h /) or exclude the suspect types
(df -h -x nfs -x nfs4 -x cifs). Running bare df during a
filer outage is how the second engineer loses their session too.
Read-only / Safewho is blocked, and in what— D is uninterruptible sleep - the process is inside a kernel call that will not return and cannot be signalled. The WCHAN is the diagnosis: io_schedule means blocked on block-device I/O, so a SAN or iSCSI path. rpc_wait_bit_killable means blocked in the NFS client waiting for an RPC reply, so a filer. Two different incidents, told apart by one column.
S PID PPID WCHAN COMMAND
D 2841 2837 io_schedule postgres
D 2903 2837 io_schedule postgres
D 4117 1 rpc_wait_bit_killable rsync
Illustrative output
For the block-device case, walk from the process to the device:
# what the process was doing, from the kernel side (needs root)sudo cat /proc/2841/stack# what files it has open, without touching themsudo ls -l /proc/2841/fd# the SCSI device state for every path: running, offline or blockedgrep . /sys/block/sd*/device/state# iSCSI session state, if this is iSCSIgrep . /sys/class/iscsi_session/session*/state
/sys/block/sdb/device/state is the fastest single answer for a
SAN incident. running is healthy; offline means the SCSI
layer gave up on the device; blocked means the transport layer
has it quarantined while it waits for the fabric.
Shape 1 and 2: paths
Read-only / Safedegraded, not down— Two of four paths are failed faulty. I/O is continuing over the surviving group and no application has noticed anything. This is shape 1: nothing is broken today, and the host is now one HBA away from shape 2. It is invisible to any monitoring that checks whether the filesystem is mounted, because it is mounted and it works.
When the last path goes, the behaviour is whatever
no_path_retry was set to - queue forever and hang, or fail and
return EIO. That choice, and why a finite retry count is
usually right, is covered in the multipath lesson; what matters
here is recognising which one you are looking at.
Read-only / Safethe kernel timeline— Read it as a sequence. Paths fail at 03:14. The hung-task detector fires at 03:16 because kernel.hung_task_timeout_secs is 120 by default - that message is a report that something has been stuck for two minutes, not a new event. The I/O error on dm-3 arrives once the retry budget is exhausted. The two-minute gap between the path failure and the first hung-task warning is why the monitoring alert and the user complaint arrive out of order.
$ sudo dmesg -T | grep -E 'blocked for more than|rejecting I/O|Device offlined|failing path|I/O error, dev'
[Tue Aug 11 03:14:22 2026] device-mapper: multipath: 253:3: Failing path 8:16.
[Tue Aug 11 03:14:22 2026] device-mapper: multipath: 253:3: Failing path 8:48.
[Tue Aug 11 03:16:29 2026] INFO: task postgres:2841 blocked for more than 120 seconds.
[Tue Aug 11 03:16:29 2026] blk_update_request: I/O error, dev dm-3, sector 4194304 op 0x1:(WRITE)
Illustrative output
Shape 3: the filesystem shut itself down
This one is different in kind. The LUN is present, every path is
active ready running, and the filesystem still returns errors
for everything. XFS detected a metadata inconsistency or an
unrecoverable write error and shut itself down deliberately.
XFS (dm-3): metadata I/O error in "xfs_buf_iodone_callback_error" at daddr 0x400 len 8 error 5XFS (dm-3): Log I/O Error Detected. Shutting down filesystemXFS (dm-3): Please unmount the filesystem and rectify the problem(s)
ext4’s equivalent is quieter and is the reason
errors=remount-ro exists:
A hard NFS mount never returns an error. That is the contract:
retry until the server comes back, so that an application which
does not check its write return codes cannot silently lose data.
The cost is that every process touching the mount goes into D
state and stays there.
Read-only / Safeconfirm hard versus soft— The effective options come from the kernel, not from fstab - somebody may have remounted with different ones. hard here means the D-state processes will never receive an error and will resume when the server returns. /proc/self/mountstats is safe to read and carries per-operation RPC counters and retransmission counts, which distinguish 'server is down' from 'server is slow'.
Identify the shape before touching anything. findmnt for the mounts, ps for D-state processes and their WCHAN, dmesg -T for the timeline, multipath -ll for the paths. All read-only, none of them hang.
Restore the transport. Fabric, switch, NIC, iSCSI session, filer. Nothing above this layer can be fixed while it is broken.
Wait for the paths to be stable, not merely present. Several minutes of every path active ready running, confirmed twice.
Only then address the filesystem. A shut-down XFS or a read-only ext4 needs an unmount and remount; a healthy filesystem that was merely queueing needs nothing at all.
Verify the data, not the mount. Application-level checks - row counts, checksums, a read of the most recently written file - because an I/O error that reached the application may have left a partial write behind.
Write down the path-count alert you did not have. Every one of these incidents was visible as a degraded path days earlier.
Knowledge check
Knowledge check · 4 questions
Q1. A host has processes in D state. multipath -ll shows all four paths active ready running, and dmesg contains "XFS (dm-3): Log I/O Error Detected. Shutting down filesystem". What is the correct next step?
Q2. Which commands are safe to run on a host whose NFS server has disappeared, without blocking your own shell? Select all that apply.
Q3. A lazy unmount (umount -l) removes a hung mount from df and findmnt while the processes blocked in it stay in D state.
Q4. A monitoring check confirms /srv/data is mounted and writable. It has passed continuously for three weeks. What class of failure is it structurally unable to see?
Passing score: 75%. Answers are checked in this browser.