Bug#929728: systemd autopkgtest 'storage' fails adding/rmmoding scsi_debug
Dan Streetman
dan.streetman at canonical.com
Wed May 29 17:02:46 BST 2019
Package: systemd
Version: 241-5
Severity: normal
Tags: patch
User: ubuntu-devel at lists.ubuntu.com
Usertags: origin-ubuntu eoan ubuntu-patch
Dear Maintainer,
'storage' test fails on some archs/releases trying to modprobe and/or rmmod scsi_debug.
-- Package-specific info:
* d/t/storage:
- fix handling of scsi_debug module, test drives (LP: #1829347)
Thanks for considering the patch.
-- System Information:
Debian Release: buster/sid
APT prefers disco-updates
APT policy: (500, 'disco-updates'), (500, 'disco-security'), (500, 'disco'), (100, 'disco-backports')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 5.0.0-13-generic (SMP w/24 CPU cores)
Kernel taint flags: TAINT_WARN
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE=en_US (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
Versions of packages systemd is related to:
pn dracut <none>
ii initramfs-tools 0.131ubuntu19
ii udev 240-6ubuntu5
-------------- next part --------------
diff -Nru systemd-241/debian/tests/storage systemd-241/debian/tests/storage
--- systemd-241/debian/tests/storage 2019-05-24 16:58:59.000000000 -0400
+++ systemd-241/debian/tests/storage 2019-05-29 11:52:19.000000000 -0400
@@ -12,40 +12,69 @@
from glob import glob
- at unittest.skipIf(os.path.isdir('/sys/module/scsi_debug'),
- 'The scsi_debug module is already loaded')
+SCSI_DEBUG_DIR='/sys/bus/pseudo/drivers/scsi_debug'
+
class FakeDriveTestBase(unittest.TestCase):
@classmethod
def setUpClass(klass):
- # create a fake SCSI hard drive
- subprocess.check_call(['modprobe', 'scsi_debug', 'dev_size_mb=32'])
+ if not os.path.isdir(SCSI_DEBUG_DIR):
+ subprocess.call(['modprobe', 'scsi_debug', 'dev_size_mb=32'],
+ stderr=subprocess.DEVNULL)
+ # if still not available, we can't run any of our tests
+ if not os.path.isdir(SCSI_DEBUG_DIR):
+ klass.skipTest('scsi_debug module not loaded')
+
+ def setUp(self):
+ # remove any existing drives, then add back one for us to use
+ self.remove_scsi_debug_drives()
+ with open(os.path.join(SCSI_DEBUG_DIR, 'add_host'), 'r+') as f:
+ print('Adding scsi_debug drive')
+ f.write('1')
+ for wait in range(10):
+ f.seek(0)
+ if f.read().strip() == '1':
+ break
+ time.sleep(0.1)
+ else:
+ self.skipTest('Could not add scsi_debug drive to test')
# wait until drive got created
sys_dirs = []
- while not sys_dirs:
- sys_dirs = glob('/sys/bus/pseudo/drivers/scsi_debug/adapter*/host*/target*/*:*/block')
+ for tries in range(100):
+ sys_dirs = glob(os.path.join(SCSI_DEBUG_DIR,
+ 'adapter*/host*/target*/*:*/block'))
+ if sys_dirs:
+ break
time.sleep(0.1)
- assert len(sys_dirs) == 1
+ if len(sys_dirs) < 1:
+ self.skipTest('could not find scsi_debug block device')
+ elif len(sys_dirs) > 1:
+ self.skipTest('too many scsi_debug block devices (%s)' % len(sys_dirs))
devs = os.listdir(sys_dirs[0])
assert len(devs) == 1
- klass.device = '/dev/' + devs[0]
-
- @classmethod
- def tearDownClass(klass):
- # create a fake SCSI hard drive
- subprocess.check_call(['rmmod', 'scsi_debug'])
+ self.device = '/dev/' + devs[0]
def tearDown(self):
- # clear drive
- with open(self.device, 'wb') as f:
- block = b'0' * 1048576
- try:
- while True:
- f.write(block)
- except OSError:
- pass
+ self.remove_scsi_debug_drives()
subprocess.check_call(['udevadm', 'settle'])
subprocess.check_call(['systemctl', 'daemon-reload'])
+ def remove_scsi_debug_drives(self):
+ with open(os.path.join(SCSI_DEBUG_DIR, 'add_host'), 'r+') as f:
+ n = f.read().strip()
+ f.seek(0)
+ if n == '0':
+ return
+ print('Removing %s scsi_debug test drive(s)' % n)
+ f.write('-%s' % n)
+ for wait in range(50):
+ f.seek(0)
+ n = f.read().strip()
+ if n == '0':
+ break
+ time.sleep(0.1)
+ else:
+ self.skipTest('Could not remove %s scsi_debug drives' % n)
+
class CryptsetupTest(FakeDriveTestBase):
def setUp(self):
@@ -215,6 +244,7 @@
self.format_luks()
with open('/etc/crypttab', 'w') as f:
f.write('%s %s none luks,tmp\n' % (self.plaintext_name, self.device))
+ self.apply('cryptsetup.target')
mountpoint = '/run/crypt1.systemdtest'
os.mkdir(mountpoint)
@@ -230,17 +260,15 @@
self.apply('local-fs.target')
# should be mounted
- found = False
with open('/proc/mounts') as f:
for line in f:
fields = line.split()
if fields[0] == self.plaintext_dev:
self.assertEqual(fields[1], mountpoint)
self.assertEqual(fields[2], 'ext2')
- found = True
break
- if not found:
- self.fail('%s is not mounted' % self.plaintext_dev)
+ else:
+ self.fail('%s is not mounted' % self.plaintext_dev)
if __name__ == '__main__':
More information about the Pkg-systemd-maintainers
mailing list