From e550644f0cdd5c3f312e8fc92846b8b1fc4290f2 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 13 Apr 2017 09:40:00 -0700 Subject: [PATCH] OpenZFS 5120 - zfs should allow large block/gzip/raidz boot pool (loader project) Authored by: Toomas Soome Reviewed by: George Wilson Reviewed by: Yuri Pankov Reviewed by: Andrew Stormont Reviewed by: Matthew Ahrens Approved by: Robert Mustacchi Reviewed-by: Giuseppe Di Natale Reviewed-by: George Melikov Reviewed-by: Don Brady Ported-by: Brian Behlendorf Porting Notes: - grub-2.02-beta2-422-gcad5cc0 includes support for large blocks. - Commit 8aab121 allowed GZIP[1-9]. - Grub allows pools with multiple top-level vdevs. OpenZFS-issue: https://www.illumos.org/issues/5120 OpenZFS-commit: https://github.com/openzfs/openzfs/commit/c8811bd Closes #6007 --- include/sys/zio.h | 2 ++ module/zfs/spa.c | 8 ++------ module/zfs/vdev.c | 24 ++++++------------------ module/zfs/zfs_ioctl.c | 12 ++---------- 4 files changed, 12 insertions(+), 34 deletions(-) diff --git a/include/sys/zio.h b/include/sys/zio.h index b69146b6e481..23c918af18ce 100644 --- a/include/sys/zio.h +++ b/include/sys/zio.h @@ -24,6 +24,8 @@ * Copyright 2011 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2012, 2017 by Delphix. All rights reserved. * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. + * Copyright (c) 2013, Joyent, Inc. All rights reserved. + * Copyright 2016 Toomas Soome */ #ifndef _ZIO_H diff --git a/module/zfs/spa.c b/module/zfs/spa.c index f573fe0d7968..638ec59efd64 100644 --- a/module/zfs/spa.c +++ b/module/zfs/spa.c @@ -26,6 +26,8 @@ * Copyright (c) 2013, 2014, Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2014 Spectra Logic Corporation, All rights reserved. * Copyright 2013 Saso Kiselkov. All rights reserved. + * Copyright (c) 2014 Integros [integros.com] + * Copyright 2016 Toomas Soome * Copyright (c) 2016 Actifio, Inc. All rights reserved. */ @@ -534,12 +536,6 @@ spa_prop_validate(spa_t *spa, nvlist_t *props) &propval)) == 0 && !BOOTFS_COMPRESS_VALID(propval)) { error = SET_ERROR(ENOTSUP); - } else if ((error = - dsl_prop_get_int_ds(dmu_objset_ds(os), - zfs_prop_to_name(ZFS_PROP_RECORDSIZE), - &propval)) == 0 && - propval > SPA_OLD_MAXBLOCKSIZE) { - error = SET_ERROR(ENOTSUP); } else if ((error = dsl_prop_get_int_ds(dmu_objset_ds(os), zfs_prop_to_name(ZFS_PROP_DNODESIZE), diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c index 40293ec1fc10..caf92899d0c8 100644 --- a/module/zfs/vdev.c +++ b/module/zfs/vdev.c @@ -23,6 +23,8 @@ * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2015 by Delphix. All rights reserved. * Copyright 2015 Nexenta Systems, Inc. All rights reserved. + * Copyright (c) 2014 Integros [integros.com] + * Copyright 2016 Toomas Soome */ #include @@ -3542,36 +3544,22 @@ vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux) /* * Check the vdev configuration to ensure that it's capable of supporting - * a root pool. + * a root pool. We do not support partial configuration. */ boolean_t vdev_is_bootable(vdev_t *vd) { -#if defined(__sun__) || defined(__sun) - /* - * Currently, we do not support RAID-Z or partial configuration. - * In addition, only a single top-level vdev is allowed and none of the - * leaves can be wholedisks. - */ - int c; - if (!vd->vdev_ops->vdev_op_leaf) { - char *vdev_type = vd->vdev_ops->vdev_op_type; + const char *vdev_type = vd->vdev_ops->vdev_op_type; - if (strcmp(vdev_type, VDEV_TYPE_ROOT) == 0 && - vd->vdev_children > 1) { + if (strcmp(vdev_type, VDEV_TYPE_MISSING) == 0) return (B_FALSE); - } else if (strcmp(vdev_type, VDEV_TYPE_RAIDZ) == 0 || - strcmp(vdev_type, VDEV_TYPE_MISSING) == 0) { - return (B_FALSE); - } } - for (c = 0; c < vd->vdev_children; c++) { + for (int c = 0; c < vd->vdev_children; c++) { if (!vdev_is_bootable(vd->vdev_child[c])) return (B_FALSE); } -#endif /* __sun__ || __sun */ return (B_TRUE); } diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index 6df61fecb831..534df5a06274 100644 --- a/module/zfs/zfs_ioctl.c +++ b/module/zfs/zfs_ioctl.c @@ -30,6 +30,8 @@ * Copyright (c) 2011, 2015 by Delphix. All rights reserved. * Copyright (c) 2013 by Saso Kiselkov. All rights reserved. * Copyright (c) 2013 Steven Hartland. All rights reserved. + * Copyright (c) 2014 Integros [integros.com] + * Copyright 2016 Toomas Soome * Copyright (c) 2016 Actifio, Inc. All rights reserved. */ @@ -3856,16 +3858,6 @@ zfs_check_settable(const char *dsname, nvpair_t *pair, cred_t *cr) intval > SPA_OLD_MAXBLOCKSIZE) { spa_t *spa; - /* - * If this is a bootable dataset then - * we don't allow large (>128K) blocks, - * because GRUB doesn't support them. - */ - if (zfs_is_bootfs(dsname) && - intval > SPA_OLD_MAXBLOCKSIZE) { - return (SET_ERROR(ERANGE)); - } - /* * We don't allow setting the property above 1MB, * unless the tunable has been changed.