summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Matuska <[email protected]>2013-04-12 10:26:03 -0700
committerBrian Behlendorf <[email protected]>2013-04-12 10:50:46 -0700
commitb28e57cb82c5d5a992b90c56f67dd7dbf9b6f296 (patch)
treef2e2e84de3d437c24454b27ed69706c9260ddf4c
parent295304bed6fa6744b8d011e36b9c2180311cedb2 (diff)
Allow setting a lower ashift with -o ashift
Previous patches have allowed you to set an increased ashift to avoid doing 512b IO with 4k sector devices. However, it was not possible to set the ashift lower than the reported physical sector size even when a smaller logical size was supported. In practice, there are several cases where settong a lower ashift is useful: * Most modern drives now correctly report their physical sector size as 4k. This causes zfs to correctly default to using a 4k sector size (ashift=12). However, for some usage models this new default ashift value causes an unacceptable increase in space usage. Filesystems with many small files may see the total available space reduced to 30-40% which is unacceptable. * When replacing a drive in an existing pool which was created with ashift=9 a modern 4k sector drive cannot be used. The 'zpool replace' command will issue an error that the new drive has an 'incompatible sector alignment'. However, by allowing the ashift to be manual specified as smaller, non-optimal, value the device may still be safely used. Signed-off-by: Brian Behlendorf <[email protected]> Closes #1381 Closes #1328 Issue #967 Issue #548
-rw-r--r--module/zfs/vdev.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/module/zfs/vdev.c b/module/zfs/vdev.c
index 06097f355..afff4d423 100644
--- a/module/zfs/vdev.c
+++ b/module/zfs/vdev.c
@@ -1258,11 +1258,12 @@ vdev_open(vdev_t *vd)
if (vd->vdev_asize == 0) {
/*
* This is the first-ever open, so use the computed values.
- * For testing purposes, a higher ashift can be requested.
+ * For compatibility, a different ashift can be requested.
*/
vd->vdev_asize = asize;
vd->vdev_max_asize = max_asize;
- vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
+ if (vd->vdev_ashift == 0)
+ vd->vdev_ashift = ashift;
} else {
/*
* Detect if the alignment requirement has increased.