Skip to content

Commit 32be26f

Browse files
Merge pull request #1575 from harish-24/xfs_pmem_lib
Use pmem library to create pmem devices and run xfstests
2 parents fbc9972 + d29c975 commit 32be26f

File tree

3 files changed

+93
-26
lines changed

3 files changed

+93
-26
lines changed

fs/xfstests.py

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from avocado import Test
3030
from avocado import main
3131
from avocado.utils import process, build, git, distro, partition
32-
from avocado.utils import disk, data_structures
32+
from avocado.utils import disk, data_structures, pmem
3333
from avocado.utils.software_manager import SoftwareManager
3434

3535

@@ -51,6 +51,8 @@ def setUp(self):
5151
"df -T / | awk 'END {print $2}'", shell=True).decode("utf-8")
5252
if root_fs in ['ext3', 'ext4']:
5353
self.use_dd = True
54+
self.dev_type = self.params.get('type', default='loop')
55+
5456
sm = SoftwareManager()
5557

5658
self.detected_distro = distro.detect()
@@ -73,6 +75,10 @@ def setUp(self):
7375
# on Avocado versions >= 50.0. This is a temporary compatibility
7476
# enabler for older runners, but should be removed soon
7577
elif self.detected_distro.name in ['centos', 'fedora', 'rhel', 'SuSE']:
78+
if self.dev_type == 'nvdimm':
79+
packages.extend(['ndctl', 'parted'])
80+
if self.detected_distro.name == 'rhel':
81+
packages.extend(['daxctl'])
7682
packages.extend(['acl', 'bc', 'dump', 'indent', 'libtool', 'lvm2',
7783
'xfsdump', 'psmisc', 'sed', 'libacl-devel',
7884
'libattr-devel', 'libaio-devel', 'libuuid-devel',
@@ -97,15 +103,14 @@ def setUp(self):
97103
if not sm.check_installed(package) and not sm.install(package):
98104
self.cancel("Fail to install %s required for this test." %
99105
package)
100-
101106
self.skip_dangerous = self.params.get('skip_dangerous', default=True)
102107
self.test_range = self.params.get('test_range', default=None)
103108
self.scratch_mnt = self.params.get(
104109
'scratch_mnt', default='/mnt/scratch')
105110
self.test_mnt = self.params.get('test_mnt', default='/mnt/test')
106111
self.disk_mnt = self.params.get('disk_mnt', default='/mnt/loop_device')
107-
self.dev_type = self.params.get('type', default='loop')
108112
self.fs_to_test = self.params.get('fs', default='ext4')
113+
109114
if process.system('which mkfs.%s' % self.fs_to_test,
110115
ignore_status=True):
111116
self.cancel('Unknown filesystem %s' % self.fs_to_test)
@@ -129,6 +134,59 @@ def setUp(self):
129134
else:
130135
self.cancel('Need %s GB to create loop devices' % check)
131136
self._create_loop_device(base_disk, loop_size, mount)
137+
elif self.dev_type == 'nvdimm':
138+
self.test_dev = self.params.get('disk_test', default=None)
139+
self.scratch_dev = self.params.get('disk_scratch', default=None)
140+
self.log_test = self.params.get('log_test', default='')
141+
self.log_scratch = self.params.get('log_scratch', default='')
142+
logflag = self.params.get('logdev', default=False)
143+
self.plib = pmem.PMem()
144+
regions = sorted(self.plib.run_ndctl_list(
145+
'-R'), key=lambda i: i['size'], reverse=True)
146+
if not (self.test_dev and self.scratch_dev):
147+
if not regions:
148+
self.plib.enable_region()
149+
regions = sorted(self.plib.run_ndctl_list(
150+
'-R'), key=lambda i: i['size'], reverse=True)
151+
region = self.plib.run_ndctl_list_val(regions[0], 'dev')
152+
if not self.plib.is_region_legacy(region):
153+
self.plib.destroy_namespace(region=region, force=True)
154+
self.plib.create_namespace(
155+
region=region, size='21G', sector_size='512')
156+
pmem_dev = self.plib.run_ndctl_list_val(
157+
self.plib.run_ndctl_list('-N -r %s' % region)[0], 'blockdev')
158+
if logflag:
159+
if not (self.log_test and self.log_scratch):
160+
self.plib.create_namespace(
161+
region=region, size='3G', mode='sector', sector_size='512')
162+
log_dev = self.plib.run_ndctl_list_val(self.plib.run_ndctl_list(
163+
'-N -r %s -m sector' % region)[0], 'blockdev')
164+
else:
165+
self.plib.enable_region()
166+
if not len(regions) > 1 and logflag:
167+
self.cancel("Cannot use logdev with one region")
168+
else:
169+
reg_2 = self.plib.run_ndctl_list_val(regions[1], 'dev')
170+
self.plib.create_namespace(
171+
region=reg_2, size='3G', mode='sector', sector_size='512')
172+
log_dev = self.plib.run_ndctl_list_val(self.plib.run_ndctl_list(
173+
' -N -r %s -m sector' % reg_2)[0], 'blockdev')
174+
pmem_dev = self.plib.run_ndctl_list_val(
175+
self.plib.run_ndctl_list('-N -r %s' % region)[0], 'blockdev')
176+
if process.system('parted -s -a optimal /dev/%s mklabel gpt --'
177+
' mkpart primary xfs 1MiB 10GiB mkpart '
178+
'primary xfs 10GiB 20GiB' % pmem_dev, shell=True):
179+
self.cancel("Failed to setup PMEM partitions")
180+
self.test_dev = "/dev/%sp1" % pmem_dev
181+
self.scratch_dev = "/dev/%sp2" % pmem_dev
182+
self.devices.extend([self.test_dev, self.scratch_dev])
183+
if logflag and not (self.log_test and self.log_scratch):
184+
if process.system('parted -s -a optimal /dev/%s mklabel gpt --'
185+
' mkpart primary xfs 1MiB 1GiB mkpart '
186+
'primary xfs 1GiB 2GiB' % log_dev, shell=True):
187+
self.cancel("Failed to setup logdev partitions")
188+
self.log_test = "/dev/%s1" % log_dev
189+
self.log_scratch = "/dev/%s2" % log_dev
132190
else:
133191
self.test_dev = self.params.get('disk_test', default=None)
134192
self.scratch_dev = self.params.get('disk_scratch', default=None)
@@ -138,8 +196,6 @@ def setUp(self):
138196
cfg_file = os.path.join(self.teststmpdir, 'local.config')
139197
self.mkfs_opt = self.params.get('mkfs_opt', default='')
140198
self.mount_opt = self.params.get('mount_opt', default='')
141-
self.log_test = self.params.get('log_test', default='')
142-
self.log_scratch = self.params.get('log_scratch', default='')
143199
with open(cfg_file, "r") as sources:
144200
lines = sources.readlines()
145201
with open(cfg_file, "w") as sources:
@@ -166,10 +222,12 @@ def setUp(self):
166222
break
167223
with open(cfg_file, "a") as sources:
168224
if self.log_test:
225+
sources.write('export USE_EXTERNAL=yes\n')
169226
sources.write('export TEST_LOGDEV="%s"\n' % self.log_test)
170227
self.log_devices.append(self.log_test)
171228
if self.log_scratch:
172-
sources.write('export SCRATCH_LOGDEV="%s"\n' % self.log_scratch)
229+
sources.write('export SCRATCH_LOGDEV="%s"\n' %
230+
self.log_scratch)
173231
self.log_devices.append(self.log_scratch)
174232
if self.mkfs_opt:
175233
sources.write('MKFS_OPTIONS="%s"\n' % self.mkfs_opt)
@@ -182,7 +240,8 @@ def setUp(self):
182240
for ite, dev in enumerate(self.devices):
183241
dev_obj = partition.Partition(dev)
184242
if self.logdev_opt:
185-
dev_obj.mkfs(fstype=self.fs_to_test, args='%s %s=%s' % (self.mkfs_opt, self.logdev_opt, self.log_devices[ite]))
243+
dev_obj.mkfs(fstype=self.fs_to_test, args='%s %s=%s' % (
244+
self.mkfs_opt, self.logdev_opt, self.log_devices[ite]))
186245
else:
187246
dev_obj.mkfs(fstype=self.fs_to_test, args=self.mkfs_opt)
188247

@@ -211,11 +270,15 @@ def setUp(self):
211270
self._create_test_list(self.share_exclude, "shared",
212271
dangerous=False)
213272
if self.detected_distro.name is not 'SuSE':
214-
process.run('useradd 123456-fsgqa', sudo=True)
215-
process.run('useradd fsgqa', sudo=True)
273+
if process.system('useradd 123456-fsgqa', sudo=True, ignore_status=True):
274+
self.log.warn('useradd 123456-fsgqa failed')
275+
if process.system('useradd fsgqa', sudo=True, ignore_status=True):
276+
self.log.warn('useradd fsgqa failed')
216277
else:
217-
process.run('useradd -m -U fsgqa', sudo=True)
218-
process.run('groupadd sys', sudo=True)
278+
if process.system('useradd -m -U fsgqa', sudo=True, ignore_status=True):
279+
self.log.warn('useradd fsgqa failed')
280+
if process.system('groupadd sys', sudo=True, ignore_status=True):
281+
self.log.warn('groupadd sys failed')
219282
if not os.path.exists(self.scratch_mnt):
220283
os.makedirs(self.scratch_mnt)
221284
if not os.path.exists(self.test_mnt):
@@ -265,9 +328,9 @@ def tearDown(self):
265328
process.system('umount %s %s' % (self.scratch_mnt, self.test_mnt),
266329
sudo=True, ignore_status=True)
267330
if os.path.exists(self.scratch_mnt):
268-
os.rmdir(self.scratch_mnt)
331+
shutil.rmtree(self.scratch_mnt)
269332
if os.path.exists(self.test_mnt):
270-
os.rmdir(self.test_mnt)
333+
shutil.rmtree(self.test_mnt)
271334
if self.dev_type == 'loop':
272335
for dev in self.devices:
273336
process.system('losetup -d %s' % dev, shell=True,

fs/xfstests.py.data/nvdimm.yaml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ setup:
1313
#share_exclude: '1-600'
1414
fs_xfs:
1515
fs: 'xfs'
16-
mkfs_opt: '-b size=65536 -s size=4096'
17-
disk_type: !mux
18-
type: 'disk'
19-
disk_test: /dev/pmem0
20-
disk_scratch: /dev/pmem0.1
16+
mkfs_opt: '-b size=65536 -s size=4096 -m reflink=0'
17+
exclude:
18+
gen_exclude:
19+
disk_type:
20+
type: 'nvdimm'
21+
disk_test:
22+
disk_scratch:

fs/xfstests.py.data/nvdimm_log.yaml

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ setup:
33
scratch_mnt: '/mnt/scratch_pmem'
44
test_mnt: '/mnt/test_pmem'
55
mount_opt: '-o dax'
6+
logdev: true
67
fs_type: !mux
78
fs_ext4:
89
fs: 'ext4'
@@ -12,12 +13,13 @@ setup:
1213
#share_exclude: '1-300'
1314
fs_xfs:
1415
fs: 'xfs'
15-
mkfs_opt: '-b size=65536 -s size=4096'
16+
mkfs_opt: '-b size=65536 -s size=512 -m reflink=0'
1617
logdev_opt: '-l logdev'
17-
#gen_exclude: '388'
18-
disk_type: !mux
19-
type: 'disk'
20-
disk_test: /dev/pmem0
21-
disk_scratch: /dev/pmem0.1
22-
log_test: /dev/pmem1s
23-
log_scratch: /dev/pmem1.1s
18+
exclude:
19+
gen_exclude:
20+
disk_type:
21+
type: 'nvdimm'
22+
disk_test:
23+
disk_scratch:
24+
log_test:
25+
log_scratch:

0 commit comments

Comments
 (0)