]> granicus.if.org Git - zfs/commitdiff
OpenZFS 6314 - buffer overflow in dsl_dataset_name
authorIgor Kozhukhov <ikozhukhov@gmail.com>
Wed, 15 Jun 2016 21:28:36 +0000 (14:28 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Tue, 28 Jun 2016 20:47:03 +0000 (13:47 -0700)
Reviewed by: George Wilson <george.wilson@delphix.com>
Reviewed by: Prakash Surya <prakash.surya@delphix.com>
Reviewed by: Igor Kozhukhov <ikozhukhov@gmail.com>
Approved by: Dan McDonald <danmcd@omniti.com>
Ported-by: Brian Behlendorf <behlendorf1@llnl.gov>
OpenZFS-issue: https://www.illumos.org/issues/6314
OpenZFS-commit: https://github.com/openzfs/openzfs/commit/d6160ee

41 files changed:
cmd/zdb/zdb.c
cmd/zfs/zfs_main.c
cmd/zhack/zhack.c
cmd/ztest/ztest.c
cmd/zvol_id/zvol_id_main.c
config/kernel-kobj-name-len.m4 [deleted file]
config/kernel.m4
include/libzfs.h
include/libzfs_impl.h
include/sys/dmu.h
include/sys/dsl_dataset.h
include/sys/dsl_dir.h
include/sys/fs/zfs.h
include/sys/spa_impl.h
include/sys/zap.h
include/sys/zfs_znode.h
lib/libzfs/libzfs_changelist.c
lib/libzfs/libzfs_dataset.c
lib/libzfs/libzfs_diff.c
lib/libzfs/libzfs_iter.c
lib/libzfs/libzfs_mount.c
lib/libzfs/libzfs_pool.c
lib/libzfs/libzfs_sendrecv.c
lib/libzfs_core/libzfs_core.c
module/zcommon/zfs_namecheck.c
module/zfs/dmu_objset.c
module/zfs/dmu_send.c
module/zfs/dsl_bookmark.c
module/zfs/dsl_dataset.c
module/zfs/dsl_deleg.c
module/zfs/dsl_dir.c
module/zfs/dsl_prop.c
module/zfs/dsl_scan.c
module/zfs/dsl_userhold.c
module/zfs/spa.c
module/zfs/spa_history.c
module/zfs/zfs_ctldir.c
module/zfs/zfs_ioctl.c
module/zfs/zfs_vfsops.c
module/zfs/zil.c
module/zfs/zpl_inode.c

index ee5e21f1001233a6a475bc4ce724c36148bb5838..967d74216c060a88aaaf50be6d0850fc36d1d220 100644 (file)
@@ -60,7 +60,6 @@
 #include <sys/ddt.h>
 #include <sys/zfeature.h>
 #include <zfs_comutil.h>
-#undef ZFS_MAXNAMELEN
 #include <libzfs.h>
 
 #define        ZDB_COMPRESS_NAME(idx) ((idx) < ZIO_COMPRESS_FUNCTIONS ?        \
@@ -2005,7 +2004,7 @@ dump_dir(objset_t *os)
        uint64_t refdbytes, usedobjs, scratch;
        char numbuf[32];
        char blkbuf[BP_SPRINTF_LEN + 20];
-       char osname[MAXNAMELEN];
+       char osname[ZFS_MAX_DATASET_NAME_LEN];
        char *type = "UNKNOWN";
        int verbosity = dump_opt['d'];
        int print_header = 1;
@@ -3553,7 +3552,7 @@ find_zpool(char **target, nvlist_t **configp, int dirc, char **dirv)
        nvlist_t *match = NULL;
        char *name = NULL;
        char *sepp = NULL;
-       char sep = 0;
+       char sep = '\0';
        int count = 0;
        importargs_t args = { 0 };
 
index 3d20973a200e78975324a9e8e470f00835f77f4b..e8a4421ccf872f88125614773c96250522401348 100644 (file)
@@ -1483,7 +1483,7 @@ get_callback(zfs_handle_t *zhp, void *data)
        char buf[ZFS_MAXPROPLEN];
        char rbuf[ZFS_MAXPROPLEN];
        zprop_source_t sourcetype;
-       char source[ZFS_MAXNAMELEN];
+       char source[ZFS_MAX_DATASET_NAME_LEN];
        zprop_get_cbdata_t *cbp = data;
        nvlist_t *user_props = zfs_get_user_props(zhp);
        zprop_list_t *pl = cbp->cb_proplist;
@@ -1963,7 +1963,7 @@ typedef struct upgrade_cbdata {
        uint64_t cb_version;
        boolean_t cb_newer;
        boolean_t cb_foundone;
-       char cb_lastfs[ZFS_MAXNAMELEN];
+       char cb_lastfs[ZFS_MAX_DATASET_NAME_LEN];
 } upgrade_cbdata_t;
 
 static int
@@ -2412,7 +2412,7 @@ userspace_cb(void *arg, const char *domain, uid_t rid, uint64_t space)
        if (domain != NULL && domain[0] != '\0') {
 #ifdef HAVE_IDMAP
                /* SMB */
-               char sid[ZFS_MAXNAMELEN + 32];
+               char sid[MAXNAMELEN + 32];
                uid_t id;
                uint64_t classes;
                int err;
@@ -2546,7 +2546,7 @@ print_us_node(boolean_t scripted, boolean_t parsable, int *fields, int types,
     size_t *width, us_node_t *node)
 {
        nvlist_t *nvl = node->usn_nvl;
-       char valstr[ZFS_MAXNAMELEN];
+       char valstr[MAXNAMELEN];
        boolean_t first = B_TRUE;
        int cfield = 0;
        int field;
@@ -3417,7 +3417,7 @@ zfs_do_rollback(int argc, char **argv)
        boolean_t force = B_FALSE;
        rollback_cbdata_t cb = { 0 };
        zfs_handle_t *zhp, *snap;
-       char parentname[ZFS_MAXNAMELEN];
+       char parentname[ZFS_MAX_DATASET_NAME_LEN];
        char *delim;
 
        /* check options */
@@ -3818,7 +3818,7 @@ zfs_do_send(int argc, char **argv)
         */
        if (strchr(argv[0], '@') == NULL ||
            (fromname && strchr(fromname, '#') != NULL)) {
-               char frombuf[ZFS_MAXNAMELEN];
+               char frombuf[ZFS_MAX_DATASET_NAME_LEN];
                enum lzc_send_flags lzc_flags = 0;
 
                if (flags.replicate || flags.doall || flags.props ||
@@ -3870,7 +3870,7 @@ zfs_do_send(int argc, char **argv)
         * case if they specify the origin.
         */
        if (fromname && (cp = strchr(fromname, '@')) != NULL) {
-               char origin[ZFS_MAXNAMELEN];
+               char origin[ZFS_MAX_DATASET_NAME_LEN];
                zprop_source_t src;
 
                (void) zfs_prop_get(zhp, ZFS_PROP_ORIGIN,
@@ -4004,7 +4004,7 @@ zfs_do_receive(int argc, char **argv)
                        usage(B_FALSE);
                }
 
-               char namebuf[ZFS_MAXNAMELEN];
+               char namebuf[ZFS_MAX_DATASET_NAME_LEN];
                (void) snprintf(namebuf, sizeof (namebuf),
                    "%s/%%recv", argv[0]);
 
@@ -4860,7 +4860,7 @@ store_allow_perm(zfs_deleg_who_type_t type, boolean_t local, boolean_t descend,
 {
        int i;
        char ld[2] = { '\0', '\0' };
-       char who_buf[ZFS_MAXNAMELEN+32];
+       char who_buf[MAXNAMELEN + 32];
        char base_type = ZFS_DELEG_WHO_UNKNOWN;
        char set_type = ZFS_DELEG_WHO_UNKNOWN;
        nvlist_t *base_nvl = NULL;
@@ -5224,7 +5224,7 @@ static void
 print_fs_perms(fs_perm_set_t *fspset)
 {
        fs_perm_node_t *node = NULL;
-       char buf[ZFS_MAXNAMELEN+32];
+       char buf[MAXNAMELEN + 32];
        const char *dsname = buf;
 
        for (node = uu_list_first(fspset->fsps_list); node != NULL;
@@ -5233,7 +5233,7 @@ print_fs_perms(fs_perm_set_t *fspset)
                uu_avl_t *uge_avl = node->fspn_fsperm.fsp_uge_avl;
                int left = 0;
 
-               (void) snprintf(buf, ZFS_MAXNAMELEN+32,
+               (void) snprintf(buf, sizeof (buf),
                    gettext("---- Permissions on %s "),
                    node->fspn_fsperm.fsp_name);
                (void) printf("%s", dsname);
@@ -5430,7 +5430,7 @@ zfs_do_hold_rele_impl(int argc, char **argv, boolean_t holding)
 
        for (i = 0; i < argc; ++i) {
                zfs_handle_t *zhp;
-               char parent[ZFS_MAXNAMELEN];
+               char parent[ZFS_MAX_DATASET_NAME_LEN];
                const char *delim;
                char *path = argv[i];
 
@@ -5558,7 +5558,7 @@ holds_callback(zfs_handle_t *zhp, void *data)
        nvlist_t *nvl = NULL;
        nvpair_t *nvp = NULL;
        const char *zname = zfs_get_name(zhp);
-       size_t znamelen = strnlen(zname, ZFS_MAXNAMELEN);
+       size_t znamelen = strlen(zname);
 
        if (cbp->cb_recursive) {
                const char *snapname;
@@ -5579,7 +5579,7 @@ holds_callback(zfs_handle_t *zhp, void *data)
 
        while ((nvp = nvlist_next_nvpair(nvl, nvp)) != NULL) {
                const char *tag = nvpair_name(nvp);
-               size_t taglen = strnlen(tag, MAXNAMELEN);
+               size_t taglen = strlen(tag);
                if (taglen > cbp->cb_max_taglen)
                        cbp->cb_max_taglen  = taglen;
        }
@@ -6695,7 +6695,7 @@ zfs_do_diff(int argc, char **argv)
 static int
 zfs_do_bookmark(int argc, char **argv)
 {
-       char snapname[ZFS_MAXNAMELEN];
+       char snapname[ZFS_MAX_DATASET_NAME_LEN];
        zfs_handle_t *zhp;
        nvlist_t *nvl;
        int ret = 0;
index eedd17c30710554c885f348bf101bad08f0d041e..cc4f174c661e9d40ecea8c7e63cea1ca74fb7a31 100644 (file)
@@ -48,7 +48,6 @@
 #include <sys/zio_compress.h>
 #include <sys/zfeature.h>
 #include <sys/dmu_tx.h>
-#undef ZFS_MAXNAMELEN
 #include <libzfs.h>
 
 extern boolean_t zfeature_checks_disable;
index ad15dea1d543ac60452a9b4f38c7549411e44c30..2cc410f10cb140a5eb5f6e52a4c679035ffe78ca 100644 (file)
@@ -145,8 +145,8 @@ typedef struct ztest_shared_hdr {
 static ztest_shared_hdr_t *ztest_shared_hdr;
 
 typedef struct ztest_shared_opts {
-       char zo_pool[MAXNAMELEN];
-       char zo_dir[MAXNAMELEN];
+       char zo_pool[ZFS_MAX_DATASET_NAME_LEN];
+       char zo_dir[ZFS_MAX_DATASET_NAME_LEN];
        char zo_alt_ztest[MAXNAMELEN];
        char zo_alt_libpath[MAXNAMELEN];
        uint64_t zo_vdevs;
@@ -262,7 +262,7 @@ typedef struct ztest_od {
        uint64_t        od_crdnodesize;
        uint64_t        od_gen;
        uint64_t        od_crgen;
-       char            od_name[MAXNAMELEN];
+       char            od_name[ZFS_MAX_DATASET_NAME_LEN];
 } ztest_od_t;
 
 /*
@@ -274,7 +274,7 @@ typedef struct ztest_ds {
        rwlock_t        zd_zilog_lock;
        zilog_t         *zd_zilog;
        ztest_od_t      *zd_od;         /* debugging aid */
-       char            zd_name[MAXNAMELEN];
+       char            zd_name[ZFS_MAX_DATASET_NAME_LEN];
        kmutex_t        zd_dirobj_lock;
        rll_t           zd_object_lock[ZTEST_OBJECT_LOCKS];
        zll_t           zd_range_lock[ZTEST_RANGE_LOCKS];
@@ -3504,7 +3504,7 @@ ztest_objset_destroy_cb(const char *name, void *arg)
 static boolean_t
 ztest_snapshot_create(char *osname, uint64_t id)
 {
-       char snapname[MAXNAMELEN];
+       char snapname[ZFS_MAX_DATASET_NAME_LEN];
        int error;
 
        (void) snprintf(snapname, sizeof (snapname), "%llu", (u_longlong_t)id);
@@ -3524,10 +3524,10 @@ ztest_snapshot_create(char *osname, uint64_t id)
 static boolean_t
 ztest_snapshot_destroy(char *osname, uint64_t id)
 {
-       char snapname[MAXNAMELEN];
+       char snapname[ZFS_MAX_DATASET_NAME_LEN];
        int error;
 
-       (void) snprintf(snapname, MAXNAMELEN, "%s@%llu", osname,
+       (void) snprintf(snapname, sizeof (snapname), "%s@%llu", osname,
            (u_longlong_t)id);
 
        error = dsl_destroy_snapshot(snapname, B_FALSE);
@@ -3544,16 +3544,15 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
        int iters;
        int error;
        objset_t *os, *os2;
-       char *name;
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        zilog_t *zilog;
        int i;
 
        zdtmp = umem_alloc(sizeof (ztest_ds_t), UMEM_NOFAIL);
-       name = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
 
        (void) rw_rdlock(&ztest_name_lock);
 
-       (void) snprintf(name, MAXNAMELEN, "%s/temp_%llu",
+       (void) snprintf(name, sizeof (name), "%s/temp_%llu",
            ztest_opts.zo_pool, (u_longlong_t)id);
 
        /*
@@ -3639,7 +3638,6 @@ ztest_dmu_objset_create_destroy(ztest_ds_t *zd, uint64_t id)
 out:
        (void) rw_unlock(&ztest_name_lock);
 
-       umem_free(name, MAXNAMELEN);
        umem_free(zdtmp, sizeof (ztest_ds_t));
 }
 
@@ -3668,22 +3666,22 @@ ztest_dsl_dataset_cleanup(char *osname, uint64_t id)
        char *snap3name;
        int error;
 
-       snap1name  = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       clone1name = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       snap2name  = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       clone2name = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       snap3name  = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-
-       (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu",
-           osname, (u_longlong_t)id);
-       (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu",
-           osname, (u_longlong_t)id);
-       (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu",
-           clone1name, (u_longlong_t)id);
-       (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu",
-           osname, (u_longlong_t)id);
-       (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu",
-           clone1name, (u_longlong_t)id);
+       snap1name  = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       clone1name = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       snap2name  = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       clone2name = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       snap3name  = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+
+       (void) snprintf(snap1name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s@s1_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(clone1name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s/c1_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(snap2name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s@s2_%llu", clone1name, (u_longlong_t)id);
+       (void) snprintf(clone2name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s/c2_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(snap3name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s@s3_%llu", clone1name, (u_longlong_t)id);
 
        error = dsl_destroy_head(clone2name);
        if (error && error != ENOENT)
@@ -3701,11 +3699,11 @@ ztest_dsl_dataset_cleanup(char *osname, uint64_t id)
        if (error && error != ENOENT)
                fatal(0, "dsl_destroy_snapshot(%s) = %d", snap1name, error);
 
-       umem_free(snap1name, MAXNAMELEN);
-       umem_free(clone1name, MAXNAMELEN);
-       umem_free(snap2name, MAXNAMELEN);
-       umem_free(clone2name, MAXNAMELEN);
-       umem_free(snap3name, MAXNAMELEN);
+       umem_free(snap1name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(clone1name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(snap2name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(clone2name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(snap3name, ZFS_MAX_DATASET_NAME_LEN);
 }
 
 /*
@@ -3723,26 +3721,26 @@ ztest_dsl_dataset_promote_busy(ztest_ds_t *zd, uint64_t id)
        char *osname = zd->zd_name;
        int error;
 
-       snap1name  = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       clone1name = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       snap2name  = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       clone2name = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
-       snap3name  = umem_alloc(MAXNAMELEN, UMEM_NOFAIL);
+       snap1name  = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       clone1name = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       snap2name  = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       clone2name = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
+       snap3name  = umem_alloc(ZFS_MAX_DATASET_NAME_LEN, UMEM_NOFAIL);
 
        (void) rw_rdlock(&ztest_name_lock);
 
        ztest_dsl_dataset_cleanup(osname, id);
 
-       (void) snprintf(snap1name, MAXNAMELEN, "%s@s1_%llu",
-           osname, (u_longlong_t)id);
-       (void) snprintf(clone1name, MAXNAMELEN, "%s/c1_%llu",
-           osname, (u_longlong_t)id);
-       (void) snprintf(snap2name, MAXNAMELEN, "%s@s2_%llu",
-           clone1name, (u_longlong_t)id);
-       (void) snprintf(clone2name, MAXNAMELEN, "%s/c2_%llu",
-           osname, (u_longlong_t)id);
-       (void) snprintf(snap3name, MAXNAMELEN, "%s@s3_%llu",
-           clone1name, (u_longlong_t)id);
+       (void) snprintf(snap1name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s@s1_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(clone1name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s/c1_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(snap2name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s@s2_%llu", clone1name, (u_longlong_t)id);
+       (void) snprintf(clone2name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s/c2_%llu", osname, (u_longlong_t)id);
+       (void) snprintf(snap3name, ZFS_MAX_DATASET_NAME_LEN,
+           "%s@s3_%llu", clone1name, (u_longlong_t)id);
 
        error = dmu_objset_snapshot_one(osname, strchr(snap1name, '@') + 1);
        if (error && error != EEXIST) {
@@ -3808,11 +3806,11 @@ out:
 
        (void) rw_unlock(&ztest_name_lock);
 
-       umem_free(snap1name, MAXNAMELEN);
-       umem_free(clone1name, MAXNAMELEN);
-       umem_free(snap2name, MAXNAMELEN);
-       umem_free(clone2name, MAXNAMELEN);
-       umem_free(snap3name, MAXNAMELEN);
+       umem_free(snap1name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(clone1name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(snap2name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(clone2name, ZFS_MAX_DATASET_NAME_LEN);
+       umem_free(snap3name, ZFS_MAX_DATASET_NAME_LEN);
 }
 
 #undef OD_ARRAY_SIZE
@@ -4622,7 +4620,7 @@ ztest_fzap(ztest_ds_t *zd, uint64_t id)
         * 2050 entries we should see ptrtbl growth and leaf-block split.
         */
        for (i = 0; i < 2050; i++) {
-               char name[MAXNAMELEN];
+               char name[ZFS_MAX_DATASET_NAME_LEN];
                uint64_t value = i;
                dmu_tx_t *tx;
                int error;
@@ -5077,7 +5075,7 @@ ztest_dmu_snapshot_hold(ztest_ds_t *zd, uint64_t id)
        char fullname[100];
        char clonename[100];
        char tag[100];
-       char osname[MAXNAMELEN];
+       char osname[ZFS_MAX_DATASET_NAME_LEN];
        nvlist_t *holds;
 
        (void) rw_rdlock(&ztest_name_lock);
@@ -5964,13 +5962,13 @@ ztest_thread(void *arg)
 static void
 ztest_dataset_name(char *dsname, char *pool, int d)
 {
-       (void) snprintf(dsname, MAXNAMELEN, "%s/ds_%d", pool, d);
+       (void) snprintf(dsname, ZFS_MAX_DATASET_NAME_LEN, "%s/ds_%d", pool, d);
 }
 
 static void
 ztest_dataset_destroy(int d)
 {
-       char name[MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        int t;
 
        ztest_dataset_name(name, ztest_opts.zo_pool, d);
@@ -6019,7 +6017,7 @@ ztest_dataset_open(int d)
        uint64_t committed_seq = ZTEST_GET_SHARED_DS(d)->zd_seq;
        objset_t *os;
        zilog_t *zilog;
-       char name[MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        int error;
 
        ztest_dataset_name(name, ztest_opts.zo_pool, d);
@@ -6256,8 +6254,8 @@ ztest_run(ztest_shared_t *zs)
         * different name.
         */
        if (ztest_random(2) == 0) {
-               char name[MAXNAMELEN];
-               (void) snprintf(name, MAXNAMELEN, "%s_import",
+               char name[ZFS_MAX_DATASET_NAME_LEN];
+               (void) snprintf(name, sizeof (name), "%s_import",
                    ztest_opts.zo_pool);
                ztest_spa_import_export(ztest_opts.zo_pool, name);
                ztest_spa_import_export(name, ztest_opts.zo_pool);
@@ -6834,7 +6832,7 @@ main(int argc, char **argv)
                if (spa_open(ztest_opts.zo_pool, &spa, FTAG) == 0) {
                        spa_close(spa, FTAG);
                } else {
-                       char tmpname[MAXNAMELEN];
+                       char tmpname[ZFS_MAX_DATASET_NAME_LEN];
                        kernel_fini();
                        kernel_init(FREAD | FWRITE);
                        (void) snprintf(tmpname, sizeof (tmpname), "%s_tmp",
index 8f0504ae999240e16479c5ee532d12d1ae5a7a06..6bd5113f1ea7cbff4cc6f10613e57d0740999dae 100644 (file)
@@ -39,14 +39,14 @@ static int
 ioctl_get_msg(char *var, int fd)
 {
        int error = 0;
-       char msg[ZFS_MAXNAMELEN];
+       char msg[ZFS_MAX_DATASET_NAME_LEN];
 
        error = ioctl(fd, BLKZNAME, msg);
        if (error < 0) {
                return (error);
        }
 
-       snprintf(var, ZFS_MAXNAMELEN, "%s", msg);
+       snprintf(var, ZFS_MAX_DATASET_NAME_LEN, "%s", msg);
        return (error);
 }
 
@@ -54,7 +54,8 @@ int
 main(int argc, char **argv)
 {
        int fd, error = 0;
-       char zvol_name[ZFS_MAXNAMELEN], zvol_name_part[ZFS_MAXNAMELEN];
+       char zvol_name[ZFS_MAX_DATASET_NAME_LEN];
+       char zvol_name_part[ZFS_MAX_DATASET_NAME_LEN];
        char *dev_name;
        struct stat64 statbuf;
        int dev_minor, dev_part;
@@ -87,10 +88,11 @@ main(int argc, char **argv)
                return (errno);
        }
        if (dev_part > 0)
-               snprintf(zvol_name_part, ZFS_MAXNAMELEN, "%s-part%d", zvol_name,
-                   dev_part);
+               snprintf(zvol_name_part, ZFS_MAX_DATASET_NAME_LEN,
+                   "%s-part%d", zvol_name, dev_part);
        else
-               snprintf(zvol_name_part, ZFS_MAXNAMELEN, "%s", zvol_name);
+               snprintf(zvol_name_part, ZFS_MAX_DATASET_NAME_LEN,
+                   "%s", zvol_name);
 
        for (i = 0; i < strlen(zvol_name_part); i++) {
                if (isblank(zvol_name_part[i]))
diff --git a/config/kernel-kobj-name-len.m4 b/config/kernel-kobj-name-len.m4
deleted file mode 100644 (file)
index 37999fa..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-dnl #
-dnl # 2.6.27 API change,
-dnl # kobject KOBJ_NAME_LEN static limit removed.  All users of this
-dnl # constant were removed prior to 2.6.27, but to be on the safe
-dnl # side this check ensures the constant is undefined.
-dnl #
-AC_DEFUN([ZFS_AC_KERNEL_KOBJ_NAME_LEN], [
-       AC_MSG_CHECKING([whether kernel defines KOBJ_NAME_LEN])
-       ZFS_LINUX_TRY_COMPILE([
-               #include <linux/kobject.h>
-       ],[
-               int val __attribute__ ((unused));
-               val = KOBJ_NAME_LEN;
-       ],[
-               AC_MSG_RESULT([yes])
-               AC_DEFINE(HAVE_KOBJ_NAME_LEN, 1,
-                         [kernel defines KOBJ_NAME_LEN])
-       ],[
-               AC_MSG_RESULT([no])
-       ])
-])
index 800d782f1eeeb36383dcda1f9c3b68696ba28dfd..086cd0b05b3758a446564351f45c9833f800b67f 100644 (file)
@@ -11,7 +11,6 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
        ZFS_AC_KERNEL_BDEV_BLOCK_DEVICE_OPERATIONS
        ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID
        ZFS_AC_KERNEL_TYPE_FMODE_T
-       ZFS_AC_KERNEL_KOBJ_NAME_LEN
        ZFS_AC_KERNEL_3ARG_BLKDEV_GET
        ZFS_AC_KERNEL_BLKDEV_GET_BY_PATH
        ZFS_AC_KERNEL_OPEN_BDEV_EXCLUSIVE
index 40eb20781fa88504b97cc906c450f917ac003517..f83e21423aa0d1bc51c9f9269a34c8f810aed660 100644 (file)
@@ -49,8 +49,6 @@ extern "C" {
 /*
  * Miscellaneous ZFS constants
  */
-#define        ZFS_MAXNAMELEN          MAXNAMELEN
-#define        ZPOOL_MAXNAMELEN        MAXNAMELEN
 #define        ZFS_MAXPROPLEN          MAXPATHLEN
 #define        ZPOOL_MAXPROPLEN        MAXPATHLEN
 
index 1efe4e2330dd47af9c0256af99e2ed71fa5a88f8..36441ed7bb3ab5f7741866c5c73fa877f73b28b1 100644 (file)
 
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2013 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  */
 
 #ifndef        _LIBZFS_IMPL_H
 #define        _LIBZFS_IMPL_H
 
-#include <sys/dmu.h>
 #include <sys/fs/zfs.h>
-#include <sys/zfs_ioctl.h>
 #include <sys/spa.h>
 #include <sys/nvpair.h>
+#include <sys/dmu.h>
+#include <sys/zfs_ioctl.h>
 
 #include <libuutil.h>
 #include <libzfs.h>
@@ -85,7 +85,7 @@ struct libzfs_handle {
 struct zfs_handle {
        libzfs_handle_t *zfs_hdl;
        zpool_handle_t *zpool_hdl;
-       char zfs_name[ZFS_MAXNAMELEN];
+       char zfs_name[ZFS_MAX_DATASET_NAME_LEN];
        zfs_type_t zfs_type; /* type including snapshot */
        zfs_type_t zfs_head_type; /* type excluding snapshot */
        dmu_objset_stats_t zfs_dmustats;
@@ -106,7 +106,7 @@ struct zfs_handle {
 struct zpool_handle {
        libzfs_handle_t *zpool_hdl;
        zpool_handle_t *zpool_next;
-       char zpool_name[ZPOOL_MAXNAMELEN];
+       char zpool_name[ZFS_MAX_DATASET_NAME_LEN];
        int zpool_state;
        size_t zpool_config_size;
        nvlist_t *zpool_config;
index 74001d8f3ca54fdb8756196cbfcede4e0d7b613a..87a8a40eb782182303e961ddbcfedab6d40cc642 100644 (file)
@@ -816,7 +816,7 @@ typedef struct dmu_objset_stats {
        dmu_objset_type_t dds_type;
        uint8_t dds_is_snapshot;
        uint8_t dds_inconsistent;
-       char dds_origin[MAXNAMELEN];
+       char dds_origin[ZFS_MAX_DATASET_NAME_LEN];
 } dmu_objset_stats_t;
 
 /*
index 195a271c92acb318d14ad47a2aa0b25b0b15c796..4d2f5e418bee4bc1e92ee28d4855293e3550bf9a 100644 (file)
@@ -227,7 +227,7 @@ typedef struct dsl_dataset {
        uint8_t ds_feature_activation_needed[SPA_FEATURES];
 
        /* Protected by ds_lock; keep at end of struct for better locality */
-       char ds_snapname[MAXNAMELEN];
+       char ds_snapname[ZFS_MAX_DATASET_NAME_LEN];
 } dsl_dataset_t;
 
 static inline dsl_dataset_phys_t *
@@ -262,6 +262,7 @@ int dsl_dataset_own_obj(struct dsl_pool *dp, uint64_t dsobj,
 void dsl_dataset_disown(dsl_dataset_t *ds, void *tag);
 void dsl_dataset_name(dsl_dataset_t *ds, char *name);
 boolean_t dsl_dataset_tryown(dsl_dataset_t *ds, void *tag);
+int dsl_dataset_namelen(dsl_dataset_t *ds);
 boolean_t dsl_dataset_has_owner(dsl_dataset_t *ds);
 uint64_t dsl_dataset_create_sync(dsl_dir_t *pds, const char *lastname,
     dsl_dataset_t *origin, uint64_t flags, cred_t *, dmu_tx_t *);
@@ -353,10 +354,10 @@ void dsl_dataset_deactivate_feature(uint64_t dsobj,
 #ifdef ZFS_DEBUG
 #define        dprintf_ds(ds, fmt, ...) do { \
        if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
-       char *__ds_name = kmem_alloc(MAXNAMELEN, KM_SLEEP); \
+       char *__ds_name = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); \
        dsl_dataset_name(ds, __ds_name); \
        dprintf("ds=%s " fmt, __ds_name, __VA_ARGS__); \
-       kmem_free(__ds_name, MAXNAMELEN); \
+       kmem_free(__ds_name, ZFS_MAX_DATASET_NAME_LEN); \
        } \
 _NOTE(CONSTCOND) } while (0)
 #else
index a025c50a0737c2a82b41719af25496d9e5bcf07b..fb299684c424fc1a8d7ec15a048121760d4b5969 100644 (file)
@@ -112,7 +112,7 @@ struct dsl_dir {
        int64_t dd_space_towrite[TXG_SIZE];
 
        /* protected by dd_lock; keep at end of struct for better locality */
-       char dd_myname[MAXNAMELEN];
+       char dd_myname[ZFS_MAX_DATASET_NAME_LEN];
 };
 
 static inline dsl_dir_phys_t *
@@ -176,11 +176,10 @@ boolean_t dsl_dir_is_zapified(dsl_dir_t *dd);
 #ifdef ZFS_DEBUG
 #define        dprintf_dd(dd, fmt, ...) do { \
        if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
-       char *__ds_name = kmem_alloc(MAXNAMELEN + strlen(MOS_DIR_NAME) + 1, \
-           KM_SLEEP); \
+       char *__ds_name = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP); \
        dsl_dir_name(dd, __ds_name); \
        dprintf("dd=%s " fmt, __ds_name, __VA_ARGS__); \
-       kmem_free(__ds_name, MAXNAMELEN + strlen(MOS_DIR_NAME) + 1); \
+       kmem_free(__ds_name, ZFS_MAX_DATASET_NAME_LEN); \
        } \
 _NOTE(CONSTCOND) } while (0)
 #else
index e802454b9febabf3a0a0f59960ef31bd0da520ce..b25d3016aea8c3b43e93658dd1343fc68d8221a0 100644 (file)
@@ -67,9 +67,13 @@ typedef enum dmu_objset_type {
 #define        ZFS_TYPE_DATASET        \
        (ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME | ZFS_TYPE_SNAPSHOT)
 
+/*
+ * All of these include the terminating NUL byte.
+ */
 #define        ZAP_MAXNAMELEN 256
 #define        ZAP_MAXVALUELEN (1024 * 8)
 #define        ZAP_OLDMAXVALUELEN 1024
+#define        ZFS_MAX_DATASET_NAME_LEN 256
 
 /*
  * Dataset properties are identified by these constants and must be added to
@@ -1019,7 +1023,7 @@ typedef enum zfs_ioc {
 /*
  * zvol ioctl to get dataset name
  */
-#define        BLKZNAME                _IOR(0x12, 125, char[ZFS_MAXNAMELEN])
+#define        BLKZNAME                _IOR(0x12, 125, char[ZFS_MAX_DATASET_NAME_LEN])
 
 /*
  * Internal SPA load state.  Used by FMA diagnosis engine.
index 2eb5fa12a85c7fe398702c1cf4be103a872b5578..59cb44de215d05990d95f8196338b2e28ec2ae79 100644 (file)
@@ -126,7 +126,7 @@ struct spa {
        /*
         * Fields protected by spa_namespace_lock.
         */
-       char            spa_name[MAXNAMELEN];   /* pool name */
+       char            spa_name[ZFS_MAX_DATASET_NAME_LEN];     /* pool name */
        char            *spa_comment;           /* comment */
        avl_node_t      spa_avl;                /* node in spa_namespace_avl */
        nvlist_t        *spa_config;            /* last synced config */
index 70cbaae9734ea61a0f76f41d41fd994527d5d6ec..7009473979b277402a5daeb942d12cd63a2aa96c 100644 (file)
@@ -363,7 +363,7 @@ typedef struct {
        boolean_t za_normalization_conflict;
        uint64_t za_num_integers;
        uint64_t za_first_integer;      /* no sign extension for <8byte ints */
-       char za_name[MAXNAMELEN];
+       char za_name[ZAP_MAXNAMELEN];
 } zap_attribute_t;
 
 /*
index 2c09feee1210d67a76d2c6947a07a589abb3c2d8..8e563a572e9669f3903e50bb14fcc7b749c590e2 100644 (file)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
  */
 
 #ifndef        _SYS_FS_ZFS_ZNODE_H
@@ -138,17 +138,6 @@ extern "C" {
 #define        ZFS_SHARES_DIR          "SHARES"
 #define        ZFS_SA_ATTRS            "SA_ATTRS"
 
-/*
- * Path component length
- *
- * The generic fs code uses MAXNAMELEN to represent
- * what the largest component length is.  Unfortunately,
- * this length includes the terminating NULL.  ZFS needs
- * to tell the users via pathconf() and statvfs() what the
- * true maximum length of a component is, excluding the NULL.
- */
-#define        ZFS_MAXNAMELEN  (MAXNAMELEN - 1)
-
 /*
  * Convert mode bits (zp_mode) to BSD-style DT_* values for storing in
  * the directory entries.  On Linux systems this value is already
index 0bcfc0423b6b5e6d4c00addecbfa52f898377fd7..5e007c0f48423eafbd023b9a10c7d38f3b0cc3fb 100644 (file)
@@ -24,6 +24,7 @@
  * Use is subject to license terms.
  *
  * Portions Copyright 2007 Ramprakash Jelari
+ * Copyright (c) 2014, 2015 by Delphix. All rights reserved.
  */
 
 #include <libintl.h>
@@ -287,7 +288,7 @@ void
 changelist_rename(prop_changelist_t *clp, const char *src, const char *dst)
 {
        prop_changenode_t *cn;
-       char newname[ZFS_MAXNAMELEN];
+       char newname[ZFS_MAX_DATASET_NAME_LEN];
 
        for (cn = uu_list_first(clp->cl_list); cn != NULL;
            cn = uu_list_next(clp->cl_list, cn)) {
index 80f75e2564860f5d724434ec901707ca6374f39f..3ff96f0c65eb33e95487fd1610b698104a4804d5 100644 (file)
@@ -551,7 +551,7 @@ zfs_bookmark_exists(const char *path)
 {
        nvlist_t *bmarks;
        nvlist_t *props;
-       char fsname[ZFS_MAXNAMELEN];
+       char fsname[ZFS_MAX_DATASET_NAME_LEN];
        char *bmark_name;
        char *pound;
        int err;
@@ -2201,7 +2201,7 @@ struct get_clones_arg {
        uint64_t numclones;
        nvlist_t *value;
        const char *origin;
-       char buf[ZFS_MAXNAMELEN];
+       char buf[ZFS_MAX_DATASET_NAME_LEN];
 };
 
 int
@@ -2256,7 +2256,7 @@ zfs_get_clones_nvl(zfs_handle_t *zhp)
 
                if (gca.numclones != 0) {
                        zfs_handle_t *root;
-                       char pool[ZFS_MAXNAMELEN];
+                       char pool[ZFS_MAX_DATASET_NAME_LEN];
                        char *cp = pool;
 
                        /* get the pool name */
@@ -3001,7 +3001,7 @@ check_parents(libzfs_handle_t *hdl, const char *path, uint64_t *zoned,
     boolean_t accept_ancestor, int *prefixlen)
 {
        zfs_cmd_t zc = {"\0"};
-       char parent[ZFS_MAXNAMELEN];
+       char parent[ZFS_MAX_DATASET_NAME_LEN];
        char *slash;
        zfs_handle_t *zhp;
        char errbuf[1024];
@@ -3240,7 +3240,7 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,
                ost = DMU_OST_ZFS;
 
        /* open zpool handle for prop validation */
-       char pool_path[MAXNAMELEN];
+       char pool_path[ZFS_MAX_DATASET_NAME_LEN];
        (void) strlcpy(pool_path, path, sizeof (pool_path));
 
        /* truncate pool_path at first slash */
@@ -3309,7 +3309,7 @@ zfs_create(libzfs_handle_t *hdl, const char *path, zfs_type_t type,
 
        /* check for failure */
        if (ret != 0) {
-               char parent[ZFS_MAXNAMELEN];
+               char parent[ZFS_MAX_DATASET_NAME_LEN];
                (void) parent_name(path, parent, sizeof (parent));
 
                switch (errno) {
@@ -3399,7 +3399,7 @@ static int
 zfs_check_snap_cb(zfs_handle_t *zhp, void *arg)
 {
        struct destroydata *dd = arg;
-       char name[ZFS_MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        int rv = 0;
 
        (void) snprintf(name, sizeof (name),
@@ -3490,7 +3490,7 @@ zfs_destroy_snaps_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, boolean_t defer)
 int
 zfs_clone(zfs_handle_t *zhp, const char *target, nvlist_t *props)
 {
-       char parent[ZFS_MAXNAMELEN];
+       char parent[ZFS_MAX_DATASET_NAME_LEN];
        int ret;
        char errbuf[1024];
        libzfs_handle_t *hdl = zhp->zfs_hdl;
@@ -3620,7 +3620,7 @@ static int
 zfs_snapshot_cb(zfs_handle_t *zhp, void *arg)
 {
        snapdata_t *sd = arg;
-       char name[ZFS_MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        int rv = 0;
 
        if (zfs_prop_get_int(zhp, ZFS_PROP_INCONSISTENT) == 0) {
@@ -3669,7 +3669,7 @@ zfs_snapshot_nvl(libzfs_handle_t *hdl, nvlist_t *snaps, nvlist_t *props)
         * get pool handle for prop validation. assumes all snaps are in the
         * same pool, as does lzc_snapshot (below).
         */
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
        elem = nvlist_next_nvpair(snaps, NULL);
        (void) strlcpy(pool, nvpair_name(elem), sizeof (pool));
        pool[strcspn(pool, "/@")] = '\0';
@@ -3723,7 +3723,7 @@ zfs_snapshot(libzfs_handle_t *hdl, const char *path, boolean_t recursive,
 {
        int ret;
        snapdata_t sd = { 0 };
-       char fsname[ZFS_MAXNAMELEN];
+       char fsname[ZFS_MAX_DATASET_NAME_LEN];
        char *cp;
        zfs_handle_t *zhp;
        char errbuf[1024];
@@ -3902,7 +3902,7 @@ zfs_rename(zfs_handle_t *zhp, const char *target, boolean_t recursive,
        prop_changelist_t *cl = NULL;
        zfs_handle_t *zhrp = NULL;
        char *parentname = NULL;
-       char parent[ZFS_MAXNAMELEN];
+       char parent[ZFS_MAX_DATASET_NAME_LEN];
        libzfs_handle_t *hdl = zhp->zfs_hdl;
        char errbuf[1024];
 
@@ -4322,7 +4322,7 @@ zfs_userspace(zfs_handle_t *zhp, zfs_userquota_prop_t type,
 
                zc.zc_nvlist_dst_size = sizeof (buf);
                if (zfs_ioctl(hdl, ZFS_IOC_USERSPACE_MANY, &zc) != 0) {
-                       char errbuf[ZFS_MAXNAMELEN + 32];
+                       char errbuf[1024];
 
                        (void) snprintf(errbuf, sizeof (errbuf),
                            dgettext(TEXT_DOMAIN,
@@ -4356,7 +4356,7 @@ static int
 zfs_hold_one(zfs_handle_t *zhp, void *arg)
 {
        struct holdarg *ha = arg;
-       char name[ZFS_MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        int rv = 0;
 
        (void) snprintf(name, sizeof (name),
@@ -4475,7 +4475,7 @@ static int
 zfs_release_one(zfs_handle_t *zhp, void *arg)
 {
        struct holdarg *ha = arg;
-       char name[ZFS_MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        int rv = 0;
        nvlist_t *existing_holds;
 
@@ -4604,7 +4604,7 @@ tryagain:
        zc.zc_nvlist_dst_size = nvsz;
        zc.zc_nvlist_dst = (uintptr_t)nvbuf;
 
-       (void) strlcpy(zc.zc_name, zhp->zfs_name, ZFS_MAXNAMELEN);
+       (void) strlcpy(zc.zc_name, zhp->zfs_name, sizeof (zc.zc_name));
 
        if (ioctl(hdl->libzfs_fd, ZFS_IOC_GET_FSACL, &zc) != 0) {
                (void) snprintf(errbuf, sizeof (errbuf),
index c0360393440878bf6b307624a526f85089425118..f5c799529c6eb840f79bc0317a22e060a82e8d42 100644 (file)
@@ -22,6 +22,7 @@
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
+ * Copyright (c) 2015 by Delphix. All rights reserved.
  * Copyright 2016 Joyent, Inc.
  */
 
@@ -604,7 +605,7 @@ get_snapshot_names(differ_info_t *di, const char *fromsnap,
                 * not the same dataset name, might be okay if
                 * tosnap is a clone of a fromsnap descendant.
                 */
-               char origin[ZFS_MAXNAMELEN];
+               char origin[ZFS_MAX_DATASET_NAME_LEN];
                zprop_source_t src;
                zfs_handle_t *zhp;
 
index 5c1cf966a543fc52f64538db1f9f6bbae21084bb..96f6574651dee49e0291026024a5c2a4478a37aa 100644 (file)
@@ -197,7 +197,7 @@ zfs_iter_bookmarks(zfs_handle_t *zhp, zfs_iter_f func, void *data)
 
        for (pair = nvlist_next_nvpair(bmarks, NULL);
            pair != NULL; pair = nvlist_next_nvpair(bmarks, pair)) {
-               char name[ZFS_MAXNAMELEN];
+               char name[ZFS_MAX_DATASET_NAME_LEN];
                char *bmark_name;
                nvlist_t *bmark_props;
 
@@ -384,7 +384,7 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig,
                         * exists.
                         */
                        if (ssa.ssa_last[0] != '\0') {
-                               char snapname[ZFS_MAXNAMELEN];
+                               char snapname[ZFS_MAX_DATASET_NAME_LEN];
                                (void) snprintf(snapname, sizeof (snapname),
                                    "%s@%s", zfs_get_name(fs_zhp),
                                    ssa.ssa_last);
@@ -404,7 +404,7 @@ zfs_iter_snapspec(zfs_handle_t *fs_zhp, const char *spec_orig,
                                ret = ENOENT;
                        }
                } else {
-                       char snapname[ZFS_MAXNAMELEN];
+                       char snapname[ZFS_MAX_DATASET_NAME_LEN];
                        zfs_handle_t *snap_zhp;
                        (void) snprintf(snapname, sizeof (snapname), "%s@%s",
                            zfs_get_name(fs_zhp), comma_separated);
index 83351c716b159c55d964d0b950a9cca0800d33c8..5e57adab0c9d4047baed2fffd2bc3779c403f48e 100644 (file)
@@ -230,7 +230,7 @@ static boolean_t
 zfs_is_mountable(zfs_handle_t *zhp, char *buf, size_t buflen,
     zprop_source_t *source)
 {
-       char sourceloc[ZFS_MAXNAMELEN];
+       char sourceloc[MAXNAMELEN];
        zprop_source_t sourcetype;
 
        if (!zfs_prop_valid_for_type(ZFS_PROP_MOUNTPOINT, zhp->zfs_type,
index 8b74e5da6678cec5e17f3bb272d34292c4a4fb3d..0a9780733fae85906fa5d7e5aedf963cb84e4278 100644 (file)
@@ -441,7 +441,7 @@ pool_uses_efi(nvlist_t *config)
 boolean_t
 zpool_is_bootable(zpool_handle_t *zhp)
 {
-       char bootfs[ZPOOL_MAXNAMELEN];
+       char bootfs[ZFS_MAX_DATASET_NAME_LEN];
 
        return (zpool_get_prop(zhp, ZPOOL_PROP_BOOTFS, bootfs,
            sizeof (bootfs), NULL, B_FALSE) == 0 && strncmp(bootfs, "-",
@@ -4006,7 +4006,7 @@ zpool_obj_to_path(zpool_handle_t *zhp, uint64_t dsobj, uint64_t obj,
        zfs_cmd_t zc = {"\0"};
        boolean_t mounted = B_FALSE;
        char *mntpnt = NULL;
-       char dsname[MAXNAMELEN];
+       char dsname[ZFS_MAX_DATASET_NAME_LEN];
 
        if (dsobj == 0) {
                /* special case for the MOS */
index fdf9a115f1498a0bb2b859829336210bf0831930..b38a2e544090948fb07aec7525767afdd4f75d09 100644 (file)
@@ -837,7 +837,7 @@ typedef struct send_dump_data {
        /* these are all just the short snapname (the part after the @) */
        const char *fromsnap;
        const char *tosnap;
-       char prevsnap[ZFS_MAXNAMELEN];
+       char prevsnap[ZFS_MAX_DATASET_NAME_LEN];
        uint64_t prevsnap_obj;
        boolean_t seenfrom, seento, replicate, doall, fromorigin;
        boolean_t verbose, dryrun, parsable, progress, embed_data, std_out;
@@ -850,7 +850,7 @@ typedef struct send_dump_data {
        snapfilter_cb_t *filter_cb;
        void *filter_cb_arg;
        nvlist_t *debugnv;
-       char holdtag[ZFS_MAXNAMELEN];
+       char holdtag[ZFS_MAX_DATASET_NAME_LEN];
        int cleanup_fd;
        uint64_t size;
 } send_dump_data_t;
@@ -1485,7 +1485,7 @@ zfs_send_resume(libzfs_handle_t *hdl, sendflags_t *flags, int outfd,
        uint64_t resumeobj, resumeoff, toguid, fromguid, bytes;
        zfs_handle_t *zhp;
        int error = 0;
-       char name[ZFS_MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        enum lzc_send_flags lzc_flags = 0;
 
        (void) snprintf(errbuf, sizeof (errbuf), dgettext(TEXT_DOMAIN,
@@ -2076,8 +2076,8 @@ recv_rename(libzfs_handle_t *hdl, const char *name, const char *tryname,
        if (err != 0 && strncmp(name + baselen, "recv-", 5) != 0) {
                seq++;
 
-               (void) snprintf(newname, ZFS_MAXNAMELEN, "%.*srecv-%u-%u",
-                   baselen, name, getpid(), seq);
+               (void) snprintf(newname, ZFS_MAX_DATASET_NAME_LEN,
+                   "%.*srecv-%u-%u", baselen, name, getpid(), seq);
                (void) strlcpy(zc.zc_value, newname, sizeof (zc.zc_value));
 
                if (flags->verbose) {
@@ -2205,7 +2205,7 @@ static int
 guid_to_name(libzfs_handle_t *hdl, const char *parent, uint64_t guid,
     boolean_t bookmark_ok, char *name)
 {
-       char pname[ZFS_MAXNAMELEN];
+       char pname[ZFS_MAX_DATASET_NAME_LEN];
        guid_to_name_data_t gtnd;
 
        gtnd.guid = guid;
@@ -2260,7 +2260,7 @@ created_before(libzfs_handle_t *hdl, avl_tree_t *avl,
 {
        nvlist_t *nvfs;
        char *fsname = NULL, *snapname = NULL;
-       char buf[ZFS_MAXNAMELEN];
+       char buf[ZFS_MAX_DATASET_NAME_LEN];
        int rv;
        zfs_handle_t *guid1hdl, *guid2hdl;
        uint64_t create1, create2;
@@ -2311,7 +2311,7 @@ recv_incremental_replication(libzfs_handle_t *hdl, const char *tofs,
        avl_tree_t *local_avl;
        nvpair_t *fselem, *nextfselem;
        char *fromsnap;
-       char newname[ZFS_MAXNAMELEN];
+       char newname[ZFS_MAX_DATASET_NAME_LEN];
        char guidname[32];
        int error;
        boolean_t needagain, progress, recursive;
@@ -2430,7 +2430,7 @@ again:
 
                        /* check for delete */
                        if (found == NULL) {
-                               char name[ZFS_MAXNAMELEN];
+                               char name[ZFS_MAX_DATASET_NAME_LEN];
 
                                if (!flags->force)
                                        continue;
@@ -2471,8 +2471,8 @@ again:
                        /* check for different snapname */
                        if (strcmp(nvpair_name(snapelem),
                            stream_snapname) != 0) {
-                               char name[ZFS_MAXNAMELEN];
-                               char tryname[ZFS_MAXNAMELEN];
+                               char name[ZFS_MAX_DATASET_NAME_LEN];
+                               char tryname[ZFS_MAX_DATASET_NAME_LEN];
 
                                (void) snprintf(name, sizeof (name), "%s@%s",
                                    fsname, nvpair_name(snapelem));
@@ -2556,7 +2556,7 @@ again:
                    ((flags->isprefix || strcmp(tofs, fsname) != 0) &&
                    (s1 != NULL) && (s2 != NULL) && strcmp(s1, s2) != 0)) {
                        nvlist_t *parent;
-                       char tryname[ZFS_MAXNAMELEN];
+                       char tryname[ZFS_MAX_DATASET_NAME_LEN];
 
                        parent = fsavl_find(local_avl,
                            stream_parent_fromsnap_guid, NULL);
@@ -2624,8 +2624,8 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname,
        char *fromsnap = NULL;
        char *sendsnap = NULL;
        char *cp;
-       char tofs[ZFS_MAXNAMELEN];
-       char sendfs[ZFS_MAXNAMELEN];
+       char tofs[ZFS_MAX_DATASET_NAME_LEN];
+       char sendfs[ZFS_MAX_DATASET_NAME_LEN];
        char errbuf[1024];
        dmu_replay_record_t drre;
        int error;
@@ -2709,7 +2709,7 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname,
                        nvlist_t *renamed = NULL;
                        nvpair_t *pair = NULL;
 
-                       (void) strlcpy(tofs, destname, ZFS_MAXNAMELEN);
+                       (void) strlcpy(tofs, destname, sizeof (tofs));
                        if (flags->isprefix) {
                                struct drr_begin *drrb = &drr->drr_u.drr_begin;
                                int i;
@@ -2718,7 +2718,7 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname,
                                        cp = strrchr(drrb->drr_toname, '/');
                                        if (cp == NULL) {
                                                (void) strlcat(tofs, "/",
-                                                   ZFS_MAXNAMELEN);
+                                                   sizeof (tofs));
                                                i = 0;
                                        } else {
                                                i = (cp - drrb->drr_toname);
@@ -2728,7 +2728,7 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname,
                                }
                                /* zfs_receive_one() will create_parents() */
                                (void) strlcat(tofs, &drrb->drr_toname[i],
-                                   ZFS_MAXNAMELEN);
+                                   sizeof (tofs));
                                *strchr(tofs, '@') = '\0';
                        }
 
@@ -2770,7 +2770,7 @@ zfs_receive_package(libzfs_handle_t *hdl, int fd, const char *destname,
         * zfs_receive_one().
         */
        (void) strlcpy(sendfs, drr->drr_u.drr_begin.drr_toname,
-           ZFS_MAXNAMELEN);
+           sizeof (sendfs));
        if ((cp = strchr(sendfs, '@')) != NULL) {
                *cp = '\0';
                /*
@@ -2920,7 +2920,7 @@ static void
 recv_ecksum_set_aux(libzfs_handle_t *hdl, const char *target_snap,
     boolean_t resumable)
 {
-       char target_fs[ZFS_MAXNAMELEN];
+       char target_fs[ZFS_MAX_DATASET_NAME_LEN];
 
        zfs_error_aux(hdl, dgettext(TEXT_DOMAIN,
            "checksum mismatch or incomplete stream"));
@@ -3113,7 +3113,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
                if (flags->verbose)
                        (void) printf("found clone origin %s\n", origin);
        } else if (originsnap) {
-               (void) strncpy(origin, originsnap, ZFS_MAXNAMELEN);
+               (void) strncpy(origin, originsnap, sizeof (origin));
                if (flags->verbose)
                        (void) printf("using provided clone origin %s\n",
                            origin);
@@ -3138,7 +3138,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
                        *cp = '\0';
                if (cp &&
                    !zfs_dataset_exists(hdl, name, ZFS_TYPE_DATASET)) {
-                       char suffix[ZFS_MAXNAMELEN];
+                       char suffix[ZFS_MAX_DATASET_NAME_LEN];
                        (void) strcpy(suffix, strrchr(destsnap, '/'));
                        if (guid_to_name(hdl, name, parent_snapguid,
                            B_FALSE, destsnap) == 0) {
@@ -3165,7 +3165,7 @@ zfs_receive_one(libzfs_handle_t *hdl, int infd, const char *tosnap,
                if ((flags->isprefix || (*(chopprefix = drrb->drr_toname +
                    strlen(sendfs)) != '\0' && *chopprefix != '@')) &&
                    !zfs_dataset_exists(hdl, name, ZFS_TYPE_DATASET)) {
-                       char snap[ZFS_MAXNAMELEN];
+                       char snap[ZFS_MAX_DATASET_NAME_LEN];
                        (void) strcpy(snap, strchr(destsnap, '@'));
                        if (guid_to_name(hdl, name, drrb->drr_fromguid,
                            B_FALSE, destsnap) == 0) {
@@ -3609,7 +3609,7 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap,
        }
 
        if (DMU_GET_STREAM_HDRTYPE(drrb->drr_versioninfo) == DMU_SUBSTREAM) {
-               char nonpackage_sendfs[ZFS_MAXNAMELEN];
+               char nonpackage_sendfs[ZFS_MAX_DATASET_NAME_LEN];
                if (sendfs == NULL) {
                        /*
                         * We were not called from zfs_receive_package(). Get
@@ -3617,7 +3617,8 @@ zfs_receive_impl(libzfs_handle_t *hdl, const char *tosnap,
                         */
                        char *cp;
                        (void) strlcpy(nonpackage_sendfs,
-                           drr.drr_u.drr_begin.drr_toname, ZFS_MAXNAMELEN);
+                           drr.drr_u.drr_begin.drr_toname,
+                           sizeof (nonpackage_sendfs));
                        if ((cp = strchr(nonpackage_sendfs, '@')) != NULL)
                                *cp = '\0';
                        sendfs = nonpackage_sendfs;
index e20e58dbae3fac051ed7788b284ea302c84496fb..0359e4284ac1585763981b39437047d3770e5bbd 100644 (file)
@@ -217,7 +217,7 @@ lzc_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t **errlist)
        nvpair_t *elem;
        nvlist_t *args;
        int error;
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
 
        *errlist = NULL;
 
@@ -269,7 +269,7 @@ lzc_destroy_snaps(nvlist_t *snaps, boolean_t defer, nvlist_t **errlist)
        nvpair_t *elem;
        nvlist_t *args;
        int error;
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
 
        /* determine the pool name */
        elem = nvlist_next_nvpair(snaps, NULL);
@@ -296,7 +296,7 @@ lzc_snaprange_space(const char *firstsnap, const char *lastsnap,
        nvlist_t *args;
        nvlist_t *result;
        int err;
-       char fs[MAXNAMELEN];
+       char fs[ZFS_MAX_DATASET_NAME_LEN];
        char *atp;
 
        /* determine the fs name */
@@ -361,7 +361,7 @@ lzc_exists(const char *dataset)
 int
 lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist)
 {
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
        nvlist_t *args;
        nvpair_t *elem;
        int error;
@@ -408,7 +408,7 @@ lzc_hold(nvlist_t *holds, int cleanup_fd, nvlist_t **errlist)
 int
 lzc_release(nvlist_t *holds, nvlist_t **errlist)
 {
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
        nvpair_t *elem;
 
        /* determine the pool name */
@@ -842,7 +842,7 @@ lzc_bookmark(nvlist_t *bookmarks, nvlist_t **errlist)
 {
        nvpair_t *elem;
        int error;
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
 
        /* determine the pool name */
        elem = nvlist_next_nvpair(bookmarks, NULL);
@@ -904,7 +904,7 @@ lzc_destroy_bookmarks(nvlist_t *bmarks, nvlist_t **errlist)
 {
        nvpair_t *elem;
        int error;
-       char pool[MAXNAMELEN];
+       char pool[ZFS_MAX_DATASET_NAME_LEN];
 
        /* determine the pool name */
        elem = nvlist_next_nvpair(bmarks, NULL);
index ff724be588ccd52c0bfcde73db47950e586a8b0c..b58071bed0557bdde450cf45f34cfa92c943e6a8 100644 (file)
@@ -69,7 +69,7 @@ zfs_component_namecheck(const char *path, namecheck_err_t *why, char *what)
 {
        const char *loc;
 
-       if (strlen(path) >= MAXNAMELEN) {
+       if (strlen(path) >= ZFS_MAX_DATASET_NAME_LEN) {
                if (why)
                        *why = NAME_ERR_TOOLONG;
                return (-1);
@@ -140,27 +140,8 @@ dataset_namecheck(const char *path, namecheck_err_t *why, char *what)
 
        /*
         * Make sure the name is not too long.
-        *
-        * ZFS_MAXNAMELEN is the maximum dataset length used in the userland
-        * which is the same as MAXNAMELEN used in the kernel.
-        * If ZFS_MAXNAMELEN value is changed, make sure to cleanup all
-        * places using MAXNAMELEN.
-        *
-        * When HAVE_KOBJ_NAME_LEN is defined the maximum safe kobject name
-        * length is 20 bytes.  This 20 bytes is broken down as follows to
-        * provide a maximum safe <pool>/<dataset>[@snapshot] length of only
-        * 18 bytes.  To ensure bytes are left for <dataset>[@snapshot] the
-        * <pool> portition is futher limited to 9 bytes.  For 2.6.27 and
-        * newer kernels this limit is set to MAXNAMELEN.
-        *
-        *   <pool>/<dataset> + <partition> + <newline>
-        *   (18)             + (1)         + (1)
         */
-#ifdef HAVE_KOBJ_NAME_LEN
-       if (strlen(path) > 18) {
-#else
-       if (strlen(path) >= MAXNAMELEN) {
-#endif /* HAVE_KOBJ_NAME_LEN */
+       if (strlen(path) >= ZFS_MAX_DATASET_NAME_LEN) {
                if (why)
                        *why = NAME_ERR_TOOLONG;
                return (-1);
@@ -289,7 +270,7 @@ mountpoint_namecheck(const char *path, namecheck_err_t *why)
                while (*end != '/' && *end != '\0')
                        end++;
 
-               if (end - start >= MAXNAMELEN) {
+               if (end - start >= ZFS_MAX_DATASET_NAME_LEN) {
                        if (why)
                                *why = NAME_ERR_TOOLONG;
                        return (-1);
@@ -314,27 +295,8 @@ pool_namecheck(const char *pool, namecheck_err_t *why, char *what)
 
        /*
         * Make sure the name is not too long.
-        *
-        * ZPOOL_MAXNAMELEN is the maximum pool length used in the userland
-        * which is the same as MAXNAMELEN used in the kernel.
-        * If ZPOOL_MAXNAMELEN value is changed, make sure to cleanup all
-        * places using MAXNAMELEN.
-        *
-        * When HAVE_KOBJ_NAME_LEN is defined the maximum safe kobject name
-        * length is 20 bytes.  This 20 bytes is broken down as follows to
-        * provide a maximum safe <pool>/<dataset>[@snapshot] length of only
-        * 18 bytes.  To ensure bytes are left for <dataset>[@snapshot] the
-        * <pool> portition is futher limited to 8 bytes.  For 2.6.27 and
-        * newer kernels this limit is set to MAXNAMELEN.
-        *
-        *   <pool>/<dataset> + <partition> + <newline>
-        *   (18)             + (1)         + (1)
         */
-#ifdef HAVE_KOBJ_NAME_LEN
-       if (strlen(pool) > 8) {
-#else
-       if (strlen(pool) >= MAXNAMELEN) {
-#endif /* HAVE_KOBJ_NAME_LEN */
+       if (strlen(pool) >= ZFS_MAX_DATASET_NAME_LEN) {
                if (why)
                        *why = NAME_ERR_TOOLONG;
                return (-1);
index a9991aabb0aac4536c6f1f3929631da1b455a558..22ca84d96a2772a3840f0a44051ccab0a50377b0 100644 (file)
@@ -671,7 +671,7 @@ dmu_objset_refresh_ownership(objset_t *os, void *tag)
 {
        dsl_pool_t *dp;
        dsl_dataset_t *ds, *newds;
-       char name[MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
 
        ds = os->os_dsl_dataset;
        VERIFY3P(ds, !=, NULL);
@@ -895,6 +895,9 @@ dmu_objset_create_check(void *arg, dmu_tx_t *tx)
        if (strchr(doca->doca_name, '@') != NULL)
                return (SET_ERROR(EINVAL));
 
+       if (strlen(doca->doca_name) >= ZFS_MAX_DATASET_NAME_LEN)
+               return (SET_ERROR(ENAMETOOLONG));
+
        error = dsl_dir_hold(dp, doca->doca_name, FTAG, &pdd, &tail);
        if (error != 0)
                return (error);
@@ -981,6 +984,9 @@ dmu_objset_clone_check(void *arg, dmu_tx_t *tx)
        if (strchr(doca->doca_clone, '@') != NULL)
                return (SET_ERROR(EINVAL));
 
+       if (strlen(doca->doca_clone) >= ZFS_MAX_DATASET_NAME_LEN)
+               return (SET_ERROR(ENAMETOOLONG));
+
        error = dsl_dir_hold(dp, doca->doca_clone, FTAG, &pdd, &tail);
        if (error != 0)
                return (error);
@@ -1020,7 +1026,7 @@ dmu_objset_clone_sync(void *arg, dmu_tx_t *tx)
        const char *tail;
        dsl_dataset_t *origin, *ds;
        uint64_t obj;
-       char namebuf[MAXNAMELEN];
+       char namebuf[ZFS_MAX_DATASET_NAME_LEN];
 
        VERIFY0(dsl_dir_hold(dp, doca->doca_clone, FTAG, &pdd, &tail));
        VERIFY0(dsl_dataset_hold(dp, doca->doca_origin, FTAG, &origin));
@@ -2047,7 +2053,7 @@ dmu_objset_get_user(objset_t *os)
 
 /*
  * Determine name of filesystem, given name of snapshot.
- * buf must be at least MAXNAMELEN bytes
+ * buf must be at least ZFS_MAX_DATASET_NAME_LEN bytes
  */
 int
 dmu_fsname(const char *snapname, char *buf)
@@ -2055,7 +2061,7 @@ dmu_fsname(const char *snapname, char *buf)
        char *atp = strchr(snapname, '@');
        if (atp == NULL)
                return (SET_ERROR(EINVAL));
-       if (atp - snapname >= MAXNAMELEN)
+       if (atp - snapname >= ZFS_MAX_DATASET_NAME_LEN)
                return (SET_ERROR(ENAMETOOLONG));
        (void) strlcpy(buf, snapname, atp - snapname + 1);
        return (0);
index 2f4087a67b0e9dd64fc196081a8d1a19447a5d3e..80f7dc1aae11a8e259b4fbbcea040ba323291f4e 100644 (file)
@@ -1356,7 +1356,7 @@ dmu_recv_begin_check(void *arg, dmu_tx_t *tx)
                dsl_dataset_rele(ds, FTAG);
        } else if (error == ENOENT) {
                /* target fs does not exist; must be a full backup or clone */
-               char buf[MAXNAMELEN];
+               char buf[ZFS_MAX_DATASET_NAME_LEN];
 
                /*
                 * If it's a non-clone incremental, we are missing the
@@ -1376,7 +1376,7 @@ dmu_recv_begin_check(void *arg, dmu_tx_t *tx)
                        return (SET_ERROR(EINVAL));
 
                /* Open the parent of tofs */
-               ASSERT3U(strlen(tofs), <, MAXNAMELEN);
+               ASSERT3U(strlen(tofs), <, sizeof (buf));
                (void) strlcpy(buf, tofs, strrchr(tofs, '/') - tofs + 1);
                error = dsl_dataset_hold(dp, buf, FTAG, &ds);
                if (error != 0)
@@ -1533,9 +1533,11 @@ dmu_recv_resume_begin_check(void *arg, dmu_tx_t *tx)
        uint64_t featureflags = DMU_GET_FEATUREFLAGS(drrb->drr_versioninfo);
        dsl_dataset_t *ds;
        const char *tofs = drba->drba_cookie->drc_tofs;
-       char recvname[ZFS_MAXNAMELEN];
        uint64_t val;
 
+       /* 6 extra bytes for /%recv */
+       char recvname[ZFS_MAX_DATASET_NAME_LEN + 6];
+
        /* already checked */
        ASSERT3U(drrb->drr_magic, ==, DMU_BACKUP_MAGIC);
        ASSERT(featureflags & DMU_BACKUP_FEATURE_RESUMING);
@@ -1633,7 +1635,8 @@ dmu_recv_resume_begin_sync(void *arg, dmu_tx_t *tx)
        const char *tofs = drba->drba_cookie->drc_tofs;
        dsl_dataset_t *ds;
        uint64_t dsobj;
-       char recvname[ZFS_MAXNAMELEN];
+       /* 6 extra bytes for /%recv */
+       char recvname[ZFS_MAX_DATASET_NAME_LEN + 6];
 
        (void) snprintf(recvname, sizeof (recvname), "%s/%s",
            tofs, recv_clone_name);
@@ -2359,7 +2362,7 @@ dmu_recv_cleanup_ds(dmu_recv_cookie_t *drc)
                txg_wait_synced(drc->drc_ds->ds_dir->dd_pool, 0);
                dsl_dataset_disown(drc->drc_ds, dmu_recv_tag);
        } else {
-               char name[MAXNAMELEN];
+               char name[ZFS_MAX_DATASET_NAME_LEN];
                dsl_dataset_name(drc->drc_ds, name);
                dsl_dataset_disown(drc->drc_ds, dmu_recv_tag);
                (void) dsl_destroy_head(name);
@@ -3191,16 +3194,13 @@ dmu_recv_existing_end(dmu_recv_cookie_t *drc)
        int error;
 
 #ifdef _KERNEL
-       char *name;
-
        /*
         * We will be destroying the ds; make sure its origin is unmounted if
         * necessary.
         */
-       name = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+       char name[ZFS_MAX_DATASET_NAME_LEN];
        dsl_dataset_name(drc->drc_ds, name);
        zfs_destroy_unmount_origin(name);
-       kmem_free(name, MAXNAMELEN);
 #endif
 
        error = dsl_sync_task(drc->drc_tofs,
index 447a3a2dc3a2de6df39c4061b78772cf11ab0b4a..5a7f034ce6498e40a34b0bcc73d1498ae9851318 100644 (file)
@@ -34,10 +34,10 @@ static int
 dsl_bookmark_hold_ds(dsl_pool_t *dp, const char *fullname,
     dsl_dataset_t **dsp, void *tag, char **shortnamep)
 {
-       char buf[MAXNAMELEN];
+       char buf[ZFS_MAX_DATASET_NAME_LEN];
        char *hashp;
 
-       if (strlen(fullname) >= MAXNAMELEN)
+       if (strlen(fullname) >= ZFS_MAX_DATASET_NAME_LEN)
                return (SET_ERROR(ENAMETOOLONG));
        hashp = strchr(fullname, '#');
        if (hashp == NULL)
index 3d1115e31c7f4a5fd593203306992956f0943307..5b7de74dc90d1eabebfe5a5cce3e8964e8e2efe1 100644 (file)
@@ -670,22 +670,38 @@ dsl_dataset_name(dsl_dataset_t *ds, char *name)
                dsl_dir_name(ds->ds_dir, name);
                VERIFY0(dsl_dataset_get_snapname(ds));
                if (ds->ds_snapname[0]) {
-                       (void) strcat(name, "@");
+                       VERIFY3U(strlcat(name, "@", ZFS_MAX_DATASET_NAME_LEN),
+                           <, ZFS_MAX_DATASET_NAME_LEN);
                        /*
                         * We use a "recursive" mutex so that we
                         * can call dprintf_ds() with ds_lock held.
                         */
                        if (!MUTEX_HELD(&ds->ds_lock)) {
                                mutex_enter(&ds->ds_lock);
-                               (void) strcat(name, ds->ds_snapname);
+                               VERIFY3U(strlcat(name, ds->ds_snapname,
+                                   ZFS_MAX_DATASET_NAME_LEN), <,
+                                   ZFS_MAX_DATASET_NAME_LEN);
                                mutex_exit(&ds->ds_lock);
                        } else {
-                               (void) strcat(name, ds->ds_snapname);
+                               VERIFY3U(strlcat(name, ds->ds_snapname,
+                                   ZFS_MAX_DATASET_NAME_LEN), <,
+                                   ZFS_MAX_DATASET_NAME_LEN);
                        }
                }
        }
 }
 
+int
+dsl_dataset_namelen(dsl_dataset_t *ds)
+{
+       int len;
+       VERIFY0(dsl_dataset_get_snapname(ds));
+       mutex_enter(&ds->ds_lock);
+       len = dsl_dir_namelen(ds->ds_dir) + 1 + strlen(ds->ds_snapname);
+       mutex_exit(&ds->ds_lock);
+       return (len);
+}
+
 void
 dsl_dataset_rele(dsl_dataset_t *ds, void *tag)
 {
@@ -1255,10 +1271,10 @@ dsl_dataset_snapshot_check(void *arg, dmu_tx_t *tx)
                int error = 0;
                dsl_dataset_t *ds;
                char *name, *atp;
-               char dsname[MAXNAMELEN];
+               char dsname[ZFS_MAX_DATASET_NAME_LEN];
 
                name = nvpair_name(pair);
-               if (strlen(name) >= MAXNAMELEN)
+               if (strlen(name) >= ZFS_MAX_DATASET_NAME_LEN)
                        error = SET_ERROR(ENAMETOOLONG);
                if (error == 0) {
                        atp = strchr(name, '@');
@@ -1431,7 +1447,7 @@ dsl_dataset_snapshot_sync(void *arg, dmu_tx_t *tx)
            pair != NULL; pair = nvlist_next_nvpair(ddsa->ddsa_snaps, pair)) {
                dsl_dataset_t *ds;
                char *name, *atp;
-               char dsname[MAXNAMELEN];
+               char dsname[ZFS_MAX_DATASET_NAME_LEN];
 
                name = nvpair_name(pair);
                atp = strchr(name, '@');
@@ -1478,7 +1494,7 @@ dsl_dataset_snapshot(nvlist_t *snaps, nvlist_t *props, nvlist_t *errors)
                suspended = fnvlist_alloc();
                for (pair = nvlist_next_nvpair(snaps, NULL); pair != NULL;
                    pair = nvlist_next_nvpair(snaps, pair)) {
-                       char fsname[MAXNAMELEN];
+                       char fsname[ZFS_MAX_DATASET_NAME_LEN];
                        char *snapname = nvpair_name(pair);
                        char *atp;
                        void *cookie;
@@ -1687,7 +1703,7 @@ get_clones_stat(dsl_dataset_t *ds, nvlist_t *nv)
            zap_cursor_retrieve(&zc, &za) == 0;
            zap_cursor_advance(&zc)) {
                dsl_dataset_t *clone;
-               char buf[ZFS_MAXNAMELEN];
+               char buf[ZFS_MAX_DATASET_NAME_LEN];
                VERIFY0(dsl_dataset_hold_obj(ds->ds_dir->dd_pool,
                    za.za_first_integer, FTAG, &clone));
                dsl_dir_name(clone->ds_dir, buf);
@@ -1797,7 +1813,7 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
                get_clones_stat(ds, nv);
        } else {
                if (ds->ds_prev != NULL && ds->ds_prev != dp->dp_origin_snap) {
-                       char buf[MAXNAMELEN];
+                       char buf[ZFS_MAX_DATASET_NAME_LEN];
                        dsl_dataset_name(ds->ds_prev, buf);
                        dsl_prop_nvlist_add_string(nv, ZFS_PROP_PREV_SNAP, buf);
                }
@@ -1848,8 +1864,9 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
        }
 
        if (!dsl_dataset_is_snapshot(ds)) {
+               /* 6 extra bytes for /%recv */
+               char recvname[ZFS_MAX_DATASET_NAME_LEN + 6];
                dsl_dataset_t *recv_ds;
-               char recvname[ZFS_MAXNAMELEN];
 
                /*
                 * A failed "newfs" (e.g. full) resumable receive leaves
@@ -1863,9 +1880,11 @@ dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
                 * for the prop.
                 */
                dsl_dataset_name(ds, recvname);
-               (void) strcat(recvname, "/");
-               (void) strcat(recvname, recv_clone_name);
-               if (dsl_dataset_hold(dp, recvname, FTAG, &recv_ds) == 0) {
+               if (strlcat(recvname, "/", sizeof (recvname)) <
+                   sizeof (recvname) &&
+                   strlcat(recvname, recv_clone_name, sizeof (recvname)) <
+                   sizeof (recvname) &&
+                   dsl_dataset_hold(dp, recvname, FTAG, &recv_ds) == 0) {
                        get_receive_resume_stats(recv_ds, nv);
                        dsl_dataset_rele(recv_ds, FTAG);
                }
@@ -1990,7 +2009,7 @@ dsl_dataset_rename_snapshot_check_impl(dsl_pool_t *dp,
 
        /* dataset name + 1 for the "@" + the new snapshot name must fit */
        if (dsl_dir_namelen(hds->ds_dir) + 1 +
-           strlen(ddrsa->ddrsa_newsnapname) >= MAXNAMELEN)
+           strlen(ddrsa->ddrsa_newsnapname) >= ZFS_MAX_DATASET_NAME_LEN)
                error = SET_ERROR(ENAMETOOLONG);
 
        return (error);
@@ -2223,7 +2242,7 @@ dsl_dataset_rollback_sync(void *arg, dmu_tx_t *tx)
        dsl_pool_t *dp = dmu_tx_pool(tx);
        dsl_dataset_t *ds, *clone;
        uint64_t cloneobj;
-       char namebuf[ZFS_MAXNAMELEN];
+       char namebuf[ZFS_MAX_DATASET_NAME_LEN];
 
        VERIFY0(dsl_dataset_hold(dp, ddra->ddra_fsname, FTAG, &ds));
 
@@ -2776,7 +2795,7 @@ promote_rele(dsl_dataset_promote_arg_t *ddpa, void *tag)
  * Promote a clone.
  *
  * If it fails due to a conflicting snapshot name, "conflsnap" will be filled
- * in with the name.  (It must be at least MAXNAMELEN bytes long.)
+ * in with the name.  (It must be at least ZFS_MAX_DATASET_NAME_LEN bytes long.)
  */
 int
 dsl_dataset_promote(const char *name, char *conflsnap)
index 952422be23813914dbb8efcf654d54c71e997aad..eb39cff57f2a8713442cd0057a4271f157b6c2f7 100644 (file)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  */
 
 /*
@@ -330,7 +330,7 @@ dsl_deleg_get(const char *ddname, nvlist_t **nvp)
        za = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
        basezc = kmem_alloc(sizeof (zap_cursor_t), KM_SLEEP);
        baseza = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
-       source = kmem_alloc(MAXNAMELEN + strlen(MOS_DIR_NAME) + 1, KM_SLEEP);
+       source = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
        VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
 
        for (dd = startdd; dd != NULL; dd = dd->dd_parent) {
@@ -370,7 +370,7 @@ dsl_deleg_get(const char *ddname, nvlist_t **nvp)
                nvlist_free(sp_nvp);
        }
 
-       kmem_free(source, MAXNAMELEN + strlen(MOS_DIR_NAME) + 1);
+       kmem_free(source, ZFS_MAX_DATASET_NAME_LEN);
        kmem_free(baseza, sizeof (zap_attribute_t));
        kmem_free(basezc, sizeof (zap_cursor_t));
        kmem_free(za, sizeof (zap_attribute_t));
index 8983e0793f2319d10e910a7b717509424bef433e..ae67b362ee8a80edc11c9470aa07cbdac921e385 100644 (file)
@@ -299,13 +299,14 @@ dsl_dir_async_rele(dsl_dir_t *dd, void *tag)
        dmu_buf_rele(dd->dd_dbuf, tag);
 }
 
-/* buf must be long enough (MAXNAMELEN + strlen(MOS_DIR_NAME) + 1 should do) */
+/* buf must be at least ZFS_MAX_DATASET_NAME_LEN bytes */
 void
 dsl_dir_name(dsl_dir_t *dd, char *buf)
 {
        if (dd->dd_parent) {
                dsl_dir_name(dd->dd_parent, buf);
-               (void) strcat(buf, "/");
+               VERIFY3U(strlcat(buf, "/", ZFS_MAX_DATASET_NAME_LEN), <,
+                   ZFS_MAX_DATASET_NAME_LEN);
        } else {
                buf[0] = '\0';
        }
@@ -315,10 +316,12 @@ dsl_dir_name(dsl_dir_t *dd, char *buf)
                 * dprintf_dd() with dd_lock held
                 */
                mutex_enter(&dd->dd_lock);
-               (void) strcat(buf, dd->dd_myname);
+               VERIFY3U(strlcat(buf, dd->dd_myname, ZFS_MAX_DATASET_NAME_LEN),
+                   <, ZFS_MAX_DATASET_NAME_LEN);
                mutex_exit(&dd->dd_lock);
        } else {
-               (void) strcat(buf, dd->dd_myname);
+               VERIFY3U(strlcat(buf, dd->dd_myname, ZFS_MAX_DATASET_NAME_LEN),
+                   <, ZFS_MAX_DATASET_NAME_LEN);
        }
 }
 
@@ -367,12 +370,12 @@ getcomponent(const char *path, char *component, const char **nextp)
                if (p != NULL &&
                    (p[0] != '@' || strpbrk(path+1, "/@") || p[1] == '\0'))
                        return (SET_ERROR(EINVAL));
-               if (strlen(path) >= MAXNAMELEN)
+               if (strlen(path) >= ZFS_MAX_DATASET_NAME_LEN)
                        return (SET_ERROR(ENAMETOOLONG));
                (void) strcpy(component, path);
                p = NULL;
        } else if (p[0] == '/') {
-               if (p - path >= MAXNAMELEN)
+               if (p - path >= ZFS_MAX_DATASET_NAME_LEN)
                        return (SET_ERROR(ENAMETOOLONG));
                (void) strncpy(component, path, p - path);
                component[p - path] = '\0';
@@ -384,7 +387,7 @@ getcomponent(const char *path, char *component, const char **nextp)
                 */
                if (strchr(path, '/'))
                        return (SET_ERROR(EINVAL));
-               if (p - path >= MAXNAMELEN)
+               if (p - path >= ZFS_MAX_DATASET_NAME_LEN)
                        return (SET_ERROR(ENAMETOOLONG));
                (void) strncpy(component, path, p - path);
                component[p - path] = '\0';
@@ -412,7 +415,7 @@ dsl_dir_hold(dsl_pool_t *dp, const char *name, void *tag,
        dsl_dir_t *dd;
        uint64_t ddobj;
 
-       buf = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+       buf = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
        err = getcomponent(name, buf, &next);
        if (err != 0)
                goto error;
@@ -479,7 +482,7 @@ dsl_dir_hold(dsl_pool_t *dp, const char *name, void *tag,
                *tailp = next;
        *ddp = dd;
 error:
-       kmem_free(buf, MAXNAMELEN);
+       kmem_free(buf, ZFS_MAX_DATASET_NAME_LEN);
        return (err);
 }
 
@@ -974,7 +977,7 @@ dsl_dir_stats(dsl_dir_t *dd, nvlist_t *nv)
 
        if (dsl_dir_is_clone(dd)) {
                dsl_dataset_t *ds;
-               char buf[MAXNAMELEN];
+               char buf[ZFS_MAX_DATASET_NAME_LEN];
 
                VERIFY0(dsl_dataset_hold_obj(dd->dd_pool,
                    dsl_dir_phys(dd)->dd_origin_obj, FTAG, &ds));
@@ -1691,11 +1694,11 @@ static int
 dsl_valid_rename(dsl_pool_t *dp, dsl_dataset_t *ds, void *arg)
 {
        int *deltap = arg;
-       char namebuf[MAXNAMELEN];
+       char namebuf[ZFS_MAX_DATASET_NAME_LEN];
 
        dsl_dataset_name(ds, namebuf);
 
-       if (strlen(namebuf) + *deltap >= MAXNAMELEN)
+       if (strlen(namebuf) + *deltap >= ZFS_MAX_DATASET_NAME_LEN)
                return (SET_ERROR(ENAMETOOLONG));
        return (0);
 }
index 36147327550d4ac7671fdbbebf904f5296070804..66e899a57118d23c6391d1354b1763d83e6a929c 100644 (file)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
  * Copyright (c) 2013 Martin Matuska. All rights reserved.
  * Copyright 2015, Joyent, Inc.
  */
@@ -1095,7 +1095,7 @@ dsl_prop_get_all_ds(dsl_dataset_t *ds, nvlist_t **nvp,
        dsl_pool_t *dp = dd->dd_pool;
        objset_t *mos = dp->dp_meta_objset;
        int err = 0;
-       char setpoint[MAXNAMELEN];
+       char setpoint[ZFS_MAX_DATASET_NAME_LEN];
 
        VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
 
index 72163521efa627716423f7c23d6e064fe05de1ee..6c5f1f0b5b3fcb602c0af0d6cdf5970383e1bc36 100644 (file)
@@ -1115,7 +1115,7 @@ dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
                 * rootbp's birth time is < cur_min_txg.  Then we will
                 * add the next snapshots/clones to the work queue.
                 */
-               char *dsname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+               char *dsname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
                dsl_dataset_name(ds, dsname);
                zfs_dbgmsg("scanning dataset %llu (%s) is unnecessary because "
                    "cur_min_txg (%llu) >= max_txg (%llu)",
@@ -1146,7 +1146,7 @@ dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
        dmu_buf_will_dirty(ds->ds_dbuf, tx);
        dsl_scan_visit_rootbp(scn, ds, &dsl_dataset_phys(ds)->ds_bp, tx);
 
-       dsname = kmem_alloc(ZFS_MAXNAMELEN, KM_SLEEP);
+       dsname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
        dsl_dataset_name(ds, dsname);
        zfs_dbgmsg("scanned dataset %llu (%s) with min=%llu max=%llu; "
            "pausing=%u",
@@ -1154,7 +1154,7 @@ dsl_scan_visitds(dsl_scan_t *scn, uint64_t dsobj, dmu_tx_t *tx)
            (longlong_t)scn->scn_phys.scn_cur_min_txg,
            (longlong_t)scn->scn_phys.scn_cur_max_txg,
            (int)scn->scn_pausing);
-       kmem_free(dsname, ZFS_MAXNAMELEN);
+       kmem_free(dsname, ZFS_MAX_DATASET_NAME_LEN);
 
        if (scn->scn_pausing)
                goto out;
index 1b234ed480f92bd4f2bf765acb6e06444a833cd8..a6d1aa937ef126932a8061d6b161ed53d3e1762f 100644 (file)
@@ -20,7 +20,7 @@
  */
 /*
  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2012, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2012, 2015 by Delphix. All rights reserved.
  * Copyright (c) 2013 Steven Hartland. All rights reserved.
  */
 
@@ -181,7 +181,7 @@ dsl_dataset_user_hold_sync_one_impl(nvlist_t *tmpholds, dsl_dataset_t *ds,
 }
 
 typedef struct zfs_hold_cleanup_arg {
-       char zhca_spaname[MAXNAMELEN];
+       char zhca_spaname[ZFS_MAX_DATASET_NAME_LEN];
        uint64_t zhca_spa_load_guid;
        nvlist_t *zhca_holds;
 } zfs_hold_cleanup_arg_t;
@@ -580,7 +580,7 @@ dsl_dataset_user_release_impl(nvlist_t *holds, nvlist_t *errlist,
                        error = dsl_dataset_hold_obj_string(tmpdp,
                            nvpair_name(pair), FTAG, &ds);
                        if (error == 0) {
-                               char name[MAXNAMELEN];
+                               char name[ZFS_MAX_DATASET_NAME_LEN];
                                dsl_dataset_name(ds, name);
                                dsl_pool_config_exit(tmpdp, FTAG);
                                dsl_dataset_rele(ds, FTAG);
index d1aefe58542c06168c084565fcf3655f9531c5e3..9570204f4274a5aa1a28921ef960ecaeb3480e36 100644 (file)
@@ -361,8 +361,7 @@ spa_prop_get(spa_t *spa, nvlist_t **nvp)
                                        break;
                                }
 
-                               strval = kmem_alloc(
-                                   MAXNAMELEN + strlen(MOS_DIR_NAME) + 1,
+                               strval = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN,
                                    KM_SLEEP);
                                dsl_dataset_name(ds, strval);
                                dsl_dataset_rele(ds, FTAG);
@@ -375,8 +374,7 @@ spa_prop_get(spa_t *spa, nvlist_t **nvp)
                        spa_prop_add_list(*nvp, prop, strval, intval, src);
 
                        if (strval != NULL)
-                               kmem_free(strval,
-                                   MAXNAMELEN + strlen(MOS_DIR_NAME) + 1);
+                               kmem_free(strval, ZFS_MAX_DATASET_NAME_LEN);
 
                        break;
 
index 01aa4641e63fe50483fc949973e5ccbf3d2d785f..cf6fc224a2304bd8edd5dffd8c0ea8946b2d675d 100644 (file)
@@ -21,7 +21,7 @@
 
 /*
  * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 2011, 2014 by Delphix. All rights reserved.
+ * Copyright (c) 2011, 2015 by Delphix. All rights reserved.
  */
 
 #include <sys/spa.h>
@@ -493,7 +493,7 @@ spa_history_log_internal_ds(dsl_dataset_t *ds, const char *operation,
     dmu_tx_t *tx, const char *fmt, ...)
 {
        va_list adx;
-       char namebuf[MAXNAMELEN];
+       char namebuf[ZFS_MAX_DATASET_NAME_LEN];
        nvlist_t *nvl = fnvlist_alloc();
 
        ASSERT(tx != NULL);
@@ -512,7 +512,7 @@ spa_history_log_internal_dd(dsl_dir_t *dd, const char *operation,
     dmu_tx_t *tx, const char *fmt, ...)
 {
        va_list adx;
-       char namebuf[MAXNAMELEN];
+       char namebuf[ZFS_MAX_DATASET_NAME_LEN];
        nvlist_t *nvl = fnvlist_alloc();
 
        ASSERT(tx != NULL);
index e47cfc878d08a093c0a82ac2994dbece014d0fd8..d279d1828407e82eee45ccbed41af429bef64dcc 100644 (file)
@@ -749,12 +749,13 @@ zfsctl_snapshot_path_objset(zfs_sb_t *zsb, uint64_t objsetid,
                return (ENOENT);
 
        cookie = spl_fstrans_mark();
-       snapname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+       snapname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
 
        while (error == 0) {
                dsl_pool_config_enter(dmu_objset_pool(os), FTAG);
-               error = dmu_snapshot_list_next(zsb->z_os, MAXNAMELEN,
-                   snapname, &id, &pos, &case_conflict);
+               error = dmu_snapshot_list_next(zsb->z_os,
+                   ZFS_MAX_DATASET_NAME_LEN, snapname, &id, &pos,
+                   &case_conflict);
                dsl_pool_config_exit(dmu_objset_pool(os), FTAG);
                if (error)
                        goto out;
@@ -767,7 +768,7 @@ zfsctl_snapshot_path_objset(zfs_sb_t *zsb, uint64_t objsetid,
        snprintf(full_path, path_len - 1, "%s/.zfs/snapshot/%s",
            zsb->z_mntopts->z_mntpoint, snapname);
 out:
-       kmem_free(snapname, MAXNAMELEN);
+       kmem_free(snapname, ZFS_MAX_DATASET_NAME_LEN);
        spl_fstrans_unmark(cookie);
 
        return (error);
@@ -854,14 +855,14 @@ zfsctl_snapdir_rename(struct inode *sdip, char *snm,
 
        ZFS_ENTER(zsb);
 
-       to = kmem_alloc(MAXNAMELEN, KM_SLEEP);
-       from = kmem_alloc(MAXNAMELEN, KM_SLEEP);
-       real = kmem_alloc(MAXNAMELEN, KM_SLEEP);
-       fsname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+       to = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
+       from = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
+       real = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
+       fsname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
 
        if (zsb->z_case == ZFS_CASE_INSENSITIVE) {
                error = dmu_snapshot_realname(zsb->z_os, snm, real,
-                   MAXNAMELEN, NULL);
+                   ZFS_MAX_DATASET_NAME_LEN, NULL);
                if (error == 0) {
                        snm = real;
                } else if (error != ENOTSUP) {
@@ -871,9 +872,11 @@ zfsctl_snapdir_rename(struct inode *sdip, char *snm,
 
        dmu_objset_name(zsb->z_os, fsname);
 
-       error = zfsctl_snapshot_name(ITOZSB(sdip), snm, MAXNAMELEN, from);
+       error = zfsctl_snapshot_name(ITOZSB(sdip), snm,
+           ZFS_MAX_DATASET_NAME_LEN, from);
        if (error == 0)
-               error = zfsctl_snapshot_name(ITOZSB(tdip), tnm, MAXNAMELEN, to);
+               error = zfsctl_snapshot_name(ITOZSB(tdip), tnm,
+           ZFS_MAX_DATASET_NAME_LEN, to);
        if (error == 0)
                error = zfs_secpolicy_rename_perms(from, to, cr);
        if (error != 0)
@@ -903,10 +906,10 @@ zfsctl_snapdir_rename(struct inode *sdip, char *snm,
 
        rw_exit(&zfs_snapshot_lock);
 out:
-       kmem_free(from, MAXNAMELEN);
-       kmem_free(to, MAXNAMELEN);
-       kmem_free(real, MAXNAMELEN);
-       kmem_free(fsname, MAXNAMELEN);
+       kmem_free(from, ZFS_MAX_DATASET_NAME_LEN);
+       kmem_free(to, ZFS_MAX_DATASET_NAME_LEN);
+       kmem_free(real, ZFS_MAX_DATASET_NAME_LEN);
+       kmem_free(fsname, ZFS_MAX_DATASET_NAME_LEN);
 
        ZFS_EXIT(zsb);
 
@@ -929,12 +932,12 @@ zfsctl_snapdir_remove(struct inode *dip, char *name, cred_t *cr, int flags)
 
        ZFS_ENTER(zsb);
 
-       snapname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
-       real = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+       snapname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
+       real = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
 
        if (zsb->z_case == ZFS_CASE_INSENSITIVE) {
                error = dmu_snapshot_realname(zsb->z_os, name, real,
-                   MAXNAMELEN, NULL);
+                   ZFS_MAX_DATASET_NAME_LEN, NULL);
                if (error == 0) {
                        name = real;
                } else if (error != ENOTSUP) {
@@ -942,7 +945,8 @@ zfsctl_snapdir_remove(struct inode *dip, char *name, cred_t *cr, int flags)
                }
        }
 
-       error = zfsctl_snapshot_name(ITOZSB(dip), name, MAXNAMELEN, snapname);
+       error = zfsctl_snapshot_name(ITOZSB(dip), name,
+           ZFS_MAX_DATASET_NAME_LEN, snapname);
        if (error == 0)
                error = zfs_secpolicy_destroy_perms(snapname, cr);
        if (error != 0)
@@ -952,8 +956,8 @@ zfsctl_snapdir_remove(struct inode *dip, char *name, cred_t *cr, int flags)
        if ((error == 0) || (error == ENOENT))
                error = dsl_destroy_snapshot(snapname, B_FALSE);
 out:
-       kmem_free(snapname, MAXNAMELEN);
-       kmem_free(real, MAXNAMELEN);
+       kmem_free(snapname, ZFS_MAX_DATASET_NAME_LEN);
+       kmem_free(real, ZFS_MAX_DATASET_NAME_LEN);
 
        ZFS_EXIT(zsb);
 
@@ -975,7 +979,7 @@ zfsctl_snapdir_mkdir(struct inode *dip, char *dirname, vattr_t *vap,
        if (!zfs_admin_snapshot)
                return (EACCES);
 
-       dsname = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+       dsname = kmem_alloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
 
        if (zfs_component_namecheck(dirname, NULL, NULL) != 0) {
                error = SET_ERROR(EILSEQ);
@@ -997,7 +1001,7 @@ zfsctl_snapdir_mkdir(struct inode *dip, char *dirname, vattr_t *vap,
                    0, cr, NULL, NULL);
        }
 out:
-       kmem_free(dsname, MAXNAMELEN);
+       kmem_free(dsname, ZFS_MAX_DATASET_NAME_LEN);
 
        return (error);
 }
@@ -1075,11 +1079,11 @@ zfsctl_snapshot_mount(struct path *path, int flags)
        zsb = ITOZSB(ip);
        ZFS_ENTER(zsb);
 
-       full_name = kmem_zalloc(MAXNAMELEN, KM_SLEEP);
+       full_name = kmem_zalloc(ZFS_MAX_DATASET_NAME_LEN, KM_SLEEP);
        full_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
 
        error = zfsctl_snapshot_name(zsb, dname(dentry),
-           MAXNAMELEN, full_name);
+           ZFS_MAX_DATASET_NAME_LEN, full_name);
        if (error)
                goto error;
 
@@ -1153,7 +1157,7 @@ zfsctl_snapshot_mount(struct path *path, int flags)
        }
        path_put(&spath);
 error:
-       kmem_free(full_name, MAXNAMELEN);
+       kmem_free(full_name, ZFS_MAX_DATASET_NAME_LEN);
        kmem_free(full_path, MAXPATHLEN);
 
        ZFS_EXIT(zsb);
index 96f28220105e342091c9dc80e734cf10fea1c993..09f83a5cf683026e9dfffdb62d284146a53bd3a0 100644 (file)
@@ -604,7 +604,7 @@ zfs_secpolicy_setprop(const char *dsname, zfs_prop_t prop, nvpair_t *propval,
        case ZFS_PROP_SNAPSHOT_LIMIT:
                if (!INGLOBALZONE(curproc)) {
                        uint64_t zoned;
-                       char setpoint[MAXNAMELEN];
+                       char setpoint[ZFS_MAX_DATASET_NAME_LEN];
                        /*
                         * Unprivileged users are allowed to modify the
                         * limit on things *under* (ie. contained by)
@@ -846,7 +846,7 @@ zfs_secpolicy_destroy_snaps(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
 int
 zfs_secpolicy_rename_perms(const char *from, const char *to, cred_t *cr)
 {
-       char    parentname[MAXNAMELEN];
+       char    parentname[ZFS_MAX_DATASET_NAME_LEN];
        int     error;
 
        if ((error = zfs_secpolicy_write_perms(from,
@@ -899,7 +899,7 @@ zfs_secpolicy_promote(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
        error = dsl_dataset_hold(dp, zc->zc_name, FTAG, &clone);
 
        if (error == 0) {
-               char parentname[MAXNAMELEN];
+               char parentname[ZFS_MAX_DATASET_NAME_LEN];
                dsl_dataset_t *origin = NULL;
                dsl_dir_t *dd;
                dd = clone->ds_dir;
@@ -1076,7 +1076,7 @@ zfs_secpolicy_log_history(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
 static int
 zfs_secpolicy_create_clone(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
 {
-       char    parentname[MAXNAMELEN];
+       char    parentname[ZFS_MAX_DATASET_NAME_LEN];
        int     error;
        char    *origin;
 
@@ -1219,7 +1219,7 @@ zfs_secpolicy_hold(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
 
        for (pair = nvlist_next_nvpair(holds, NULL); pair != NULL;
            pair = nvlist_next_nvpair(holds, pair)) {
-               char fsname[MAXNAMELEN];
+               char fsname[ZFS_MAX_DATASET_NAME_LEN];
                error = dmu_fsname(nvpair_name(pair), fsname);
                if (error != 0)
                        return (error);
@@ -1240,7 +1240,7 @@ zfs_secpolicy_release(zfs_cmd_t *zc, nvlist_t *innvl, cred_t *cr)
 
        for (pair = nvlist_next_nvpair(innvl, NULL); pair != NULL;
            pair = nvlist_next_nvpair(innvl, pair)) {
-               char fsname[MAXNAMELEN];
+               char fsname[ZFS_MAX_DATASET_NAME_LEN];
                error = dmu_fsname(nvpair_name(pair), fsname);
                if (error != 0)
                        return (error);
@@ -2260,7 +2260,8 @@ zfs_ioc_snapshot_list_next(zfs_cmd_t *zc)
         * A dataset name of maximum length cannot have any snapshots,
         * so exit immediately.
         */
-       if (strlcat(zc->zc_name, "@", sizeof (zc->zc_name)) >= MAXNAMELEN) {
+       if (strlcat(zc->zc_name, "@", sizeof (zc->zc_name)) >=
+           ZFS_MAX_DATASET_NAME_LEN) {
                dmu_objset_rele(os, FTAG);
                return (SET_ERROR(ESRCH));
        }
@@ -3048,7 +3049,7 @@ zfs_fill_zplprops(const char *dataset, nvlist_t *createprops,
        boolean_t fuids_ok, sa_ok;
        uint64_t zplver = ZPL_VERSION;
        objset_t *os = NULL;
-       char parentname[MAXNAMELEN];
+       char parentname[ZFS_MAX_DATASET_NAME_LEN];
        char *cp;
        spa_t *spa;
        uint64_t spa_vers;
@@ -3414,7 +3415,7 @@ zfs_destroy_unmount_origin(const char *fsname)
                return;
        ds = dmu_objset_ds(os);
        if (dsl_dir_is_clone(ds->ds_dir) && DS_IS_DEFER_DESTROY(ds->ds_prev)) {
-               char originname[MAXNAMELEN];
+               char originname[ZFS_MAX_DATASET_NAME_LEN];
                dsl_dataset_name(ds->ds_prev, originname);
                dmu_objset_rele(os, FTAG);
                (void) zfs_unmount_snap(originname);
@@ -4266,7 +4267,7 @@ zfs_ioc_recv(zfs_cmd_t *zc)
        nvlist_t *props = NULL;
        char *origin = NULL;
        char *tosnap;
-       char tofs[ZFS_MAXNAMELEN];
+       char tofs[ZFS_MAX_DATASET_NAME_LEN];
        int error = 0;
 
        if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
@@ -4344,7 +4345,7 @@ zfs_ioc_recv_new(const char *fsname, nvlist_t *innvl, nvlist_t *outnvl)
        char *snapname = NULL;
        char *origin = NULL;
        char *tosnap;
-       char tofs[ZFS_MAXNAMELEN];
+       char tofs[ZFS_MAX_DATASET_NAME_LEN];
        boolean_t force;
        boolean_t resumable;
        uint64_t action_handle = 0;
index a72841c15e6c217a27d59c3a50c45d24948b65e8..ef04b203dc606eccb71eb6e85a55b4b30e447c33 100644 (file)
@@ -1020,7 +1020,7 @@ zfs_statvfs(struct dentry *dentry, struct kstatfs *statp)
        statp->f_fsid.val[0] = (uint32_t)fsid;
        statp->f_fsid.val[1] = (uint32_t)(fsid >> 32);
        statp->f_type = ZFS_SUPER_MAGIC;
-       statp->f_namelen = ZFS_MAXNAMELEN;
+       statp->f_namelen = MAXNAMELEN - 1;
 
        /*
         * We have all of 40 characters to stuff a string here.
index 988ffec292f3d649915a38d3781ddfd4b84b555b..863ccb930c373239ce9e284f4d461e80899407db 100644 (file)
@@ -2080,7 +2080,7 @@ typedef struct zil_replay_arg {
 static int
 zil_replay_error(zilog_t *zilog, lr_t *lr, int error)
 {
-       char name[MAXNAMELEN];
+       char name[ZFS_MAX_DATASET_NAME_LEN];
 
        zilog->zl_replaying_seq--;      /* didn't actually replay this one */
 
index 089e3a1bcc97fad60ed3d4c869bb29e27e70d213..8c75698e5881cd91c39fc5c5e95c9361c7dfdd93 100644 (file)
@@ -50,7 +50,7 @@ zpl_lookup(struct inode *dir, struct dentry *dentry, unsigned int flags)
        int zfs_flags = 0;
        zfs_sb_t *zsb = dentry->d_sb->s_fs_info;
 
-       if (dlen(dentry) > ZFS_MAXNAMELEN)
+       if (dlen(dentry) > ZFS_MAX_DATASET_NAME_LEN)
                return (ERR_PTR(-ENAMETOOLONG));
 
        crhold(cr);