X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;ds=sidebyside;f=lustre%2Fosd-zfs%2Fosd_handler.c;h=10ef06c3e0bac9678a036ce30a0c9f1446524b9b;hb=0098396983e1075668414aa5298a4990e61ffbda;hp=b224c598452dd620e089be5c711bb593b74fd9e4;hpb=e763467ebe00913e8d03f855dc4b918b95099931;p=fs%2Flustre-release.git diff --git a/lustre/osd-zfs/osd_handler.c b/lustre/osd-zfs/osd_handler.c index b224c59..10ef06c 100644 --- a/lustre/osd-zfs/osd_handler.c +++ b/lustre/osd-zfs/osd_handler.c @@ -280,13 +280,12 @@ static int osd_trans_stop(const struct lu_env *env, struct dt_device *dt, struct osd_device *osd = osd_dt_dev(th->th_dev); bool sync = (th->th_sync != 0); struct osd_thandle *oh; - struct list_head unlinked; + LIST_HEAD(unlinked); uint64_t txg; int rc; ENTRY; oh = container_of0(th, struct osd_thandle, ot_super); - INIT_LIST_HEAD(&unlinked); list_splice_init(&oh->ot_unlinked_list, &unlinked); osd_oti_get(env)->oti_ins_cache_depth--; @@ -411,8 +410,8 @@ uint64_t osd_objs_count_estimate(uint64_t usedbytes, uint64_t usedobjs, * gradually disappears as the number of real dnodes grows. It also * avoids the need to check for divide-by-zero computing dn_per_block. */ - CLASSERT(OSD_DNODE_MIN_BLKSHIFT > 0); - CLASSERT(OSD_DNODE_EST_BLKSHIFT > 0); + BUILD_BUG_ON(OSD_DNODE_MIN_BLKSHIFT <= 0); + BUILD_BUG_ON(OSD_DNODE_EST_BLKSHIFT <= 0); est_usedblocks = ((OSD_DNODE_EST_COUNT << OSD_DNODE_EST_BLKSHIFT) + usedbytes) >> est_maxblockshift; @@ -513,7 +512,7 @@ static int osd_objset_statfs(struct osd_device *osd, struct obd_statfs *osfs) * Reserve 0.78% of total space, at least 16MB for small filesystems, * for internal files to be created/unlinked when space is tight. */ - CLASSERT(OSD_STATFS_RESERVED_SIZE > 0); + BUILD_BUG_ON(OSD_STATFS_RESERVED_SIZE <= 0); reserved = OSD_STATFS_RESERVED_SIZE >> bshift; if (likely(osfs->os_blocks >= reserved << OSD_STATFS_RESERVED_SHIFT)) reserved = osfs->os_blocks >> OSD_STATFS_RESERVED_SHIFT; @@ -552,18 +551,25 @@ static int osd_objset_statfs(struct osd_device *osd, struct obd_statfs *osfs) * Concurrency: shouldn't matter. */ int osd_statfs(const struct lu_env *env, struct dt_device *d, - struct obd_statfs *osfs) + struct obd_statfs *osfs, struct obd_statfs_info *info) { - int rc; + struct osd_device *osd = osd_dt_dev(d); + int rc; ENTRY; - rc = osd_objset_statfs(osd_dt_dev(d), osfs); + rc = osd_objset_statfs(osd, osfs); if (unlikely(rc != 0)) RETURN(rc); osfs->os_bavail -= min_t(u64, OSD_GRANT_FOR_LOCAL_OIDS / osfs->os_bsize, osfs->os_bavail); + + /* ZFS does not support reporting nonrotional status yet, so return + * flag only if user has set nonrotational. + */ + osfs->os_state |= osd->od_nonrotational ? OS_STATE_NONROT : 0; + RETURN(0); } @@ -578,7 +584,7 @@ static int osd_blk_insert_cost(struct osd_device *osd) /* nr_blkptrshift is the log2 of the number of block pointers that can * be stored in an indirect block */ - CLASSERT(DN_MAX_INDBLKSHIFT > SPA_BLKPTRSHIFT); + BUILD_BUG_ON(DN_MAX_INDBLKSHIFT <= SPA_BLKPTRSHIFT); nr_blkptrshift = DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT; /* max_blockshift / nr_blkptrshift is thus the maximum depth of the @@ -608,7 +614,8 @@ static void osd_conf_get(const struct lu_env *env, param->ddp_mntopts = MNTOPT_USERXATTR; if (osd->od_posix_acl) param->ddp_mntopts |= MNTOPT_ACL; - param->ddp_max_ea_size = DXATTR_MAX_ENTRY_SIZE; + /* Previously DXATTR_MAX_ENTRY_SIZE */ + param->ddp_max_ea_size = OBD_MAX_EA_SIZE; /* for maxbytes, report same value as ZPL */ param->ddp_maxbytes = MAX_LFS_FILESIZE; @@ -904,7 +911,7 @@ static int osd_objset_open(struct osd_device *o) rc = -osd_dmu_objset_own(o->od_mntdev, DMU_OST_ZFS, o->od_dt_dev.dd_rdonly ? B_TRUE : B_FALSE, - B_FALSE, o, &o->od_os); + B_TRUE, o, &o->od_os); if (rc) { CERROR("%s: can't open %s\n", o->od_svname, o->od_mntdev); @@ -969,7 +976,7 @@ static int osd_objset_open(struct osd_device *o) out: if (rc != 0 && o->od_os != NULL) { - osd_dmu_objset_disown(o->od_os, B_FALSE, o); + osd_dmu_objset_disown(o->od_os, B_TRUE, o); o->od_os = NULL; } @@ -1202,7 +1209,7 @@ static int osd_mount(const struct lu_env *env, osd_unlinked_drain(env, o); err: if (rc && o->od_os) { - osd_dmu_objset_disown(o->od_os, B_FALSE, o); + osd_dmu_objset_disown(o->od_os, B_TRUE, o); o->od_os = NULL; } @@ -1249,7 +1256,7 @@ static void osd_umount(const struct lu_env *env, struct osd_device *o) txg_wait_synced(dmu_objset_pool(o->od_os), 0ULL); /* close the object set */ - osd_dmu_objset_disown(o->od_os, B_FALSE, o); + osd_dmu_objset_disown(o->od_os, B_TRUE, o); o->od_os = NULL; } @@ -1274,6 +1281,11 @@ static int osd_device_init0(const struct lu_env *env, INIT_LIST_HEAD(&o->od_ios_list); o->od_auto_scrub_interval = AS_DEFAULT; + /* ZFS does not support reporting nonrotional status yet, so this flag + * is only set if explicitly set by the user. + */ + o->od_nonrotational = 0; + out: RETURN(rc); } @@ -1601,7 +1613,7 @@ static struct lu_device_type osd_device_type = { }; -static struct obd_ops osd_obd_device_ops = { +static const struct obd_ops osd_obd_device_ops = { .o_owner = THIS_MODULE, .o_connect = osd_obd_connect, .o_disconnect = osd_obd_disconnect,