* GPL HEADER END
*/
/*
- * Copyright (c) 2012, 2016, Intel Corporation.
+ * Copyright (c) 2012, 2017, Intel Corporation.
* Use is subject to license terms.
*/
/*
if (strlen(mop->mo_mkfsopts) != 0)
snprintf(str, len, " -o %s", mop->mo_mkfsopts);
+ if (mop->mo_device_kb)
+ snprintf(str, len, " -o quota=%llu",
+ mop->mo_device_kb * 1024);
return str;
}
php = zpool_open(g_zfs, pool);
if (php) {
pool_exists = 1;
+ zpool_set_prop(php, "canmount", "off");
zpool_close(php);
}
/*
* Set Options on ZPOOL
*
- * ALL - canmount=off
+ * ALL - canmount=off (set above)
* 0.7.0 - multihost=on
+ * 0.7.0 - feature@userobj_accounting=enabled
*/
php = zpool_open(g_zfs, pool);
if (php) {
- if (pool_exists)
- zpool_set_prop(php, "canmount", "off");
-
zpool_set_prop(php, "multihost", "on");
+ zpool_set_prop(php, "feature@userobj_accounting", "enabled");
zpool_close(php);
}
/*
* Create the ZFS filesystem with any required mkfs options:
* - canmount=off is set to prevent zfs automounting
- * - xattr=sa is set to use system attribute based xattrs
*/
memset(mkfs_cmd, 0, PATH_MAX);
snprintf(mkfs_cmd, PATH_MAX,
- "zfs create -o canmount=off -o xattr=sa%s %s",
+ "zfs create -o canmount=off %s %s",
zfs_mkfs_opts(mop, mkfs_tmp, PATH_MAX), ds);
vprint("mkfs_cmd = %s\n", mkfs_cmd);
goto out;
}
+ /*
+ * Attempt to set dataset properties to reasonable defaults
+ * to optimize performance, unless the values were specified
+ * at the mkfs command line. Some ZFS pools or ZFS versions
+ * do not support these properties. We can safely ignore the
+ * errors and continue in those cases.
+ *
+ * zfs 0.6.1 - system attribute based xattrs
+ * zfs 0.6.5 - large block support
+ * zfs 0.7.0 - large dnode support
+ *
+ * Check if zhp is NULL as a defensive measure. Any dataset
+ * validation errors that would cause zfs_open() to fail
+ * should have been caught earlier.
+ */
+ zhp = zfs_open(g_zfs, ds, ZFS_TYPE_FILESYSTEM);
+ if (zhp) {
+ /* zfs 0.6.1 - system attribute based xattrs */
+ if (!strstr(mop->mo_mkfsopts, "xattr="))
+ zfs_set_prop_str(zhp, "xattr", "sa");
+
+ /* zfs 0.7.0 - large dnode support */
+ if (!strstr(mop->mo_mkfsopts, "dnodesize=") &&
+ !strstr(mop->mo_mkfsopts, "dnsize="))
+ zfs_set_prop_str(zhp, "dnodesize", "auto");
+
+ if (IS_OST(&mop->mo_ldd)) {
+ /* zfs 0.6.5 - large block support */
+ if (!strstr(mop->mo_mkfsopts, "recordsize=") &&
+ !strstr(mop->mo_mkfsopts, "recsize="))
+ zfs_set_prop_str(zhp, "recordsize", "1M");
+ }
+
+ zfs_close(zhp);
+ }
+
out:
if (pool != NULL)
free(pool);