Blob Blame History Raw
From 86fed9fdab8803fd8d321c8242097e7b4f952ada Mon Sep 17 00:00:00 2001
From: Maurizio Lombardi <mlombard@redhat.com>
Date: Tue, 27 Mar 2018 14:50:09 +0200
Subject: [PATCH] alua: enable alua for pscsi/tcmu if kernel reports support

4.14 (it is currently the 4.13 feature window and I think we will
miss it) will add this patch

https://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git/commit/?h=for-next&id=c17d5d5f51f72f24e0e17a4450ae5010bf6962d9

commit c17d5d5f51f72f24e0e17a4450ae5010bf6962d9
Author: Mike Christie <mchristi@redhat.com>
Date:   Mon Jul 10 14:53:31 2017 -0500

    target: export lio pgr/alua support as device attr

which has the lio device report if it supports lio based ALUA.
We can then check this configfs file and know if we are using
a modern kernel with support and not worry about possibly crashing
the system.

Signed-off-by: Maurizio Lombardi <mlombard@redhat.com>
---
 rtslib/alua.py |  4 ----
 rtslib/tcm.py  | 23 ++++++++++++++++++-----
 2 files changed, 18 insertions(+), 9 deletions(-)

diff --git a/rtslib/alua.py b/rtslib/alua.py
index 390e74a..fadc225 100644
--- a/rtslib/alua.py
+++ b/rtslib/alua.py
@@ -46,10 +46,6 @@ class ALUATargetPortGroup(CFSNode):
         @param tag: target port group id. If not passed in, try to look
                     up existing ALUA TPG with the same name
         """
-        # kernel partially sets up default_tg_pt_gp and will let you partially
-        # setup ALUA groups for pscsi and user, but writing to some of the
-        # files will crash the kernel. Just fail to even create groups until
-        # the kernel is fixed.
         if storage_object.alua_supported is False:
             raise RTSLibALUANotSupported("Backend does not support ALUA setup")
 
diff --git a/rtslib/tcm.py b/rtslib/tcm.py
index aa3530a..bf681fe 100644
--- a/rtslib/tcm.py
+++ b/rtslib/tcm.py
@@ -32,6 +32,19 @@ from .utils import convert_scsi_path_to_hctl, convert_scsi_hctl_to_path
 from .utils import is_dev_in_use, get_blockdev_type
 from .utils import get_size_for_blk_dev, get_size_for_disk_name
 
+def storage_object_get_alua_support_attr(so):
+    '''
+    Helper function that can be called by passthrough type of backends.
+    '''
+    try:
+        if int(so.get_attribute("alua_support")) == 1:
+            return True
+    except RTSLibError:
+            pass
+    # Default to false because older kernels will crash when
+    # reading/writing to some ALUA files when ALUA was not
+    # fully supported by pscsi and tcmu.
+    return False
 
 class StorageObject(CFSNode):
     '''
@@ -227,7 +240,7 @@ class StorageObject(CFSNode):
 
     def _get_alua_supported(self):
         '''
-        Children should override and return false if ALUA setup is not supported.
+        Children should override if the backend did not always support ALUA
         '''
         self._check_self()
         return True
@@ -420,7 +433,7 @@ class PSCSIStorageObject(StorageObject):
 
     def _get_alua_supported(self):
         self._check_self()
-        return False
+        return storage_object_get_alua_support_attr(self)
 
     # PSCSIStorageObject public stuff
 
@@ -442,7 +455,7 @@ class PSCSIStorageObject(StorageObject):
     lun = property(_get_lun,
             doc="Get the SCSI device LUN")
     alua_supported = property(_get_alua_supported,
-            doc="ALUA cannot be setup with rtslib, so False is returned.");
+            doc="Returns true if ALUA can be setup. False if not supported.")
 
     def dump(self):
         d = super(PSCSIStorageObject, self).dump()
@@ -826,14 +839,14 @@ class UserBackedStorageObject(StorageObject):
 
     def _get_alua_supported(self):
         self._check_self()
-        return False
+        return storage_object_get_alua_support_attr(self)
 
     size = property(_get_size,
             doc="Get the size in bytes.")
     config = property(_get_config,
             doc="Get the TCMU config.")
     alua_supported = property(_get_alua_supported,
-            doc="ALUA cannot be setup with rtslib, so False is returned.");
+            doc="Returns true if ALUA can be setup. False if not supported.")
 
     def dump(self):
         d = super(UserBackedStorageObject, self).dump()
-- 
1.8.3.1