openzfs / spl

A shim layer which adds the core interfaces required for OpenZFS.
https://zfsonlinux.org/
GNU General Public License v2.0
281 stars 180 forks source link

Avoid WARN() from procfs on kstat collision #628

Closed loli10K closed 7 years ago

loli10K commented 7 years ago

When we load a ZFS pool having spa_name equals to some existing kstat we would have to create a duplicate entry, which procfs doesn't like (https://github.com/zfsonlinux/zfs/issues/5292).

For instance a ZFS pool named "zil" would have its kstat "txgs" (module "zfs/zil") intalled under "/proc/spl/kstat/zfs/zil": unfortunately we already have a kstat named "zil" (module "zfs") installed in the same procfs location.

Avoid this issue by skipping the duplicate entry creation in procfs.

EDIT: of course this will only work on a 2-level hierarchy. This is only meant to be a "temporary fix" just to avoid the WARN().

With this patch:

root@linux:~# POOLNAME='zil'
root@linux:~# TMPDIR='/var/tmp'
root@linux:~# mountpoint -q $TMPDIR || mount -t tmpfs tmpfs $TMPDIR
root@linux:~# zpool destroy $POOLNAME
cannot open 'zil': no such pool
root@linux:~# rm -f $TMPDIR/zpool1.dat
root@linux:~# fallocate -l 64m $TMPDIR/zpool1.dat
root@linux:~# zpool create $POOLNAME $TMPDIR/zpool1.dat
[  622.081735] WARNING: kstat_create('zfs/zil', 'reads'): namespace collision
[  622.083032] WARNING: kstat_create('zfs/zil', 'txgs'): namespace collision
[  622.085217] WARNING: kstat_create('zfs/zil', 'dmu_tx_assign'): namespace collision
[  622.087350] WARNING: kstat_create('zfs/zil', 'io'): namespace collision
root@linux:~# 
root@linux:~# ls -l /proc/spl/kstat/zfs
total 0
-rw-r--r-- 1 root root 0 Jul 14 20:28 abdstats
-rw-r--r-- 1 root root 0 Jul 14 20:28 arcstats
-rw-r--r-- 1 root root 0 Jul 14 20:28 dbgmsg
-rw-r--r-- 1 root root 0 Jul 14 20:28 dbufs
-rw-r--r-- 1 root root 0 Jul 14 20:28 dmu_tx
-rw-r--r-- 1 root root 0 Jul 14 20:28 fletcher_4_bench
-rw-r--r-- 1 root root 0 Jul 14 20:28 fm
-rw-r--r-- 1 root root 0 Jul 14 20:28 vdev_cache_stats
-rw-r--r-- 1 root root 0 Jul 14 20:28 vdev_raidz_bench
-rw-r--r-- 1 root root 0 Jul 14 20:28 xuio_stats
-rw-r--r-- 1 root root 0 Jul 14 20:28 zfetchstats
-rw-r--r-- 1 root root 0 Jul 14 20:28 zil
root@linux:~# 

Without:

root@linux:/usr/src/spl# POOLNAME='zil'
root@linux:/usr/src/spl# TMPDIR='/var/tmp'
root@linux:/usr/src/spl# mountpoint -q $TMPDIR || mount -t tmpfs tmpfs $TMPDIR
root@linux:/usr/src/spl# zpool destroy $POOLNAME
cannot open 'zil': no such pool
root@linux:/usr/src/spl# rm -f $TMPDIR/zpool1.dat
root@linux:/usr/src/spl# fallocate -l 64m $TMPDIR/zpool1.dat
root@linux:/usr/src/spl# zpool create $POOLNAME $TMPDIR/zpool1.dat
[  288.321016] ------------[ cut here ]------------
[  288.323030] WARNING: CPU: 6 PID: 3291 at fs/proc/generic.c:345 proc_register+0xea/0x110
[  288.326646] proc_dir_entry 'zfs/zil' already registered
[  288.328688] Modules linked in: zfs(POE) icp(POE) zcommon(POE) znvpair(POE) zavl(POE) spl(OE) zunicode(POE) acpi_cpufreq(E) tpm_tis(E) tpm(E) joydev(E) evdev(E) virtio_balloon(E) pvpanic(E) virtio_console(E) serio_raw(E) autofs4(E) hid_generic(E) virtio_blk(E) ata_generic(E) ahci(E) libahci(E) virtio_pci(E) virtio_ring(E) virtio(E) libata(E) [last unloaded: spl]
[  288.342942] CPU: 6 PID: 3291 Comm: zpool Tainted: P           OE   4.6.4 #2
[  288.344082] Hardware name: Bochs Bochs, BIOS Bochs 01/01/2011
[  288.344976]  0000000000000286 00000000502e15c0 ffff8800d8cb7b18 ffffffff81495313
[  288.349243]  ffff8800d8cb7b68 0000000000000000 ffff8800d8cb7b58 ffffffff8107fb61
[  288.350471]  000001598225c018 ffff880119ed1700 ffff8800d993dc00 ffff880036ed1b05
[  288.352743] Call Trace:
[  288.353138]  [<ffffffff81495313>] dump_stack+0x63/0x90
[  288.356973]  [<ffffffff8107fb61>] __warn+0xd1/0xf0
[  288.357702]  [<ffffffff8107fbdf>] warn_slowpath_fmt+0x5f/0x80
[  288.358554]  [<ffffffff8127b3d9>] ? proc_alloc_inum+0x49/0xf0
[  288.359394]  [<ffffffff8127b5ba>] proc_register+0xea/0x110
[  288.361252]  [<ffffffff8127b6f6>] proc_mkdir_data+0x66/0x90
[  288.365121]  [<ffffffff8127b755>] proc_mkdir+0x15/0x20
[  288.365900]  [<ffffffffc0133e6e>] __kstat_install+0x24e/0x2f0 [spl]
[  288.366855]  [<ffffffffc02d3dc7>] spa_stats_init+0x147/0x4f0 [zfs]
[  288.368792]  [<ffffffffc012a22c>] ? spl_kmem_zalloc+0xdc/0x1c0 [spl]
[  288.372851]  [<ffffffffc02d0443>] spa_add+0x3d3/0x780 [zfs]
[  288.373743]  [<ffffffffc02c70ae>] spa_create+0x14e/0xad0 [zfs]
[  288.374585]  [<ffffffffc00e8ce4>] ? nvlist_add_uint64+0x24/0x30 [znvpair]
[  288.376630]  [<ffffffffc030e4ab>] ? zfs_fill_zplprops_impl+0x25b/0x440 [zfs]
[  288.378710]  [<ffffffffc0313f92>] zfs_ioc_pool_create+0x1f2/0x260 [zfs]
[  288.380696]  [<ffffffffc0314e35>] zfsdev_ioctl+0x635/0x750 [zfs]
[  288.381502]  [<ffffffff8182a126>] ? kmemleak_free+0x36/0x80
[  288.383296]  [<ffffffff8121b44d>] do_vfs_ioctl+0x9d/0x5b0
[  288.385070]  [<ffffffff812137d4>] ? putname+0x54/0x60
[  288.386799]  [<ffffffff8121b9d9>] SyS_ioctl+0x79/0x90
[  288.387455]  [<ffffffff81834536>] system_call_fast_compare_end+0xc/0x96
[  288.389378] ---[ end trace 86c6905bd9d063c1 ]---