Did anyone experience something similar and/or has a suggestion for a solution?
Regards,
Maximilian
Well, fuser says:
# fuser -v /dev-initrd/mapper/zfs1
Cannot stat file /proc/8864/fd/29: No such file or directory
USER PID ACCESS COMMAND
/dev-initrd/mapper/zfs1:
root 1190 F.... zfs-fuse
so it's definitely zfs that is occupying the device.
dmsetup says:
Name: zfs1
State: ACTIVE
Read Ahead: 256
Tables present: LIVE
Open count: 1
Event number: 0
Major, minor: 253, 1
Number of targets: 1
So there's no other process apart from zfs-fuse.
So I think, it's established that it's zfs-fuse that is responsible
and not freeing the device after "zpool offline".
2009/11/25 Seth Heeren <se...@zfs-fuse.net>:
So it definitely looks like a bug in the offlining code; Since once offlined, it is not even closed properly after exporting the pool.lvcreate -L5g -n z1 media
lvcreate -L5g -n z2 media
cryptsetup -v luksFormat /dev/media/z1
cryptsetup -v luksFormat /dev/media/z2
dmsetup info media-z1
dmsetup info media-z2
zfs-fuse
zpool create crypt mirror /dev/media/z[12]
zpool status
zpool offline crypt /dev/media/z2
zpool status
fuser -v /dev/media/z[12]
lsof /dev/media/z[12]
# both showed both devs in use by zfs-fuse
zfs umount -a
fuser -v /dev/media/z[12]
lsof /dev/media/z[12]
# no change
zpool export crypt
zpool status
fuser -v /dev/media/z[12]
# WEIRD: only z2 still in use
# fuser -v /dev/media/z[12]I'm getting a suspicion that this may be broken due to symlinked alternative names for the device nodes. Here's why:
# zpool import -d /dev/mapper crypt
# fuser -v /dev/media/z[12]
GEBRUIKER PID SOORT PROGRAMMA
/dev/media/z1: root 10100 F.... zfs-fuse
# zpool status
pool: crypt
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
crypt DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
mapper/media-z1 ONLINE 0 0 0
mapper/media-z2 OFFLINE 0 0 0
errors: No known data errors
# zpool export crypt
# fuser -v /dev/media/z[12]
# zpool import -d /dev/mapper crypt
# zpool status
pool: crypt
state: DEGRADED
status: One or more devices has been taken offline by the administrator.
Sufficient replicas exist for the pool to continue functioning in a
degraded state.
action: Online the device using 'zpool online' or replace the device with
'zpool replace'.
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
crypt DEGRADED 0 0 0
mirror-0 DEGRADED 0 0 0
mapper/media-z1 ONLINE 0 0 0
mapper/media-z2 OFFLINE 0 0 0
errors: No known data errors
# zpool online crypt /dev/media/z2
cannot online /dev/media/z2: no such device in pool
# zpool online crypt /dev/mapper/media-z2
# zpool status
pool: crypt
state: ONLINE
scrub: resilver completed after 0h0m with 0 errors on Wed Nov 25 22:35:58 2009
config:
NAME STATE READ WRITE CKSUM
crypt ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
mapper/media-z1 ONLINE 0 0 0
mapper/media-z2 ONLINE 0 0 0 16,5K resilvered
errors: No known data errors
Breakpoint 3, vdev_file_close (vd=0xb6f6d300) at lib/libzpool/vdev_file.c:119Note the reopening flag, which mildly contradicts the offline flag. From the actual onnv-gate code it is pretty clear, that even in upstream (i.e. OpenSolaris) ZFS will skip the close on the device, since the toplevel device (the mirror) is actually being reopened. This is the bug.
119 vdev_file_t *vf = vd->vdev_tsd;
2: vd->vdev_path = 0xb7e07ec0 "/dev/mapper/media-z2"
1: vd->vdev_reopening = B_TRUE
4: vd->vdev_offline = 1
Breakpoint 6, vdev_close (vd=0xb6f6d300) at lib/libzpool/vdev.c:1376It seemed obvious to say:
1376 if (pvd != NULL && pvd->vdev_reopening)
11: vd->vdev_offline = 1
10: pvd->vdev_offline = 0
9: pvd->vdev_reopening = B_TRUE
6: vd->vdev_path = 0xb7e07ec0 "/dev/mapper/media-z2"
5: vd->vdev_reopening = B_FALSE
root@karmic:~# zpool import -d /dev/mapper/ crypt
root@karmic:~# zpool online crypt /dev/mapper/media-z2
root@karmic:~# fuser -v /dev/mapper/media-z?
GEBRUIKER PID SOORT PROGRAMMA
/dev/mapper/media-z1:
root 15249 F.... zfs-fuse
/dev/mapper/media-z2:
root 15249 F.... zfs-fuse
root@karmic:~# zpool offline crypt /dev/mapper/media-z2
root@karmic:~# fuser -v /dev/mapper/media-z?
GEBRUIKER PID SOORT PROGRAMMA
/dev/mapper/media-z1:
root 15249 F.... zfs-fuseI'd be very interested in reporting this upstream, because I'm not actually sure whether this is safe to do with all vdev layouts (apparently, vdevs could be nested multiple levels deep, and whole groups of underlying vdevs could be offlined at once. Things might break with this simple patch). If someone knows the intricacies of this, please do let me know.
I also added links + steps to reproduce
Cheers,
Seth
Any history intermix is (a) not relevant to git (b) a matter of rebase?
Anyways, the real issue is whether the OP is content with the
availability of the fix in this way [ <--- invites comment :) ]
TO ALL DEVELOPERS: I'll be making my public fixes available on my
sehe/stable branch. Emmanuel, please do merge (or review) everything I
post on there (it won't be much anyway... still no time).
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to zfs-...@googlegroups.com
To visit our Web site, click on http://zfs-fuse.net/
-~----------~----~----~----~------~----~------~--~---
# ./dorky.sh mirror "A" "1 2"
forced clean relaunch of zfs-fuse
pool: dorky
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
dorky ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
/tmp/dorky_blk/zA1 ONLINE 0 0 0
/tmp/dorky_blk/zA2 ONLINE 0 0 0
errors: No known data errors
NAME USED AVAIL REFER MOUNTPOINT
dorky 82,5K 488G 21K /tmp/dorky
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
2
# zpool offline dorky /tmp/dorky_blk/z?1
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
1
===============================================================
# ./dorky.sh mirror "A B C D E F G H I" "1 2 3 4 5 6 7 8"
cannot open 'dorky': no such pool
forced clean relaunch of zfs-fuse
pool: dorky
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
dorky ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
/tmp/dorky_blk/zA1 ONLINE 0 0 0
/tmp/dorky_blk/zA2 ONLINE 0 0 0
/tmp/dorky_blk/zA3 ONLINE 0 0 0
... snip ...
mirror-8 ONLINE 0 0 0
/tmp/dorky_blk/zI1 ONLINE 0 0 0
/tmp/dorky_blk/zI2 ONLINE 0 0 0
/tmp/dorky_blk/zI3 ONLINE 0 0 0
/tmp/dorky_blk/zI4 ONLINE 0 0 0
/tmp/dorky_blk/zI5 ONLINE 0 0 0
/tmp/dorky_blk/zI6 ONLINE 0 0 0
/tmp/dorky_blk/zI7 ONLINE 0 0 0
/tmp/dorky_blk/zI8 ONLINE 0 0 0
errors: No known data errors
NAME USED AVAIL REFER MOUNTPOINT
dorky 100K 4,29T 21K /tmp/dorky
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
72
# zpool offline dorky /tmp/dorky_blk/z?[1345678]
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
9
# zpool online dorky /tmp/dorky_blk/z?[1345678]
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
72
======================================================
# ./dorky.sh raidz3 "A B C D E F G H I" "1 2 3 4 5 6 7 8"
forced clean relaunch of zfs-fuse
pool: dorky
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
dorky ONLINE 0 0 0
raidz3-0 ONLINE 0 0 0
/tmp/dorky_blk/zA1 ONLINE 0 0 0
/tmp/dorky_blk/zA2 ONLINE 0 0 0
/tmp/dorky_blk/zA3 ONLINE 0 0 0
... snip ...
raidz3-8 ONLINE 0 0 0
/tmp/dorky_blk/zI1 ONLINE 0 0 0
/tmp/dorky_blk/zI2 ONLINE 0 0 0
/tmp/dorky_blk/zI3 ONLINE 0 0 0
/tmp/dorky_blk/zI4 ONLINE 0 0 0
/tmp/dorky_blk/zI5 ONLINE 0 0 0
/tmp/dorky_blk/zI6 ONLINE 0 0 0
/tmp/dorky_blk/zI7 ONLINE 0 0 0
/tmp/dorky_blk/zI8 ONLINE 0 0 0
errors: No known data errors
NAME USED AVAIL REFER MOUNTPOINT
dorky 186K 21,5T 52,2K /tmp/dorky
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
72
# zpool offline dorky /tmp/dorky_blk/z?[158]
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
45
# zpool online dorky /tmp/dorky_blk/z?[18]
# fuser /tmp/dorky_blk/z* 2>&1 | wc -l
63
===============================================================