765
766 /* check number of arguments */
767 if (argc == 0) {
768 (void) fprintf(stderr, gettext("missing %s argument\n"),
769 zfs_type_to_name(type));
770 goto badusage;
771 }
772 if (argc > 1) {
773 (void) fprintf(stderr, gettext("too many arguments\n"));
774 goto badusage;
775 }
776
777 if (type == ZFS_TYPE_VOLUME && !noreserve) {
778 zpool_handle_t *zpool_handle;
779 nvlist_t *real_props;
780 uint64_t spa_version;
781 char *p;
782 zfs_prop_t resv_prop;
783 char *strval;
784 char msg[1024];
785
786 if (p = strchr(argv[0], '/'))
787 *p = '\0';
788 zpool_handle = zpool_open(g_zfs, argv[0]);
789 if (p != NULL)
790 *p = '/';
791 if (zpool_handle == NULL)
792 goto error;
793 spa_version = zpool_get_prop_int(zpool_handle,
794 ZPOOL_PROP_VERSION, NULL);
795 zpool_close(zpool_handle);
796 if (spa_version >= SPA_VERSION_REFRESERVATION)
797 resv_prop = ZFS_PROP_REFRESERVATION;
798 else
799 resv_prop = ZFS_PROP_RESERVATION;
800
801 (void) snprintf(msg, sizeof (msg),
802 gettext("cannot create '%s'"), argv[0]);
803 if (props && (real_props = zfs_valid_proplist(g_zfs, type,
804 props, 0, NULL, msg)) == NULL)
805 goto error;
806
807 volsize = zvol_volsize_to_reservation(volsize, real_props);
808 nvlist_free(real_props);
809
810 if (nvlist_lookup_string(props, zfs_prop_to_name(resv_prop),
811 &strval) != 0) {
812 if (nvlist_add_uint64(props,
813 zfs_prop_to_name(resv_prop), volsize) != 0) {
814 nvlist_free(props);
815 nomem();
816 }
817 }
818 }
819
820 if (parents && zfs_name_valid(argv[0], type)) {
821 /*
822 * Now create the ancestors of target dataset. If the target
823 * already exists and '-p' option was used we should not
824 * complain.
825 */
826 if (zfs_dataset_exists(g_zfs, argv[0], type)) {
827 ret = 0;
|
765
766 /* check number of arguments */
767 if (argc == 0) {
768 (void) fprintf(stderr, gettext("missing %s argument\n"),
769 zfs_type_to_name(type));
770 goto badusage;
771 }
772 if (argc > 1) {
773 (void) fprintf(stderr, gettext("too many arguments\n"));
774 goto badusage;
775 }
776
777 if (type == ZFS_TYPE_VOLUME && !noreserve) {
778 zpool_handle_t *zpool_handle;
779 nvlist_t *real_props;
780 uint64_t spa_version;
781 char *p;
782 zfs_prop_t resv_prop;
783 char *strval;
784 char msg[1024];
785 uint64_t volblocksize;
786 int ncopies;
787
788 if (p = strchr(argv[0], '/'))
789 *p = '\0';
790 zpool_handle = zpool_open(g_zfs, argv[0]);
791 if (p != NULL)
792 *p = '/';
793 if (zpool_handle == NULL)
794 goto error;
795 spa_version = zpool_get_prop_int(zpool_handle,
796 ZPOOL_PROP_VERSION, NULL);
797 zpool_close(zpool_handle);
798 if (spa_version >= SPA_VERSION_REFRESERVATION)
799 resv_prop = ZFS_PROP_REFRESERVATION;
800 else
801 resv_prop = ZFS_PROP_RESERVATION;
802
803 (void) snprintf(msg, sizeof (msg),
804 gettext("cannot create '%s'"), argv[0]);
805 if (props && (real_props = zfs_valid_proplist(g_zfs, type,
806 props, 0, NULL, msg)) == NULL)
807 goto error;
808
809 if (nvlist_lookup_string(real_props,
810 zfs_prop_to_name(ZFS_PROP_COPIES), &strval) == 0)
811 ncopies = atoi(strval);
812 else
813 ncopies = 1;
814 if (nvlist_lookup_uint64(real_props,
815 zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE),
816 &volblocksize) != 0)
817 volblocksize = ZVOL_DEFAULT_BLOCKSIZE;
818
819 volsize = zvol_volsize_to_reservation(volsize,
820 volblocksize, ncopies);
821 nvlist_free(real_props);
822
823 if (nvlist_lookup_string(props, zfs_prop_to_name(resv_prop),
824 &strval) != 0) {
825 if (nvlist_add_uint64(props,
826 zfs_prop_to_name(resv_prop), volsize) != 0) {
827 nvlist_free(props);
828 nomem();
829 }
830 }
831 }
832
833 if (parents && zfs_name_valid(argv[0], type)) {
834 /*
835 * Now create the ancestors of target dataset. If the target
836 * already exists and '-p' option was used we should not
837 * complain.
838 */
839 if (zfs_dataset_exists(g_zfs, argv[0], type)) {
840 ret = 0;
|