diff options
author | Tom Erickson <Tom.Erickson@Sun.COM> | 2009-11-09 20:45:32 -0800 |
---|---|---|
committer | Tom Erickson <Tom.Erickson@Sun.COM> | 2009-11-09 20:45:32 -0800 |
commit | 92241e0b80813d0b83c08e730a29b9d1831794fc (patch) | |
tree | ae911ea5f6928508430420730ad8dba20b5b3aa2 /usr/src/uts/common/fs/zfs/zap.c | |
parent | 8d4cf8d8d2965ea43bccdc838f15c18634fee02d (diff) | |
download | illumos-gate-92241e0b80813d0b83c08e730a29b9d1831794fc.tar.gz |
PSARC 2009/510 ZFS received properties
6850025 want to preserve local properties for zfs_recv
6839260 want zfs send with properties
6855486 zfs_receive should keep trying to set properties even after some fail
6850030 snapshots on read-only dataset shouldn't affect zfs_receive
Diffstat (limited to 'usr/src/uts/common/fs/zfs/zap.c')
-rw-r--r-- | usr/src/uts/common/fs/zfs/zap.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/usr/src/uts/common/fs/zfs/zap.c b/usr/src/uts/common/fs/zfs/zap.c index 23138db8ed..6779d3650b 100644 --- a/usr/src/uts/common/fs/zfs/zap.c +++ b/usr/src/uts/common/fs/zfs/zap.c @@ -706,13 +706,17 @@ zap_put_leaf_maybe_grow_ptrtbl(zap_name_t *zn, zap_leaf_t *l, dmu_tx_t *tx) } } - static int -fzap_checksize(zap_name_t *zn, uint64_t integer_size, uint64_t num_integers) +fzap_checkname(zap_name_t *zn) { if (zn->zn_key_orig_len > ZAP_MAXNAMELEN) - return (E2BIG); + return (ENAMETOOLONG); + return (0); +} +static int +fzap_checksize(uint64_t integer_size, uint64_t num_integers) +{ /* Only integer sizes supported by C */ switch (integer_size) { case 1: @@ -730,6 +734,16 @@ fzap_checksize(zap_name_t *zn, uint64_t integer_size, uint64_t num_integers) return (0); } +static int +fzap_check(zap_name_t *zn, uint64_t integer_size, uint64_t num_integers) +{ + int err; + + if ((err = fzap_checkname(zn)) != 0) + return (err); + return (fzap_checksize(integer_size, num_integers)); +} + /* * Routines for manipulating attributes. */ @@ -742,8 +756,7 @@ fzap_lookup(zap_name_t *zn, int err; zap_entry_handle_t zeh; - err = fzap_checksize(zn, integer_size, num_integers); - if (err != 0) + if ((err = fzap_checkname(zn)) != 0) return (err); err = zap_deref_leaf(zn->zn_zap, zn->zn_hash, NULL, RW_READER, &l); @@ -751,6 +764,11 @@ fzap_lookup(zap_name_t *zn, return (err); err = zap_leaf_lookup(l, zn, &zeh); if (err == 0) { + if ((err = fzap_checksize(integer_size, num_integers)) != 0) { + zap_put_leaf(l); + return (err); + } + err = zap_entry_read(&zeh, integer_size, num_integers, buf); (void) zap_entry_read_name(zn->zn_zap, &zeh, rn_len, realname); if (ncp) { @@ -775,7 +793,7 @@ fzap_add_cd(zap_name_t *zn, ASSERT(RW_LOCK_HELD(&zap->zap_rwlock)); ASSERT(!zap->zap_ismicro); - ASSERT(fzap_checksize(zn, integer_size, num_integers) == 0); + ASSERT(fzap_check(zn, integer_size, num_integers) == 0); err = zap_deref_leaf(zap, zn->zn_hash, tx, RW_WRITER, &l); if (err != 0) @@ -812,7 +830,7 @@ fzap_add(zap_name_t *zn, uint64_t integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx) { - int err = fzap_checksize(zn, integer_size, num_integers); + int err = fzap_check(zn, integer_size, num_integers); if (err != 0) return (err); @@ -830,7 +848,7 @@ fzap_update(zap_name_t *zn, zap_t *zap = zn->zn_zap; ASSERT(RW_LOCK_HELD(&zap->zap_rwlock)); - err = fzap_checksize(zn, integer_size, num_integers); + err = fzap_check(zn, integer_size, num_integers); if (err != 0) return (err); @@ -1018,8 +1036,6 @@ fzap_cursor_retrieve(zap_t *zap, zap_cursor_t *zc, zap_attribute_t *za) zap_entry_handle_t zeh; zap_leaf_t *l; - /* memset(za, 0xba, sizeof (zap_attribute_t)); */ - /* retrieve the next entry at or after zc_hash/zc_cd */ /* if no entry, return ENOENT */ @@ -1117,7 +1133,7 @@ fzap_cursor_move_to_key(zap_cursor_t *zc, zap_name_t *zn) zap_entry_handle_t zeh; if (zn->zn_key_orig_len > ZAP_MAXNAMELEN) - return (E2BIG); + return (ENAMETOOLONG); err = zap_deref_leaf(zc->zc_zap, zn->zn_hash, NULL, RW_READER, &l); if (err != 0) |