mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-25 11:47:43 +03:00
Illumos 5027 - zfs large block support
5027 zfs large block support Reviewed by: Alek Pinchuk <pinchuk.alek@gmail.com> Reviewed by: George Wilson <george.wilson@delphix.com> Reviewed by: Josef 'Jeff' Sipek <josef.sipek@nexenta.com> Reviewed by: Richard Elling <richard.elling@richardelling.com> Reviewed by: Saso Kiselkov <skiselkov.ml@gmail.com> Reviewed by: Brian Behlendorf <behlendorf1@llnl.gov> Approved by: Dan McDonald <danmcd@omniti.com> References: https://www.illumos.org/issues/5027 https://github.com/illumos/illumos-gate/commit/b515258 Porting Notes: * Included in this patch is a tiny ISP2() cleanup in zio_init() from Illumos 5255. * Unlike the upstream Illumos commit this patch does not impose an arbitrary 128K block size limit on volumes. Volumes, like filesystems, are limited by the zfs_max_recordsize=1M module option. * By default the maximum record size is limited to 1M by the module option zfs_max_recordsize. This value may be safely increased up to 16M which is the largest block size supported by the on-disk format. At the moment, 1M blocks clearly offer a significant performance improvement but the benefits of going beyond this for the majority of workloads are less clear. * The illumos version of this patch increased DMU_MAX_ACCESS to 32M. This was determined not to be large enough when using 16M blocks because the zfs_make_xattrdir() function will fail (EFBIG) when assigning a TX. This was immediately observed under Linux because all newly created files must have a security xattr created and that was failing. Therefore, we've set DMU_MAX_ACCESS to 64M. * On 32-bit platforms a hard limit of 1M is set for blocks due to the limited virtual address space. We should be able to relax this one the ABD patches are merged. Ported-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #354
This commit is contained in:
committed by
Brian Behlendorf
parent
3df293404a
commit
f1512ee61e
+7
-4
@@ -243,6 +243,7 @@ zil_read_log_block(zilog_t *zilog, const blkptr_t *bp, blkptr_t *nbp, void *dst,
|
||||
sizeof (cksum)) || BP_IS_HOLE(&zilc->zc_next_blk)) {
|
||||
error = SET_ERROR(ECKSUM);
|
||||
} else {
|
||||
ASSERT3U(len, <=, SPA_OLD_MAXBLOCKSIZE);
|
||||
bcopy(lr, dst, len);
|
||||
*end = (char *)dst + len;
|
||||
*nbp = zilc->zc_next_blk;
|
||||
@@ -257,6 +258,8 @@ zil_read_log_block(zilog_t *zilog, const blkptr_t *bp, blkptr_t *nbp, void *dst,
|
||||
(zilc->zc_nused > (size - sizeof (*zilc)))) {
|
||||
error = SET_ERROR(ECKSUM);
|
||||
} else {
|
||||
ASSERT3U(zilc->zc_nused, <=,
|
||||
SPA_OLD_MAXBLOCKSIZE);
|
||||
bcopy(lr, dst, zilc->zc_nused);
|
||||
*end = (char *)dst + zilc->zc_nused;
|
||||
*nbp = zilc->zc_next_blk;
|
||||
@@ -342,7 +345,7 @@ zil_parse(zilog_t *zilog, zil_parse_blk_func_t *parse_blk_func,
|
||||
* If the log has been claimed, stop if we encounter a sequence
|
||||
* number greater than the highest claimed sequence number.
|
||||
*/
|
||||
lrbuf = zio_buf_alloc(SPA_MAXBLOCKSIZE);
|
||||
lrbuf = zio_buf_alloc(SPA_OLD_MAXBLOCKSIZE);
|
||||
zil_bp_tree_init(zilog);
|
||||
|
||||
for (blk = zh->zh_log; !BP_IS_HOLE(&blk); blk = next_blk) {
|
||||
@@ -389,7 +392,7 @@ done:
|
||||
(max_blk_seq == claim_blk_seq && max_lr_seq == claim_lr_seq));
|
||||
|
||||
zil_bp_tree_fini(zilog);
|
||||
zio_buf_free(lrbuf, SPA_MAXBLOCKSIZE);
|
||||
zio_buf_free(lrbuf, SPA_OLD_MAXBLOCKSIZE);
|
||||
|
||||
return (error);
|
||||
}
|
||||
@@ -941,7 +944,7 @@ zil_lwb_write_init(zilog_t *zilog, lwb_t *lwb)
|
||||
*
|
||||
* These must be a multiple of 4KB. Note only the amount used (again
|
||||
* aligned to 4KB) actually gets written. However, we can't always just
|
||||
* allocate SPA_MAXBLOCKSIZE as the slog space could be exhausted.
|
||||
* allocate SPA_OLD_MAXBLOCKSIZE as the slog space could be exhausted.
|
||||
*/
|
||||
uint64_t zil_block_buckets[] = {
|
||||
4096, /* non TX_WRITE */
|
||||
@@ -1023,7 +1026,7 @@ zil_lwb_write_start(zilog_t *zilog, lwb_t *lwb)
|
||||
continue;
|
||||
zil_blksz = zil_block_buckets[i];
|
||||
if (zil_blksz == UINT64_MAX)
|
||||
zil_blksz = SPA_MAXBLOCKSIZE;
|
||||
zil_blksz = SPA_OLD_MAXBLOCKSIZE;
|
||||
zilog->zl_prev_blks[zilog->zl_prev_rotor] = zil_blksz;
|
||||
for (i = 0; i < ZIL_PREV_BLKS; i++)
|
||||
zil_blksz = MAX(zil_blksz, zilog->zl_prev_blks[i]);
|
||||
|
||||
Reference in New Issue
Block a user