mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Change the error handling for invalid property values
ZFS recv should return a useful error message when an invalid index property value is provided in the send stream properties nvlist With a compression= property outside of the understood range: Before: ``` receiving full stream of zof/zstd_send@send2 into testpool/recv@send2 internal error: Invalid argument Aborted (core dumped) ``` Note: the recv completes successfully, the abort() is likely just to make it easier to track the unexpected error code. After: ``` receiving full stream of zof/zstd_send@send2 into testpool/recv@send2 cannot receive compression property on testpool/recv: invalid property value received 28.9M stream in 1 seconds (28.9M/sec) ``` Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Allan Jude <allan@klarasystems.com> Closes #10631
This commit is contained in:
		
							parent
							
								
									47ed79ff60
								
							
						
					
					
						commit
						8fb79fdddb
					
				@ -98,6 +98,7 @@ zfs_errno = enum_with_offset(1024, [
 | 
				
			|||||||
        'ZFS_ERR_STREAM_LARGE_BLOCK_MISMATCH',
 | 
					        'ZFS_ERR_STREAM_LARGE_BLOCK_MISMATCH',
 | 
				
			||||||
        'ZFS_ERR_RESILVER_IN_PROGRESS',
 | 
					        'ZFS_ERR_RESILVER_IN_PROGRESS',
 | 
				
			||||||
        'ZFS_ERR_REBUILD_IN_PROGRESS',
 | 
					        'ZFS_ERR_REBUILD_IN_PROGRESS',
 | 
				
			||||||
 | 
					        'ZFS_ERR_BADPROP',
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    {}
 | 
					    {}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
@ -110,5 +111,4 @@ ZFS_ERR_DEVRM_IN_PROGRESS = zfs_errno.ZFS_ERR_DEVRM_IN_PROGRESS
 | 
				
			|||||||
ZFS_ERR_VDEV_TOO_BIG = zfs_errno.ZFS_ERR_VDEV_TOO_BIG
 | 
					ZFS_ERR_VDEV_TOO_BIG = zfs_errno.ZFS_ERR_VDEV_TOO_BIG
 | 
				
			||||||
ZFS_ERR_WRONG_PARENT = zfs_errno.ZFS_ERR_WRONG_PARENT
 | 
					ZFS_ERR_WRONG_PARENT = zfs_errno.ZFS_ERR_WRONG_PARENT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
# vim: softtabstop=4 tabstop=4 expandtab shiftwidth=4
 | 
					# vim: softtabstop=4 tabstop=4 expandtab shiftwidth=4
 | 
				
			||||||
 | 
				
			|||||||
@ -59,6 +59,8 @@ def lzc_create_translate_error(ret, name, ds_type, props):
 | 
				
			|||||||
        raise lzc_exc.ParentNotFound(name)
 | 
					        raise lzc_exc.ParentNotFound(name)
 | 
				
			||||||
    if ret == ZFS_ERR_WRONG_PARENT:
 | 
					    if ret == ZFS_ERR_WRONG_PARENT:
 | 
				
			||||||
        raise lzc_exc.WrongParent(_fs_name(name))
 | 
					        raise lzc_exc.WrongParent(_fs_name(name))
 | 
				
			||||||
 | 
					    if ret == zfs_errno.ZFS_ERR_BADPROP:
 | 
				
			||||||
 | 
					        raise lzc_exc.PropertyInvalid(name)
 | 
				
			||||||
    raise _generic_exception(ret, name, "Failed to create filesystem")
 | 
					    raise _generic_exception(ret, name, "Failed to create filesystem")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -420,6 +422,8 @@ def lzc_receive_translate_errors(
 | 
				
			|||||||
            def _map(ret, name):
 | 
					            def _map(ret, name):
 | 
				
			||||||
                if ret == errno.EINVAL:
 | 
					                if ret == errno.EINVAL:
 | 
				
			||||||
                    return lzc_exc.PropertyInvalid(name)
 | 
					                    return lzc_exc.PropertyInvalid(name)
 | 
				
			||||||
 | 
					                if ret == zfs_errno.ZFS_ERR_BADPROP:
 | 
				
			||||||
 | 
					                    return lzc_exc.PropertyInvalid(name)
 | 
				
			||||||
                return _generic_exception(ret, name, "Failed to set property")
 | 
					                return _generic_exception(ret, name, "Failed to set property")
 | 
				
			||||||
            _handle_err_list(
 | 
					            _handle_err_list(
 | 
				
			||||||
                errno.EINVAL, properrs, [snapname],
 | 
					                errno.EINVAL, properrs, [snapname],
 | 
				
			||||||
@ -471,6 +475,8 @@ def lzc_receive_translate_errors(
 | 
				
			|||||||
        raise lzc_exc.WrongParent(_fs_name(snapname))
 | 
					        raise lzc_exc.WrongParent(_fs_name(snapname))
 | 
				
			||||||
    if ret == zfs_errno.ZFS_ERR_STREAM_TRUNCATED:
 | 
					    if ret == zfs_errno.ZFS_ERR_STREAM_TRUNCATED:
 | 
				
			||||||
        raise lzc_exc.StreamTruncated()
 | 
					        raise lzc_exc.StreamTruncated()
 | 
				
			||||||
 | 
					    if ret == zfs_errno.ZFS_ERR_BADPROP:
 | 
				
			||||||
 | 
					        raise lzc_exc.PropertyInvalid(snapname)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    raise lzc_exc.StreamIOError(ret)
 | 
					    raise lzc_exc.StreamIOError(ret)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1366,6 +1366,7 @@ typedef enum {
 | 
				
			|||||||
	ZFS_ERR_STREAM_LARGE_BLOCK_MISMATCH,
 | 
						ZFS_ERR_STREAM_LARGE_BLOCK_MISMATCH,
 | 
				
			||||||
	ZFS_ERR_RESILVER_IN_PROGRESS,
 | 
						ZFS_ERR_RESILVER_IN_PROGRESS,
 | 
				
			||||||
	ZFS_ERR_REBUILD_IN_PROGRESS,
 | 
						ZFS_ERR_REBUILD_IN_PROGRESS,
 | 
				
			||||||
 | 
						ZFS_ERR_BADPROP,
 | 
				
			||||||
} zfs_errno_t;
 | 
					} zfs_errno_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,10 @@
 | 
				
			|||||||
 * Copyright (c) 2011, 2020 by Delphix. All rights reserved.
 | 
					 * Copyright (c) 2011, 2020 by Delphix. All rights reserved.
 | 
				
			||||||
 * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
 | 
					 * Copyright 2016 Igor Kozhukhov <ikozhukhov@gmail.com>
 | 
				
			||||||
 * Copyright (c) 2017 Datto Inc.
 | 
					 * Copyright (c) 2017 Datto Inc.
 | 
				
			||||||
 | 
					 * Copyright (c) 2020 The FreeBSD Foundation
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Portions of this software were developed by Allan Jude
 | 
				
			||||||
 | 
					 * under sponsorship from the FreeBSD Foundation.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
@ -475,6 +479,9 @@ zfs_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
 | 
				
			|||||||
	case ZFS_ERR_WRONG_PARENT:
 | 
						case ZFS_ERR_WRONG_PARENT:
 | 
				
			||||||
		zfs_verror(hdl, EZFS_WRONG_PARENT, fmt, ap);
 | 
							zfs_verror(hdl, EZFS_WRONG_PARENT, fmt, ap);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case ZFS_ERR_BADPROP:
 | 
				
			||||||
 | 
							zfs_verror(hdl, EZFS_BADPROP, fmt, ap);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
		zfs_error_aux(hdl, strerror(error));
 | 
							zfs_error_aux(hdl, strerror(error));
 | 
				
			||||||
		zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
 | 
							zfs_verror(hdl, EZFS_UNKNOWN, fmt, ap);
 | 
				
			||||||
@ -567,6 +574,10 @@ zfs_setprop_error(libzfs_handle_t *hdl, zfs_prop_t prop, int err,
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case ZFS_ERR_BADPROP:
 | 
				
			||||||
 | 
							(void) zfs_error(hdl, EZFS_BADPROP, errbuf);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	case EACCES:
 | 
						case EACCES:
 | 
				
			||||||
		if (prop == ZFS_PROP_KEYLOCATION) {
 | 
							if (prop == ZFS_PROP_KEYLOCATION) {
 | 
				
			||||||
			zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
 | 
								zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
 | 
				
			||||||
@ -703,6 +714,9 @@ zpool_standard_error_fmt(libzfs_handle_t *hdl, int error, const char *fmt, ...)
 | 
				
			|||||||
	case ZFS_ERR_REBUILD_IN_PROGRESS:
 | 
						case ZFS_ERR_REBUILD_IN_PROGRESS:
 | 
				
			||||||
		zfs_verror(hdl, EZFS_REBUILDING, fmt, ap);
 | 
							zfs_verror(hdl, EZFS_REBUILDING, fmt, ap);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
						case ZFS_ERR_BADPROP:
 | 
				
			||||||
 | 
							zfs_verror(hdl, EZFS_BADPROP, fmt, ap);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
	case ZFS_ERR_IOC_CMD_UNAVAIL:
 | 
						case ZFS_ERR_IOC_CMD_UNAVAIL:
 | 
				
			||||||
		zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
 | 
							zfs_error_aux(hdl, dgettext(TEXT_DOMAIN, "the loaded zfs "
 | 
				
			||||||
		    "module does not support this operation. A reboot may "
 | 
							    "module does not support this operation. A reboot may "
 | 
				
			||||||
 | 
				
			|||||||
@ -2591,7 +2591,8 @@ retry:
 | 
				
			|||||||
				case PROP_TYPE_INDEX:
 | 
									case PROP_TYPE_INDEX:
 | 
				
			||||||
					if (zfs_prop_index_to_string(prop,
 | 
										if (zfs_prop_index_to_string(prop,
 | 
				
			||||||
					    intval, &unused) != 0)
 | 
										    intval, &unused) != 0)
 | 
				
			||||||
						err = SET_ERROR(EINVAL);
 | 
											err =
 | 
				
			||||||
 | 
											    SET_ERROR(ZFS_ERR_BADPROP);
 | 
				
			||||||
					break;
 | 
										break;
 | 
				
			||||||
				default:
 | 
									default:
 | 
				
			||||||
					cmn_err(CE_PANIC,
 | 
										cmn_err(CE_PANIC,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user