Print this page
3740 Poor ZFS send / receive performance due to snapshot hold / release processing
Submitted by: Steven Hartland <steven.hartland@multiplay.co.uk>
*** 344,358 ****
* In this case, when the cleanup_fd is closed (including on process
* termination), the holds will be released. If the system is shut down
* uncleanly, the holds will be released when the pool is next opened
* or imported.
*
! * The return value will be 0 if all holds were created. Otherwise the return
! * value will be the errno of a (unspecified) hold that failed, no holds will
! * be created, and the errlist will have an entry for each hold that
! * failed (name = snapshot). The value in the errlist will be the error
! * code (int32).
*/
int
lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist)
{
char pool[MAXNAMELEN];
--- 344,369 ----
* In this case, when the cleanup_fd is closed (including on process
* termination), the holds will be released. If the system is shut down
* uncleanly, the holds will be released when the pool is next opened
* or imported.
*
! * Holds for snapshots which don't exist will be skipped and have an entry
! * added to errlist, but will not cause an overall failure, except in the
! * case that all holds where skipped.
! *
! * The return value will be 0 if the nvl holds was empty or all holds, for
! * snapshots that existed, were succesfully created and at least one hold
! * was created.
! *
! * If none of the snapshots for the requested holds existed ENOENT will be
! * returned.
! *
! * Otherwise the return value will be the errno of a (unspecified) hold that
! * failed, no holds will be created.
! *
! * In all cases the errlist will have an entry for each hold that failed
! * (name = snapshot), with its value being the error code (int32).
*/
int
lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist)
{
char pool[MAXNAMELEN];
*** 385,399 ****
*
* The keys in the nvlist are snapshot names.
* The snapshots must all be in the same pool.
* The value is a nvlist whose keys are the holds to remove.
*
! * The return value will be 0 if all holds were removed.
! * Otherwise the return value will be the errno of a (unspecified) release
! * that failed, no holds will be released, and the errlist will have an
! * entry for each snapshot that has failed releases (name = snapshot).
! * The value in the errlist will be the error code (int32) of a failed release.
*/
int
lzc_release(nvlist_t *holds, nvlist_t **errlist)
{
char pool[MAXNAMELEN];
--- 396,418 ----
*
* The keys in the nvlist are snapshot names.
* The snapshots must all be in the same pool.
* The value is a nvlist whose keys are the holds to remove.
*
! * Holds which failed to release because they didn't exist will have an entry
! * added to errlist, but will not cause an overall failure.
! *
! * The return value will be 0 if the nvl holds was empty or all holds, that
! * existed, were succesfully removed and at least one hold was removed.
! *
! * If none of the holds specified existed ENOENT will be returned.
! *
! * Otherwise the return value will be the errno of a (unspecified) hold that
! * failed to release and no holds will be released.
! *
! * In all cases the errlist will have an entry for each hold that failed to
! * to release.
*/
int
lzc_release(nvlist_t *holds, nvlist_t **errlist)
{
char pool[MAXNAMELEN];