mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-12-01 09:32:08 +03:00
Restructure the zfsdev_state_list to allow for lock-free reading by converting to a simple singly-linked list from which items are never deleted and over which only forward iterations are performed. It depends on, among other things, the atomicity of accessing the zs_minor integer and zs_next pointer. This fixes a lock inversion in which the zfsdev_state_lock is used by both the sync task (txg_sync) and indirectly by any user program which uses /dev/zfs; the zfsdev_release method uses the same lock and then blocks on the sync task. The most typical failure scenerio occurs when the sync task is cleaning up a user hold while various concurrent "zfs" commands are in progress. Neither Illumos nor Solaris are affected by this issue because they use DDI interface which provides lock-free reading of device state via the ddi_get_soft_state() function. Signed-off-by: Tim Chase <tim@chase2k.com> Signed-off-by: Chunwei Chen <tuxoko@gmail.com> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #2301 |
||
|---|---|---|
| .. | ||
| fm | ||
| fs | ||
| arc.h | ||
| avl_impl.h | ||
| avl.h | ||
| bplist.h | ||
| bpobj.h | ||
| bptree.h | ||
| dbuf.h | ||
| ddt.h | ||
| dmu_impl.h | ||
| dmu_objset.h | ||
| dmu_send.h | ||
| dmu_traverse.h | ||
| dmu_tx.h | ||
| dmu_zfetch.h | ||
| dmu.h | ||
| dnode.h | ||
| dsl_dataset.h | ||
| dsl_deadlist.h | ||
| dsl_deleg.h | ||
| dsl_destroy.h | ||
| dsl_dir.h | ||
| dsl_pool.h | ||
| dsl_prop.h | ||
| dsl_scan.h | ||
| dsl_synctask.h | ||
| dsl_userhold.h | ||
| efi_partition.h | ||
| Makefile.am | ||
| metaslab_impl.h | ||
| metaslab.h | ||
| nvpair_impl.h | ||
| nvpair.h | ||
| refcount.h | ||
| rrwlock.h | ||
| sa_impl.h | ||
| sa.h | ||
| spa_boot.h | ||
| spa_impl.h | ||
| spa.h | ||
| space_map.h | ||
| txg_impl.h | ||
| txg.h | ||
| u8_textprep_data.h | ||
| u8_textprep.h | ||
| uberblock_impl.h | ||
| uberblock.h | ||
| uio_impl.h | ||
| unique.h | ||
| uuid.h | ||
| vdev_disk.h | ||
| vdev_file.h | ||
| vdev_impl.h | ||
| vdev.h | ||
| xvattr.h | ||
| zap_impl.h | ||
| zap_leaf.h | ||
| zap.h | ||
| zfeature.h | ||
| zfs_acl.h | ||
| zfs_context.h | ||
| zfs_ctldir.h | ||
| zfs_debug.h | ||
| zfs_delay.h | ||
| zfs_dir.h | ||
| zfs_fuid.h | ||
| zfs_ioctl.h | ||
| zfs_onexit.h | ||
| zfs_rlock.h | ||
| zfs_sa.h | ||
| zfs_stat.h | ||
| zfs_vfsops.h | ||
| zfs_vnops.h | ||
| zfs_znode.h | ||
| zil_impl.h | ||
| zil.h | ||
| zio_checksum.h | ||
| zio_compress.h | ||
| zio_impl.h | ||
| zio.h | ||
| zpl.h | ||
| zrlock.h | ||
| zvol.h | ||