mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
Implemented zpool sync command
This addition will enable us to sync an open TXG to the main pool on demand. The functionality is similar to 'sync(2)' but 'zpool sync' will return when data has hit the main storage instead of potentially just the ZIL as is the case with the 'sync(2)' cmd. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed by: Matthew Ahrens <mahrens@delphix.com> Signed-off-by: Alek Pinchuk <apinchuk@datto.com> Closes #6122
This commit is contained in:
@@ -34,6 +34,7 @@
|
||||
* Copyright 2016 Toomas Soome <tsoome@me.com>
|
||||
* Copyright (c) 2016 Actifio, Inc. All rights reserved.
|
||||
* Copyright (c) 2017, loli10K <ezomori.nozomu@gmail.com>. All rights reserved.
|
||||
* Copyright (c) 2017 Datto Inc.
|
||||
*/
|
||||
|
||||
/*
|
||||
@@ -5466,6 +5467,7 @@ zfs_ioc_hold(const char *pool, nvlist_t *args, nvlist_t *errlist)
|
||||
static int
|
||||
zfs_ioc_get_holds(const char *snapname, nvlist_t *args, nvlist_t *outnvl)
|
||||
{
|
||||
ASSERT3P(args, ==, NULL);
|
||||
return (dsl_dataset_get_holds(snapname, outnvl));
|
||||
}
|
||||
|
||||
@@ -5823,6 +5825,44 @@ out:
|
||||
return (error);
|
||||
}
|
||||
|
||||
/*
|
||||
* Sync the currently open TXG to disk for the specified pool.
|
||||
* This is somewhat similar to 'zfs_sync()'.
|
||||
* For cases that do not result in error this ioctl will wait for
|
||||
* the currently open TXG to commit before returning back to the caller.
|
||||
*
|
||||
* innvl: {
|
||||
* "force" -> when true, force uberblock update even if there is no dirty data.
|
||||
* In addition this will cause the vdev configuration to be written
|
||||
* out including updating the zpool cache file. (boolean_t)
|
||||
* }
|
||||
*
|
||||
* onvl is unused
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static int
|
||||
zfs_ioc_pool_sync(const char *pool, nvlist_t *innvl, nvlist_t *onvl)
|
||||
{
|
||||
int err;
|
||||
boolean_t force;
|
||||
spa_t *spa;
|
||||
|
||||
if ((err = spa_open(pool, &spa, FTAG)) != 0)
|
||||
return (err);
|
||||
|
||||
force = fnvlist_lookup_boolean_value(innvl, "force");
|
||||
if (force) {
|
||||
spa_config_enter(spa, SCL_CONFIG, FTAG, RW_WRITER);
|
||||
vdev_config_dirty(spa->spa_root_vdev);
|
||||
spa_config_exit(spa, SCL_CONFIG, FTAG);
|
||||
}
|
||||
txg_wait_synced(spa_get_dsl(spa), 0);
|
||||
|
||||
spa_close(spa, FTAG);
|
||||
|
||||
return (err);
|
||||
}
|
||||
|
||||
static zfs_ioc_vec_t zfs_ioc_vec[ZFS_IOC_LAST - ZFS_IOC_FIRST];
|
||||
|
||||
static void
|
||||
@@ -5995,6 +6035,10 @@ zfs_ioctl_init(void)
|
||||
zfs_ioc_recv_new, zfs_secpolicy_recv_new, DATASET_NAME,
|
||||
POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_TRUE, B_TRUE);
|
||||
|
||||
zfs_ioctl_register("sync", ZFS_IOC_POOL_SYNC,
|
||||
zfs_ioc_pool_sync, zfs_secpolicy_none, POOL_NAME,
|
||||
POOL_CHECK_SUSPENDED | POOL_CHECK_READONLY, B_FALSE, B_FALSE);
|
||||
|
||||
/* IOCTLS that use the legacy function signature */
|
||||
|
||||
zfs_ioctl_register_legacy(ZFS_IOC_POOL_FREEZE, zfs_ioc_pool_freeze,
|
||||
|
||||
Reference in New Issue
Block a user