diff --git a/XenCert/StorageHandlerUtil.py b/XenCert/StorageHandlerUtil.py
--- a/XenCert/StorageHandlerUtil.py
+++ b/XenCert/StorageHandlerUtil.py
@@ -119,12 +119,8 @@
     adapter = {}
     for host in ids:
         try:
-            targetIQN = util.get_single_entry(glob.glob(\
-                '/sys/class/iscsi_host/host%s/device/session*/iscsi_session*/targetname' % host)[0])
-            addr = util.get_single_entry(glob.glob(\
-                '/sys/class/iscsi_host/host%s/device/session*/connection*/iscsi_connection*/persistent_address' % host)[0])
-            port = util.get_single_entry(glob.glob(\
-                '/sys/class/iscsi_host/host%s/device/session*/connection*/iscsi_connection*/persistent_port' % host)[0])
+            targetIQN = iscsilib.get_targetIQN(host)
+            (addr, port) = iscsilib.get_targetIP_and_port(host)
             entry = "%s:%s" % (addr,port)
             adapter[entry] = host
         except Exception, e:
diff --git a/drivers/ISCSISR.py b/drivers/ISCSISR.py
--- a/drivers/ISCSISR.py
+++ b/drivers/ISCSISR.py
@@ -232,14 +232,10 @@
         self.adapter = {}
         for host in ids:
             try:
-                targetIQN = util.get_single_entry(glob.glob(\
-                    '/sys/class/iscsi_host/host%s/device/session*/iscsi_session*/targetname' % host)[0])
+                targetIQN = iscsilib.get_targetIQN(host)
                 if targetIQN != self.targetIQN:
                     continue
-                addr = util.get_single_entry(glob.glob(\
-                    '/sys/class/iscsi_host/host%s/device/session*/connection*/iscsi_connection*/persistent_address' % host)[0])
-                port = util.get_single_entry(glob.glob(\
-                    '/sys/class/iscsi_host/host%s/device/session*/connection*/iscsi_connection*/persistent_port' % host)[0])
+                (addr, port) = iscsilib.get_targetIP_and_port(host)
                 entry = "%s:%s" % (addr,port)
                 self.adapter[entry] = host
             except:
@@ -328,11 +324,10 @@
         else:
             IQNs.append(self.targetIQN)
         sessions = 0
-        paths = glob.glob(\
-                    '/sys/class/iscsi_host/host*/device/session*/iscsi_session*/targetname')
+        paths = iscsilib.get_IQN_paths()
         for path in paths:
             try:
-                if util.get_single_entry(path) in IQNs:
+                if util.get_single_entry(os.path.join(path, 'targetname')) in IQNs:
                     sessions += 1
                     util.SMlog("IQN match. Incrementing sessions to %d" % sessions)
             except:
diff --git a/drivers/XE_SR_ERRORCODES.xml b/drivers/XE_SR_ERRORCODES.xml
--- a/drivers/XE_SR_ERRORCODES.xml
+++ b/drivers/XE_SR_ERRORCODES.xml
@@ -897,4 +897,9 @@
 			<value>447</value>
 		</code>
 
+        <code>
+            <name>UnsupportedKernel</name>
+            <description>Unsupported kernel: neither 2.6 nor 3.x.</description>
+            <value>448</value>
+        </code>
 </SM-errorcodes>
diff --git a/drivers/iscsilib.py b/drivers/iscsilib.py
--- a/drivers/iscsilib.py
+++ b/drivers/iscsilib.py
@@ -18,8 +18,25 @@
 import shutil
 import xs_errors
 import lock
+import glob
 from cleanup import LOCK_TYPE_RUNNING
 
+# The 3.x kernel brings with it some iSCSI path changes in sysfs
+_KERNEL_VERSION = os.uname()[2]
+if _KERNEL_VERSION.startswith('2.6'):
+    _GENERIC_SESSION_PATH = ('/sys/class/iscsi_host/host%s/device/session*/' +
+            'iscsi_session*/')
+    _GENERIC_CONNECTION_PATH = ('/sys/class/iscsi_host/host%s/device/' +
+            'session*/connection*/iscsi_connection*/')
+elif _KERNEL_VERSION.startswith('3.'):
+    _GENERIC_SESSION_PATH = ('/sys/class/iscsi_host/host%s/device/session*/' +
+            'iscsi_session/session*/')
+    _GENERIC_CONNECTION_PATH = ('/sys/class/iscsi_host/host%s/device/' +
+            'session*/connection*/iscsi_connection/connection*/')
+else:
+    _msg = 'Kernel version detected: %s' % _KERNEL_VERSION
+    raise xs_errors.XenError('UnsupportedKernel', _msg)
+
 def exn_on_failure(cmd, message):
     '''Executes via util.doexec the command specified. If the return code is 
     non-zero, raises an ISCSIError with the given message'''
@@ -255,6 +272,25 @@
     except:
         pass
 
+def get_IQN_paths():
+    """Return the list of iSCSI session directories"""
+    return glob.glob(_GENERIC_SESSION_PATH % '*')
+
+def get_targetIQN(iscsi_host):
+    """Get target IQN from sysfs for given iSCSI host number"""
+    iqn_file = os.path.join(_GENERIC_SESSION_PATH % iscsi_host, 'targetname')
+    targetIQN = util.get_single_entry(glob.glob(iqn_file)[0])
+    return targetIQN
+
+def get_targetIP_and_port(iscsi_host):
+    """Get target IP address and port for given iSCSI host number"""
+    connection_dir = _GENERIC_CONNECTION_PATH % iscsi_host
+    ip = util.get_single_entry(glob.glob(os.path.join(
+            connection_dir, 'persistent_address'))[0])
+    port = util.get_single_entry(glob.glob(os.path.join(
+            connection_dir, 'persistent_port'))[0])
+    return (ip, port)
+
 def get_path(targetIQN, portal, lun):
     """Gets the path of a specified LUN - this should be e.g. '1' or '5'"""
     path = os.path.join("/dev/iscsi",targetIQN,portal)
