X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fosd-zfs%2Fosd_handler.c;h=334310d98da5b46fe41e8d758173556051005d43;hp=4f78957aad06907b927c496b0283b848649cfa42;hb=60270c6488b01db756eb216548f83f2826972854;hpb=f045898e125128226631b8d949a61420332d9237 diff --git a/lustre/osd-zfs/osd_handler.c b/lustre/osd-zfs/osd_handler.c index 4f78957..334310d 100644 --- a/lustre/osd-zfs/osd_handler.c +++ b/lustre/osd-zfs/osd_handler.c @@ -214,9 +214,8 @@ static int osd_trans_start(const struct lu_env *env, struct dt_device *d, struct osd_device *osd = osd_dt_dev(d); /* dmu will call commit callback with error code during abort */ if (!lu_device_is_md(&d->dd_lu_dev) && rc == -ENOSPC) - CERROR("%s: failed to start transaction due to ENOSPC. " - "Metadata overhead is underestimated or " - "grant_ratio is too low.\n", osd->od_svname); + CERROR("%s: failed to start transaction due to ENOSPC" + "\n", osd->od_svname); else CERROR("%s: can't assign tx: rc = %d\n", osd->od_svname, rc); @@ -474,14 +473,13 @@ static int osd_objset_statfs(struct osd_device *osd, struct obd_statfs *osfs) * for internal files to be created/unlinked when space is tight. */ CLASSERT(OSD_STATFS_RESERVED_SIZE > 0); - if (likely(osfs->os_blocks >= OSD_STATFS_RESERVED_SIZE)) + reserved = OSD_STATFS_RESERVED_SIZE >> bshift; + if (likely(osfs->os_blocks >= reserved << OSD_STATFS_RESERVED_SHIFT)) reserved = osfs->os_blocks >> OSD_STATFS_RESERVED_SHIFT; - else - reserved = OSD_STATFS_RESERVED_SIZE >> bshift; osfs->os_blocks -= reserved; - osfs->os_bfree -= MIN(reserved, osfs->os_bfree); - osfs->os_bavail -= MIN(reserved, osfs->os_bavail); + osfs->os_bfree -= min(reserved, osfs->os_bfree); + osfs->os_bavail -= min(reserved, osfs->os_bavail); /* * The availobjs value returned from dmu_objset_space() is largely @@ -563,7 +561,7 @@ static void osd_conf_get(const struct lu_env *env, */ param->ddp_max_name_len = MAXNAMELEN; param->ddp_max_nlink = 1 << 31; /* it's 8byte on a disk */ - param->ddp_block_shift = 12; /* XXX */ + param->ddp_symlink_max = PATH_MAX; param->ddp_mount_type = LDD_MT_ZFS; param->ddp_mntopts = MNTOPT_USERXATTR; @@ -574,20 +572,22 @@ static void osd_conf_get(const struct lu_env *env, /* for maxbytes, report same value as ZPL */ param->ddp_maxbytes = MAX_LFS_FILESIZE; - /* Default reserved fraction of the available space that should be kept - * for error margin. Unfortunately, there are many factors that can - * impact the overhead with zfs, so let's be very cautious for now and - * reserve 20% of the available space which is not given out as grant. - * This tunable can be changed on a live system via procfs if needed. */ - param->ddp_grant_reserved = 20; - /* inodes are dynamically allocated, so we report the per-inode space * consumption to upper layers. This static value is not really accurate * and we should use the same logic as in udmu_objset_statfs() to * estimate the real size consumed by an object */ param->ddp_inodespace = OSD_DNODE_EST_COUNT; - /* per-fragment overhead to be used by the client code */ - param->ddp_grant_frag = osd_blk_insert_cost(osd); + /* Although ZFS isn't an extent-based filesystem, the metadata overhead + * (i.e. 7 levels of indirect blocks, see osd_blk_insert_cost()) should + * not be accounted for every single new block insertion. + * Instead, the maximum extent size is set to the number of blocks that + * can fit into a single contiguous indirect block. There would be some + * cases where this crosses indirect blocks, but it also won't have 7 + * new levels of indirect blocks in that case either, so it will still + * have enough reserved space for the extra indirect block */ + param->ddp_max_extent_blks = + (1 << (DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT)); + param->ddp_extent_tax = osd_blk_insert_cost(osd); } /* @@ -1028,7 +1028,8 @@ static int osd_mount(const struct lu_env *env, osd_unlinked_drain(env, o); err: if (rc) { - dmu_objset_disown(o->od_os, o); + if (o->od_os) + dmu_objset_disown(o->od_os, o); o->od_os = NULL; } @@ -1088,13 +1089,19 @@ static struct lu_device *osd_device_alloc(const struct lu_env *env, struct lu_device_type *type, struct lustre_cfg *cfg) { - struct osd_device *dev; - int rc; + struct osd_device *dev; + struct osd_seq_list *osl; + int rc; OBD_ALLOC_PTR(dev); if (dev == NULL) return ERR_PTR(-ENOMEM); + osl = &dev->od_seq_list; + INIT_LIST_HEAD(&osl->osl_seq_list); + rwlock_init(&osl->osl_seq_list_lock); + sema_init(&osl->osl_seq_init_sem, 1); + rc = dt_device_init(&dev->od_dt_dev, type); if (rc == 0) { rc = osd_device_init0(env, dev, cfg); @@ -1394,9 +1401,8 @@ static void __exit osd_exit(void) } extern unsigned int osd_oi_count; -CFS_MODULE_PARM(osd_oi_count, "i", int, 0444, - "Number of Object Index containers to be created, " - "it's only valid for new filesystem."); +module_param(osd_oi_count, int, 0444); +MODULE_PARM_DESC(osd_oi_count, "Number of Object Index containers to be created, it's only valid for new filesystem."); MODULE_AUTHOR("OpenSFS, Inc. "); MODULE_DESCRIPTION("Lustre Object Storage Device ("LUSTRE_OSD_ZFS_NAME")");