All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] v1 - Add exclusive locking option to block-iscsi
@ 2016-05-05  2:32 Steven Haigh
  2016-05-05  5:52 ` [PATCH] v2 " Steven Haigh
  0 siblings, 1 reply; 10+ messages in thread
From: Steven Haigh @ 2016-05-05  2:32 UTC (permalink / raw)
  To: xen-devel; +Cc: Roger Pau Monné

[-- Attachment #1: Type: text/plain, Size: 1386 bytes --]

Overview

If you're using iSCSI, you can mount a target by multiple Dom0 machines 
on the same target. For non-cluster aware filesystems, this can lead to 
disk corruption and general bad times by all. The iSCSI protocol allows 
the use of persistent reservations as per the SCSI disk spec. Low level 
SCSI commands for locking are handled by the sg_persist program (bundled 
with sg3_utils package in EL).

The aim of this patch is to create a 'locktarget=y' option specified 
within the disk 'target' command for iSCSI to lock the target in 
exclusive mode on VM start with a key generated from the local systems 
IP, and release this lock on the shutdown of the DomU.

Example Config:
disk            = 
['script=block-iscsi,vdev=xvda,target=iqn=iqn.1986-03.com.sun:02:mytarget,portal=iscsi.example.com,locktarget=y']

In writing this, I have also re-factored parts of the script to put some 
things in what I believe to be a better place to make expansion easier. 
This is mainly in removing functions that purely call other functions 
with no actual code execution.

Signed-off-by: Steven Haigh <netwiz@crc.id.au>

(on a side note, first time I've submitted a patch to the list and I'm 
currently stuck on a webmail client, so apologies in advance if this all 
goes wrong ;)

-- 
Steven Haigh

Email: netwiz@crc.id.au
Web: https://www.crc.id.au
Phone: (03) 9001 6090 - 0412 935 897

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: block-iscsi-locking-v1.patch --]
[-- Type: text/x-diff; name=block-iscsi-locking-v1.patch, Size: 4324 bytes --]

--- block-iscsi 2016-02-10 01:44:19.000000000 +1100
+++ block-iscsi-lock    2016-05-05 12:30:24.831903983 +1000
@@ -31,33 +31,37 @@
     echo $1 | sed "s/^\("$2"\)//"
 }
 
-check_tools()
-{
-    if ! command -v iscsiadm > /dev/null 2>&1; then
-        fatal "Unable to find iscsiadm tool"
-    fi
-    if [ "$multipath" = "y" ] && ! command -v multipath > /dev/null 2>&1; then
-        fatal "Unable to find multipath"
-    fi
-}
-
 # Sets the following global variables based on the params field passed in as
 # a parameter: iqn, portal, auth_method, user, multipath, password
 parse_target()
 {
     # set multipath default value
     multipath="n"
-    for param in $(echo "$1" | tr "," "\n")
-    do
+    for param in $(echo "$1" | tr "," "\n"); do
         case $param in
         iqn=*)
             iqn=$(remove_label $param "iqn=")
+            if ! command -v iscsiadm > /dev/null 2>&1; then
+                fatal "Could not find iscsiadm tool."
+            fi
             ;;
         portal=*)
             portal=$(remove_label $param "portal=")
             ;;
         multipath=*)
             multipath=$(remove_label $param "multipath=")
+            if ! command -v multipath > /dev/null 2>&1; then
+                fatal "Multipath selected, but no multipath tools found"
+            fi
+            ;;
+        locktarget=*)
+            locktarget=$(remove_label $param "locktarget=")
+            if ! command -v sg_persist > /dev/null 2>&1; then
+                fatal "Locking requested but no sg_persist found"
+            fi
+            if ! command -v gethostip > /dev/null 2>&1; then
+                fatal "Locking requested but no gethostip found for key generation"
+            fi
             ;;
         esac
     done
@@ -96,38 +100,29 @@
     fi
 }
 
-# Attaches the target $iqn in $portal and sets $dev to point to the
-# multipath device
-attach()
-{
-    do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --login > /dev/null
-    find_device
-}
-
-# Discovers targets in $portal and checks that $iqn is one of those targets
-# Also sets the auth parameters to attach the device
-prepare()
-{
-    # Check if target is already opened
-    iscsiadm -m session 2>&1 | grep -q "$iqn" && fatal "Device already opened"
-    # Discover portal targets
-    iscsiadm -m discovery -t st -p $portal 2>&1 | grep -q "$iqn" || \
-        fatal "No matching target iqn found"
-}

-# Attaches the device and writes xenstore backend entries to connect
-# the device
-add()
+lock_device()
 {
-    attach
-    write_dev $dev
+    ## Lock the iSCSI target as Exclusive Access.
+    key=$(gethostip -x $(uname -n))
+    if ! sg_persist -d ${dev} -o -G -S ${key} > /dev/null; then
+        unlock_device
+        iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null
+        fatal "iSCSI LOCK: Failed to register with target"
+    fi
+    if ! sg_persist -d ${dev} -o -R -K ${key} -T 6 > /dev/null; then
+        unlock_device
+        iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null
+        fatal "iSCSI LOCK: Failed to set persistent reservation"
+    fi
 }

-# Disconnects the device
-remove()
+unlock_device()
 {
-    find_device
-    do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null
+    ## Unlock the iSCSI target.
+    key=$(gethostip -x $(uname -n))
+    sg_persist -d ${dev} -o -L -K ${key} -T 6 > /dev/null || true
+    sg_persist -d ${dev} -o -G -K ${key} -S 0 > /dev/null || true
 }

 command=$1
@@ -138,14 +133,27 @@

 parse_target "$target"

-check_tools || exit 1
-
 case $command in
 add)
-    prepare
-    add
+    # Check if target is already opened
+    iscsiadm -m session 2>&1 | grep -q "$iqn" && fatal "Device already opened"
+    # Discover portal targets
+    iscsiadm -m discovery -t st -p $portal 2>&1 | grep -q "$iqn" || \
+        fatal "No matching target iqn found"
+
+    ## Login to the iSCSI target.
+    do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --login > /dev/null
+    find_device
+    if [ "$locktarget" = "y" ]; then
+        lock_device
+    fi
+    write_dev $dev
     ;;
 remove)
+    if [ "$locktarget" = "y" ]; then
+        unlock_device
+    fi
+    do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null
     remove
     ;;
 *)

[-- Attachment #3: Type: text/plain, Size: 126 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2016-05-19 14:23 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-05  2:32 [PATCH] v1 - Add exclusive locking option to block-iscsi Steven Haigh
2016-05-05  5:52 ` [PATCH] v2 " Steven Haigh
2016-05-06  9:09   ` Roger Pau Monné
2016-05-06  9:44     ` Steven Haigh
2016-05-09  4:22   ` [PATCH] v3 " Steven Haigh
2016-05-12 11:02     ` Wei Liu
2016-05-16  0:42       ` Steven Haigh
2016-05-19  1:29     ` Resend: " Steven Haigh
2016-05-19 12:10       ` Wei Liu
2016-05-19 14:23       ` Roger Pau Monné

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.