X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosp%2Fosp_dev.c;h=7dc44aa8885521c37dda49e95facc4eaac20d8d7;hb=9b0ebf78f7919a144673edadc4a95bad84fae2d3;hp=b6e88ce7c93221624878f0c7d2c058b14a68b36c;hpb=604c266a175b72500ef99793652b64ed4f842b2c;p=fs%2Flustre-release.git diff --git a/lustre/osp/osp_dev.c b/lustre/osp/osp_dev.c index b6e88ce..7dc44aa 100644 --- a/lustre/osp/osp_dev.c +++ b/lustre/osp/osp_dev.c @@ -730,7 +730,7 @@ const struct lu_device_operations osp_lu_ops = { * \retval negative negative errno if get statfs failed. */ static int osp_statfs(const struct lu_env *env, struct dt_device *dev, - struct obd_statfs *sfs) + struct obd_statfs *sfs, struct obd_statfs_info *info) { struct osp_device *d = dt2osp_dev(dev); struct obd_import *imp = d->opd_obd->u.cli.cl_import; @@ -745,33 +745,38 @@ static int osp_statfs(const struct lu_env *env, struct dt_device *dev, /* return recently updated data */ *sfs = d->opd_statfs; + if (info) { + info->os_reserved_mb_low = d->opd_reserved_mb_low; + info->os_reserved_mb_high = d->opd_reserved_mb_high; + } if (d->opd_pre == NULL) RETURN(0); + CDEBUG(D_OTHER, "%s: %llu blocks, %llu free, %llu avail, " + "%u reserved mb low, %u reserved mb high," + "%llu files, %llu free files\n", d->opd_obd->obd_name, + sfs->os_blocks, sfs->os_bfree, sfs->os_bavail, + d->opd_reserved_mb_low, d->opd_reserved_mb_high, + sfs->os_files, sfs->os_ffree); + + + if (info && !info->os_enable_pre) + RETURN(0); + /* - * layer above osp (usually lod) can use ffree to estimate - * how many objects are available for immediate creation + * The layer above osp (usually lod) can use f_precreated to + * estimate how many objects are available for immediate usage. */ spin_lock(&d->opd_pre_lock); - LASSERTF(fid_seq(&d->opd_pre_last_created_fid) == - fid_seq(&d->opd_pre_used_fid), - "last_created "DFID", next_fid "DFID"\n", - PFID(&d->opd_pre_last_created_fid), - PFID(&d->opd_pre_used_fid)); - sfs->os_fprecreated = fid_oid(&d->opd_pre_last_created_fid) - - fid_oid(&d->opd_pre_used_fid); + sfs->os_fprecreated = osp_fid_diff(&d->opd_pre_last_created_fid, + &d->opd_pre_used_fid); sfs->os_fprecreated -= d->opd_pre_reserved; LASSERTF(sfs->os_fprecreated <= OST_MAX_PRECREATE * 2, "last_created "DFID", next_fid "DFID", reserved %llu\n", PFID(&d->opd_pre_last_created_fid), PFID(&d->opd_pre_used_fid), d->opd_pre_reserved); spin_unlock(&d->opd_pre_lock); - - CDEBUG(D_OTHER, "%s: %llu blocks, %llu free, %llu avail, " - "%llu files, %llu free files\n", d->opd_obd->obd_name, - sfs->os_blocks, sfs->os_bfree, sfs->os_bavail, - sfs->os_files, sfs->os_ffree); RETURN(0); } @@ -828,8 +833,8 @@ static int osp_sync(const struct lu_env *env, struct dt_device *dev) if (rc != 0) GOTO(out, rc); - CDEBUG(D_CACHE, "%s: processed %lu\n", d->opd_obd->obd_name, - atomic64_read(&d->opd_sync_processed_recs)); + CDEBUG(D_CACHE, "%s: processed %llu\n", d->opd_obd->obd_name, + (unsigned long long)atomic64_read(&d->opd_sync_processed_recs)); while (atomic64_read(&d->opd_sync_processed_recs) < old + recs) { __u64 last = atomic64_read(&d->opd_sync_processed_recs); @@ -1334,7 +1339,6 @@ static struct lu_device *osp_device_fini(const struct lu_env *env, } LASSERT(osp->opd_obd); - osp_tunables_fini(osp); rc = client_obd_cleanup(osp->opd_obd); if (rc != 0) { @@ -1342,6 +1346,8 @@ static struct lu_device *osp_device_fini(const struct lu_env *env, RETURN(ERR_PTR(rc)); } + osp_tunables_fini(osp); + ptlrpcd_decref(); RETURN(NULL); @@ -1881,8 +1887,6 @@ static struct obd_ops osp_obd_device_ops = { .o_fid_alloc = osp_fid_alloc, }; -static struct obd_type sym; - /** * Initialize OSP module. * @@ -1897,17 +1901,14 @@ static struct obd_type sym; */ static int __init osp_init(void) { - struct dentry *symlink; - struct obd_type *type; - struct kobject *kobj; - struct qstr dname; + struct obd_type *sym; int rc; rc = lu_kmem_init(osp_caches); if (rc) return rc; - rc = class_register_type(&osp_obd_device_ops, NULL, true, NULL, + rc = class_register_type(&osp_obd_device_ops, NULL, false, NULL, LUSTRE_OSP_NAME, &osp_device_type); if (rc != 0) { lu_kmem_fini(osp_caches); @@ -1923,51 +1924,14 @@ static int __init osp_init(void) } /* create "osc" entry for compatibility purposes */ - dname.name = "osc"; - dname.len = strlen(dname.name); - dname.hash = ll_full_name_hash(debugfs_lustre_root, dname.name, - dname.len); - symlink = d_lookup(debugfs_lustre_root, &dname); - if (!symlink) { - symlink = debugfs_create_dir(dname.name, debugfs_lustre_root); - if (IS_ERR_OR_NULL(symlink)) { - rc = symlink ? PTR_ERR(symlink) : -ENOMEM; - GOTO(no_osc, rc); - } - sym.typ_debugfs_entry = symlink; - } else { - dput(symlink); - } - - kobj = kset_find_obj(lustre_kset, dname.name); - if (kobj) { - kobject_put(kobj); - goto try_proc; + sym = class_add_symlinks(LUSTRE_OSC_NAME, true); + if (IS_ERR(sym)) { + rc = PTR_ERR(sym); + /* does real "osc" already exist ? */ + if (rc == -EEXIST) + rc = 0; } - kobj = class_setup_tunables(dname.name); - if (IS_ERR(kobj)) { - rc = PTR_ERR(kobj); - if (sym.typ_debugfs_entry) - ldebugfs_remove(&sym.typ_debugfs_entry); - GOTO(no_osc, rc); - } - sym.typ_kobj = kobj; - -try_proc: - type = class_search_type(LUSTRE_OSC_NAME); - if (type != NULL && type->typ_procroot != NULL) - GOTO(no_osc, rc); - - type = class_search_type(LUSTRE_OSP_NAME); - type->typ_procsym = lprocfs_register("osc", proc_lustre_root, - NULL, NULL); - if (IS_ERR(type->typ_procsym)) { - CERROR("osp: can't create compat entry \"osc\": %d\n", - (int) PTR_ERR(type->typ_procsym)); - type->typ_procsym = NULL; - } -no_osc: return rc; } @@ -1979,8 +1943,19 @@ no_osc: */ static void __exit osp_exit(void) { - ldebugfs_remove(&sym.typ_debugfs_entry); - kobject_put(sym.typ_kobj); + struct obd_type *sym = class_search_type(LUSTRE_OSC_NAME); + + /* if this was never fully initialized by the osc layer + * then we are responsible for freeing this obd_type + */ + if (sym) { + /* final put if we manage this obd type */ + if (sym->typ_sym_filter) + kobject_put(&sym->typ_kobj); + /* put reference taken by class_search_type */ + kobject_put(&sym->typ_kobj); + } + class_unregister_type(LUSTRE_LWP_NAME); class_unregister_type(LUSTRE_OSP_NAME); lu_kmem_fini(osp_caches);