[PATCH 0/2] nvmet: add namespace-level debugfs for reservation state
Daniel Wagner
dwagner at suse.de
Mon Jul 6 00:59:31 PDT 2026
On Mon, Jul 06, 2026 at 11:10:41AM +0800, Guixin Liu wrote:
> > > > Example output with two registered hosts and an active holder:
> > > >
> > > > $ cat /sys/kernel/debug/nvmet/testnqn/ns1/reservation
> > > > enable : 1
> > > > generation : 2
> > > > notify_mask : 0x0
> > > > rtype : write_exclusive
> > > > holder : hostid=11111111-1111-1111-1111-111111111111, rkey=0x1111
> > > > registrants:
> > > > hostid=11111111-1111-1111-1111-111111111111, rkey=0x1111
> > > > hostid=22222222-2222-2222-2222-222222222222, rkey=0x2222
> > > I expect blktests will make use of this interface eventually. The parser
> > > for this wont be dead simple, sure doable but not simple. If you see a
> > > way to make a bit simpler I wouldn't mind.
> > How about this:
> >
> > 1. One holer, multi registrants:
> > enable=1
> > generation=2
> > notify_mask=0x0
> > rtype=write_exclusive
> > holder=11111111-1111-1111-1111-111111111111,0x1111
> > reg=11111111-1111-1111-1111-111111111111,0x1111
> > reg=22222222-2222-2222-2222-222222222222,0x2222
> >
> > 2. No holder, multi registrants:
> > enable=1
> > generation=1
> > notify_mask=0x0
> > rtype=none
> > holder=none
> > reg=11111111-1111-1111-1111-111111111111,0x1111
> > reg=22222222-2222-2222-2222-222222222222,0x2222
> >
> > 3. No registrant:
> > enable=1
> > generation=0
> > notify_mask=0x0
> > rtype=none
> > holder=none
> >
> > 4. Reservation not enabled:
> > enable=0
> >
> > Otherwise, the notify_mask can be stringization:
> >
> > notify_mask=reg_preempted,resv_released,resv_preempted
Sorry, missed your previous post. This looks easier to parser (*), but I
think it's up to Shiinchiro to make the call.
Thanks,
Daniel
(*) I asked a LLM to generate one and it looks straight forward.
#!/bin/bash
# Clean plaintext data with email/quote formatting completely removed
DATA=$(cat << 'EOF'
19 enable=1
20 generation=2
21 notify_mask=0x0
22 rtype=write_exclusive
23 holder=11111111-1111-1111-1111-111111111111,0x1111
24 reg=11111111-1111-1111-1111-111111111111,0x1111
25 reg=22222222-2222-2222-2222-222222222222,0x2222
26
27 2. No holder, multi registrants:
28 enable=1
29 generation=1
30 notify_mask=0x0
31 rtype=none
32 holder=none
33 reg=11111111-1111-1111-1111-111111111111,0x1111
34 reg=22222222-2222-2222-2222-222222222222,0x2222
35
36 3. No registrant:
37 enable=1
38 generation=0
39 notify_mask=0x0
40 rtype=none
41 holder=none
42
43 4. Reservation not enabled:
44 enable=0
EOF
)
# Declare an associative array to store parsed data
declare -A INI_DATA
# Tracks the active section namespace
current_section="1. Default"
# Read line-by-line
while IFS= read -r raw_line; do
# Strip leading line numbers (e.g., " 19 ") and trim surrounding spaces
line=$(echo "$raw_line" | sed -E 's/^[[:space:]]*[0-9]+[[:space:]]+//; s/^[[:space:]]+//; s/[[:space:]]+$//')
# Skip empty lines
[[ -z "$line" ]] && continue
# Check if the line is a section header (e.g., "2. No holder, multi registrants:")
if [[ "$line" =~ ^[0-9]+\. ]]; then
current_section="$line"
continue
fi
# Parse Key=Value configurations
if [[ "$line" == *"="* ]]; then
key="${line%%=*}"
val="${line#*=}"
# Build a compound key: "SectionName|||KeyName"
map_key="${current_section}|||${key}"
# If key already exists in this section, append value using a pipe '|' delimiter
if [[ -n "${INI_DATA[$map_key]}" ]]; then
INI_DATA[$map_key]+="|$val"
else
INI_DATA[$map_key]="$val"
fi
fi
done <<< "$DATA"
# --- Demonstrate Accessing the Generated Arrays ---
echo "=== PARSED DATA STRUCTURE ==="
for compound_key in "${!INI_DATA[@]}"; do
section="${compound_key%%|||*}"
key="${compound_key##*|||}"
raw_value="${INI_DATA[$compound_key]}"
echo "[$section]"
# If the value contains our delimiter '|', turn it into a real Bash array
if [[ "$raw_value" == *"|"* ]]; then
IFS='|' read -r -a val_array <<< "$raw_value"
echo " Key '$key' is an ARRAY (${#val_array[@]} elements):"
for i in "${!val_array[@]}"; do
echo " -> index [$i]: ${val_array[$i]}"
done
else
echo " Key '$key' is a STRING:"
echo " -> value: $raw_value"
fi
echo "----------------------------------------"
done
=== PARSED DATA STRUCTURE ===
[3. No registrant:]
Key 'rtype' is a STRING:
-> value: none
----------------------------------------
[3. No registrant:]
Key 'generation' is a STRING:
-> value: 0
----------------------------------------
[1. Default]
Key 'generation' is a STRING:
-> value: 2
----------------------------------------
[2. No holder, multi registrants:]
Key 'holder' is a STRING:
-> value: none
----------------------------------------
[2. No holder, multi registrants:]
Key 'reg' is an ARRAY (2 elements):
-> index [0]: 11111111-1111-1111-1111-111111111111,0x1111
-> index [1]: 22222222-2222-2222-2222-222222222222,0x2222
----------------------------------------
[2. No holder, multi registrants:]
Key 'enable' is a STRING:
-> value: 1
----------------------------------------
[1. Default]
Key 'enable' is a STRING:
-> value: 1
----------------------------------------
[1. Default]
Key 'notify_mask' is a STRING:
-> value: 0x0
----------------------------------------
[2. No holder, multi registrants:]
Key 'generation' is a STRING:
-> value: 1
----------------------------------------
[3. No registrant:]
Key 'notify_mask' is a STRING:
-> value: 0x0
----------------------------------------
[1. Default]
Key 'holder' is a STRING:
-> value: 11111111-1111-1111-1111-111111111111,0x1111
----------------------------------------
[3. No registrant:]
Key 'holder' is a STRING:
-> value: none
----------------------------------------
[2. No holder, multi registrants:]
Key 'rtype' is a STRING:
-> value: none
----------------------------------------
[3. No registrant:]
Key 'enable' is a STRING:
-> value: 1
----------------------------------------
[4. Reservation not enabled:]
Key 'enable' is a STRING:
-> value: 0
----------------------------------------
[1. Default]
Key 'rtype' is a STRING:
-> value: write_exclusive
----------------------------------------
[2. No holder, multi registrants:]
Key 'notify_mask' is a STRING:
-> value: 0x0
----------------------------------------
[1. Default]
Key 'reg' is an ARRAY (2 elements):
-> index [0]: 11111111-1111-1111-1111-111111111111,0x1111
-> index [1]: 22222222-2222-2222-2222-222222222222,0x2222
----------------------------------------
More information about the Linux-nvme
mailing list