ZPOOL-EVENTS(8)
π ZPOOL-EVENTS π
okay bestie, gather round, because this is the manual page for zpool-events β that's the System Manager's Manual entry, section 8, and she is a big one. She's the one who spills the tea on everything the ZFS kernel modules have been up to lately. β¨
πΈ NAME πΈ
zpool-events β list recent events generated by kernel
β¨ SYNOPSIS β¨
zpool events [-vHf] [pool]
zpool events -c
π¦ DESCRIPTION π¦
So basically, zpool events lists all the recent events that the ZFS kernel modules have generated. These events get consumed by zed(8), and zed uses them to automate the boring administrative stuff for you β like swapping a dead device out for a hot spare without you having to lift a finger. π
If you want the full rundown on the subclasses and event payloads that can show up, go peek at the βEVENTSβ section and everything after it. π
π OPTIONS π
-cβ Clears out all the previous events. bye bye history π«Ά-fβ Follow mode. She stays watching. π-Hβ Scripted mode. No headers, no vibes, just the facts β fields get separated by a single tab instead of whatever arbitrary spacing it felt like using. β¨-vβ Prints the entire payload</> for each event. the whole thing. all of it. no crumbs left behind. π
π₯ EVENTS π₯
These are the different event subclasses, bestie. The full event name would be ereport.fs.zfs.SUBCLASS, but we're only listing the last part here because the rest is just... a lot. iykyk.
checksumβ Fired off when a checksum error has been detected. π©Ήioβ Fired off when there's an I/O error in a vdev in the pool.dataβ Fired off when there have been data errors in the pool. πdeadmanβ Fired off when an I/O request gets determined to be "hung". This can happen because of lost completion events caused by flaky hardware or flaky drivers. Peepzfs_deadman_failmodeinzfs(4)for the full scoop on "hung" I/O detection and how it's configured.delayβ Fired off when a completed I/O request takes longer than the max allowed time, which is specified by thezio_slow_io_msmodule parameter. This is often giving "something is wrong with the underlying storage device". π The number of delay events is ratelimited by thezfs_slow_io_events_per_secondmodule parameter.dio_verify_rdβ Fired off when there was a checksum verify error after a Direct I/O read has been issued.dio_verify_wrβ Fired off when there was a checksum verify error after a Direct I/O write has been issued. This one can only happen if the module parameterzfs_vdev_direct_write_verifyis not set to zero. Seezfs(4)for more deets on thezfs_vdev_direct_write_verifymodule parameter.config_syncβ Fired off every single time a vdev change has been done to the pool.zpoolβ Fired off when a pool cannot be imported. πpool_createβ Fired off when a pool is created. πΆβ¨pool_destroyβ Fired off when a pool is destroyed. πpool_exportβ Fired off when a pool is exported.pool_importβ Fired off when a pool is imported.pool_reguidβ Fired off when a REGUID has been detected β that's when a new unique identifier for the pool has been regenerated. πvdev.unknownβ Fired off when the vdev is unknown. Like, say, when you're trying to clear device errors on a vdev that has failed or been kicked from the system/pool and is no longer available. shruggie.vdev.open_failedβ Fired off when a vdev could not be opened β because it didn't exist, for example. πvdev.corrupt_dataβ Fired off when corrupt data has been detected on a vdev.vdev.no_replicasβ Fired off when there are no more replicas left to sustain the pool. This would lead to the pool being DEGRADED. not the vibe. πvdev.bad_guid_sumβ Fired off when a missing device in the pool has been detected.vdev.too_smallβ Fired off when the system (kernel) has removed a device and ZFS notices the device isn't there anymore. This is usually followed by aprobe_failureevent, so watch for the sequel.vdev.bad_labelβ Fired off when the label is OK but invalid. π€¨vdev.bad_ashiftβ Fired off when the ashift alignment requirement has increased.vdev_removeβ Fired off when a vdev is detached from a mirror β or when a spare is detached from a vdev where it has been used to replace a failed drive. And heads up: this only works if the original drive has been re-added. πvdev_remove_auxβ Fired off when an auxiliary vdev is removed.vdev_remove_devβ Fired off when a specific device is removed from a vdev.vdev_clearβ Fired off when clearing device errors in a pool. Like when you runzpool clearon a device in the pool. π§Ήβ¨vdev_checkβ Fired off when a check to see if a given vdev could be opened is started.vdev_spareβ Fired off when a spare has kicked in to replace a failed device. slay, spare. π¦Έvdev_autoexpandβ Fired off when a vdev can be automatically expanded.vdev_addβ Fired off when a vdev is added to a pool.vdev_attachβ Fired off when a vdev is attached to a mirror or raidz vdev type.vdev_onlineβ Fired off when an offline vdev is brought online. welcome back babe π«Άio_failureβ Fired off when there is an I/O failure in a vdev in the pool.probe_failureβ Fired off when a probe fails on a vdev. This would occur if a vdev has been kicked from the system outside of ZFS β like when the kernel has removed the device. πlog_replayβ Fired off when the intent log cannot be replayed. This can occur in the case of a missing or damaged log device. πresilver_startβ Fired off when a resilver is started.resilver_finishβ Fired off when the running resilver has finished. πscrub_startβ Fired off when a scrub is started on a pool.scrub_finishβ Fired off when a pool has finished scrubbing. β¨scrub_abortβ Fired off when a scrub is aborted on a pool.scrub_resumeβ Fired off when a scrub is resumed on a pool.scrub_pausedβ Fired off when a scrub is paused on a pool.errorscrub_startβ Fired off when an errorscrub is started on a pool.errorscrub_finishβ Fired off when a pool has finished errorscrubbing. β¨errorscrub_abortβ Fired off when an errorscrub is aborted on a pool.errorscrub_resumeβ Fired off when an errorscrub is resumed on a pool.errorscrub_pausedβ Fired off when an errorscrub is paused on a pool.trim_startβ Fired off when a trim is started on a pool.trim_finishβ Fired off when a pool has finished trimbing. (yes it says trimbing. we don't make the rules, we just report them. π)trim_cancelβ Fired off when a trim is canceled on a pool.trim_resumeβ Fired off when a trim is resumed on a pool.trim_suspendβ Fired off when a trim is suspend on a pool.authenticationβ Fired off when there is a decryption / authentication error. πconfig_cache_writeβ Fired off when the config cache file cannot be written.bootfs_vdev_attachβ Fired off when a vdev is attached to a root pool with thebootfsproperty set. πsitoutβ Fired off when a RAIDZ or DRAID vdev triggers the autosit logic. This logic detects when a disk in such a vdev is significantly slower than its peers, and sits them out temporarily to preserve the performance of the pool. time out, bestie, think about what you did. πͺ
πΎ PAYLOADS πΎ
Okay bestie, so when an event pops off, it comes with a payload β that's just the data/information riding along with it. Think of it as the event's little purse full of receipts. πβ¨
Heads up: forzed(8), all of these get uppercased and prefixed withZEVENT_. Sopoolshows up asZEVENT_POOL. iykyk π
poolβ the pool's name, obviously. πpool_failmodeβ the failmode, which is one ofwait,continue, orpanic. Go peep thefailmodeproperty inzpoolprops(7)if you want the full tea.pool_guidβ the GUID of the pool. πpool_contextβ the pool's load state:0=none,1=open,2=import,3=tryimport,4=recover,5=error.vdev_guidβ the GUID of the vdev in question (aka the vdev that's failing, or the one being operated on withzpool clear, etc.).vdev_typeβ what kind of vdev it is:disk,file,mirror, etc. The Virtual Devices section ofzpoolconcepts(7)has all the possible values if you wanna go deeper. π¦vdev_pathβ the full path of the vdev,-partXand all.vdev_devidβ the vdev's ID, if it's got one.vdev_fruβ the physical FRU location.vdev_stateβ the vdev's state:0=uninitialized,1=closed,2=offline,3=removed,4=failed to open,5=faulted,6=degraded,7=healthy.vdev_ashiftβ the vdev'sashiftvalue.vdev_complete_tsβ the time the last I/O request finished for that vdev.vdev_delta_tsβ how much time has passed since the last I/O request finished for that vdev.vdev_spare_pathsβ a list of spares, full path plus any-partXincluded.vdev_spare_guidsβ the GUID(s) of the spares.vdev_read_errorsβ how many read errors got detected on the vdev. πvdev_write_errorsβ how many write errors got detected on the vdev.vdev_cksum_errorsβ how many checksum errors got detected on the vdev.parent_guidβ GUID of the vdev's parent.parent_typeβ type of the parent. Same deal asvdev_type.parent_pathβ path of the vdev's parent, if there is one.parent_devidβ ID of the vdev's parent, if there is one.zio_objsetβ the object set number for a given I/O request.zio_objectβ the object number for a given I/O request.zio_levelβ the indirect level for the block. Level0is the lowest level and it's where the data blocks live. Values> 0mean metadata blocks at the matching level.zio_blkidβ the block ID for a given I/O request.zio_errβ the error number for a failure while handling a given I/O request. It plays nice witherrno(3), and the valueEBADEgets used to signal a ZFS checksum error. πzio_offsetβ the offset in bytes of where the I/O request should be written for the specified vdev.zio_sizeβ the size in bytes of the I/O request.zio_flagsβ the current flags describing how the I/O request should be handled. The I/O FLAGS section below has the whole list, no gatekeeping.zio_stageβ the current stage of the I/O in the pipeline. I/O STAGES section has every single one.zio_pipelineβ the valid pipeline stages for the I/O. Again, see I/O STAGES.zio_priorityβ the queue priority of the I/O request. See I/O PRIORITIES for the full roster.zio_tyoeβ the type of the I/O request. See I/O TYPES below for all of them. β¨zio_delayβ the time elapsed (in nanoseconds) spent waiting for the block layer to complete the I/O request. Unlikezio_delta, this does not include any vdev queuing time, so it's purely a measure of block layer performance. Very demure, very mindful. πzio_timestampβ the time when a given I/O request was submitted.zio_deltaβ the time required to service a given I/O request.prev_stateβ the previous state of the vdev.cksum_algorithmβ which checksum algorithm was used.zfsprops(7)has the details on what's available.cksum_byteswapβ whether or not the data is byteswapped.bad_rangesβ[start, end)pairs of corruption offsets. Offsets are always aligned on a 64-bit boundary, and they can include some gaps of non-corruption. (Seebad_ranges_min_gapbelow.)bad_ranges_min_gapβ to keep the size of thebad_rangesarray under control, gaps of non-corruption that are less than or equal tobad_ranges_min_gapbytes have been merged into the adjacent corruption. It's always at least8bytes, since corruption is detected on a 64-bit word basis. π§bad_range_setsβ this array has one element per range inbad_ranges. Each element holds the count of bits in that range which were clear in the good data and set in the bad data.bad_range_clearsβ this array has one element per range inbad_ranges. Each element holds the count of bits for that range which were set in the good data and clear in the bad data.bad_set_bitsβ if this field exists, it's an array of(bad data & ~(good data))β that is, the bits that are set in the bad data and cleared in the good data. Each element corresponds to a byte whose offset falls in a range inbad_ranges, and the array is ordered by offset. So the first element is the first byte in the firstbad_rangesrange, and the last element is the last byte in the lastbad_rangesrange.bad_cleared_bitsβ same energy asbad_set_bits, except it holds(good data & ~(bad data))β the bits set in the good data which are cleared in the bad data.
π§ I/O STAGES π§
The ZFS I/O pipeline is made up of a bunch of stages, all defined below. Those individual stages get combined to build these basic I/O operations: Read, Write, Free, Claim, Flush and Trim. And a stage can get set on an event to describe the life cycle of a given I/O request. Main character journey, fr. π
ZIO_STAGE_OPENβ bit mask0x00000001β operations:RWFCXTZIO_STAGE_READ_BP_INITβ bit mask0x00000002β operations:R-----ZIO_STAGE_WRITE_BP_INITβ bit mask0x00000004β operations:-W----ZIO_STAGE_FREE_BP_INITβ bit mask0x00000008β operations:--F---ZIO_STAGE_ISSUE_ASYNCβ bit mask0x00000010β operations:-WF--TZIO_STAGE_WRITE_COMPRESSβ bit mask0x00000020β operations:-W----ZIO_STAGE_ENCRYPTβ bit mask0x00000040β operations:-W----ZIO_STAGE_CHECKSUM_GENERATEβ bit mask0x00000080β operations:-W----ZIO_STAGE_NOP_WRITEβ bit mask0x00000100β operations:-W----ZIO_STAGE_DDT_READ_STARTβ bit mask0x00000200β operations:R-----ZIO_STAGE_DDT_READ_DONEβ bit mask0x00000400β operations:R-----ZIO_STAGE_DDT_WRITEβ bit mask0x00000800β operations:-W----ZIO_STAGE_DDT_FREEβ bit mask0x00001000β operations:--F---ZIO_STAGE_BRT_FREEβ bit mask0x00002000β operations:--F---ZIO_STAGE_GANG_ASSEMBLEβ bit mask0x00004000β operations:RWFC--ZIO_STAGE_GANG_ISSUEβ bit mask0x00008000β operations:RWFC--ZIO_STAGE_DVA_THROTTLEβ bit mask0x00010000β operations:-W----ZIO_STAGE_DVA_ALLOCATEβ bit mask0x00020000β operations:-W----ZIO_STAGE_DVA_FREEβ bit mask0x00040000β operations:--F---ZIO_STAGE_DVA_CLAIMβ bit mask0x00080000β operations:---C--ZIO_STAGE_READYβ bit mask0x00100000β operations:RWFCITZIO_STAGE_VDEV_IO_STARTβ bit mask0x00200000β operations:RW--XTZIO_STAGE_VDEV_IO_DONEβ bit mask0x00400000β operations:RW--XTZIO_STAGE_VDEV_IO_ASSESSβ bit mask0x00800000β operations:RW--XTZIO_STAGE_CHECKSUM_VERIFYβ bit mask0x01000000β operations:R-----ZIO_STAGE_DIO_CHECKSUM_VERIFYβ bit mask0x02000000β operations:-W----ZIO_STAGE_DONEβ bit mask0x04000000β operations:RWFCXT
π© I/O FLAGS π©
Every single I/O request in the pipeline carries a set of flags that describe what it's doing and govern how it behaves. These flags get set in an event as a zio_flags payload entry. π
ZIO_FLAG_DONT_AGGREGATEβ bit mask0x00000001ZIO_FLAG_IO_REPAIRβ bit mask0x00000002ZIO_FLAG_SELF_HEALβ bit mask0x00000004ZIO_FLAG_RESILVERβ bit mask0x00000008ZIO_FLAG_SCRUBβ bit mask0x00000010ZIO_FLAG_SCAN_THREADβ bit mask0x00000020ZIO_FLAG_PHYSICALβ bit mask0x00000040ZIO_FLAG_CANFAILβ bit mask0x00000080ZIO_FLAG_SPECULATIVEβ bit mask0x00000100ZIO_FLAG_CONFIG_WRITERβ bit mask0x00000200ZIO_FLAG_DONT_RETRYβ bit mask0x00000400ZIO_FLAG_NODATAβ bit mask0x00001000ZIO_FLAG_INDUCE_DAMAGEβ bit mask0x00002000ZIO_FLAG_ALLOC_THROTTLEDβ bit mask0x00004000ZIO_FLAG_IO_RETRYβ bit mask0x00008000ZIO_FLAG_PROBEβ bit mask0x00010000ZIO_FLAG_TRYHARDβ bit mask0x00020000ZIO_FLAG_OPTIONALβ bit mask0x00040000ZIO_FLAG_DONT_QUEUEβ bit mask0x00080000ZIO_FLAG_DONT_PROPAGATEβ bit mask0x00100000ZIO_FLAG_IO_BYPASSβ bit mask0x00200000ZIO_FLAG_IO_REWRITEβ bit mask0x00400000ZIO_FLAG_RAW_COMPRESSβ bit mask0x00800000ZIO_FLAG_RAW_ENCRYPTβ bit mask0x01000000ZIO_FLAG_GANG_CHILDβ bit mask0x02000000ZIO_FLAG_DDT_CHILDβ bit mask0x04000000ZIO_FLAG_GODFATHERβ bit mask0x08000000ZIO_FLAG_NOPWRITEβ bit mask0x10000000ZIO_FLAG_REEXECUTEDβ bit mask0x20000000ZIO_FLAG_DELEGATEDβ bit mask0x40000000ZIO_FLAG_FASTWRITEβ bit mask0x80000000
π― I/O TYPES π―
Every I/O request in the pipeline has exactly one type value. That value describes the kind of low-level work the I/O represents, and it gets set in an event as a zio_type payload entry. One job, one label, periodt. πΈ
ZIO_TYPE_NULLβ value0x0β internal I/O sync pointZIO_TYPE_READβ value0x1β data readZIO_TYPE_WRITEβ value0x2β data writeZIO_TYPE_FREEβ value0x3β block freeZIO_TYPE_CLAIMβ value0x4β block claim (ZIL replay)ZIO_TYPE_FLUSHβ value0x5β disk cache flush requestZIO_TYPE_TRIMβ value0x6β trim (discard)
π I/O PRIORITIES π
ok so every single I/O request floatin' around in the pipeline has exactly one priority value, bestie. just the one. and the queuing code uses it to decide which I/O gets to go next β like a lil line at the club and the bouncer's checkin' priorities π
. this value shows up in an event as the zio_priority payload entry, so you can ~literally~ see it. slay.
ZIO_PRIORITY_SYNC_READβ0x0β no description given, it's just the vibe β¨ZIO_PRIORITY_SYNC_WRITEβ0x1β ZILZIO_PRIORITY_ASYNC_READβ0x2β prefetchZIO_PRIORITY_ASYNC_WRITEβ0x3βspa_sync()ZIO_PRIORITY_SCRUBβ0x4β asynchronous scrub/resilver readsZIO_PRIORITY_REMOVALβ0x5β reads/writes for vdev removalZIO_PRIORITY_INITIALIZINGβ0x6β initializing I/OZIO_PRIORITY_TRIMβ0x7β trim I/O (discard)ZIO_PRIORITY_REBUILDβ0x8β reads/writes for vdev rebuildZIO_PRIORITY_NOWβ0xaβ non-queued i/os (e.g. free)
ngl if you noticed 0x9 isn't in the listβ¦ yeah. that's just how it is. no cap, that's the original, we don't make the rules π
π SEE ALSO π
go read these next, fr fr β they're the whole friend group:
ok and that's the whole page, bestie!! π you made it to the end of part 3, which means you now know everything about zpool events, and honestly? main character energy. go forth and zpool events responsibly π
this icon was brought to you by OpenZFS, dated July 3, 2025, and filed under ZPOOL-EVENTS(8) β periodt. π¦β¨
π¦ where this page comes from
- alpine 3.23: zfs-doc 2.4.4-r0 Β· CDDL-1.0
- alpine 3.24: zfs-doc 2.4.4-r0 Β· CDDL-1.0
- nixos 26.05: zfs-user 2.4.4
- nixpkgs unstable: zfs-user 2.4.4
- ubuntu stonking: zfsutils-linux 2.4.4-1ubuntu4 Β· CDDL-1.0
- π the page's license: CDDL-1.0
- Copyright (c) 2007, Sun Microsystems, Inc. All Rights Reserved
- Copyright (c) 2012, 2018 by Delphix. All rights reserved
- Copyright (c) 2012 Cyril Plisko. All Rights Reserved
- Copyright (c) 2017 Datto Inc
- Copyright (c) 2018 George Melikov. All Rights Reserved
- Copyright 2017 Nexenta Systems, Inc
- Copyright (c) 2017 Open-E, Inc. All Rights Reserved
- Copyright (c) 2024, 2025, Klara, Inc
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms