From 17c863fa035ff6226aa3f1ec076dd05ea78255f9 Mon Sep 17 00:00:00 2001 From: Andrew Date: Fri, 17 Jun 2022 13:44:49 -0500 Subject: [PATCH] expose snapshot count via stat(2) of .zfs/snapshot (#13559) Increase nlinks in stat results of ./zfs/snapshot based on snapshot count. This provides quick and efficient method for administrators to get snapshot counts without having to use libzfs or list the snapdir contents. Reviewed-by: Ryan Moeller Reviewed-by: Brian Behlendorf Signed-off-by: Andrew Walker Closes #13559 --- module/os/linux/zfs/zpl_ctldir.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/module/os/linux/zfs/zpl_ctldir.c b/module/os/linux/zfs/zpl_ctldir.c index f4e1ab7aef08..d5c222120a9d 100644 --- a/module/os/linux/zfs/zpl_ctldir.c +++ b/module/os/linux/zfs/zpl_ctldir.c @@ -32,6 +32,9 @@ #include #include #include +#include +#include +#include /* * Common open routine. Disallow any write access. @@ -411,6 +414,20 @@ zpl_snapdir_getattr_impl(const struct path *path, struct kstat *stat, #endif stat->nlink = stat->size = 2; + + dsl_dataset_t *ds = dmu_objset_ds(zfsvfs->z_os); + if (dsl_dataset_phys(ds)->ds_snapnames_zapobj != 0) { + uint64_t snap_count; + int err = zap_count( + dmu_objset_pool(ds->ds_objset)->dp_meta_objset, + dsl_dataset_phys(ds)->ds_snapnames_zapobj, &snap_count); + if (err != 0) { + ZPL_EXIT(zfsvfs); + return (-err); + } + stat->nlink += snap_count; + } + stat->ctime = stat->mtime = dmu_objset_snap_cmtime(zfsvfs->z_os); stat->atime = current_time(ip); ZPL_EXIT(zfsvfs);