X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lustre%2Fobdecho%2Fecho_client.c;h=e435f5d60f28df33bb0315fbaf26cf1c7b6969ae;hp=ef5074556669cd0d5887d6fb1f9d5e5957388053;hb=9175d6f862039cfbf6b85333d72a9d91e64ea42a;hpb=d843591c30d63bf54024e21b48dec92eb0ec9f68 diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c index ef50745..e435f5d 100644 --- a/lustre/obdecho/echo_client.c +++ b/lustre/obdecho/echo_client.c @@ -27,7 +27,7 @@ * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2014, Intel Corporation. + * Copyright (c) 2011, 2015, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -67,7 +67,7 @@ struct echo_device { struct echo_client_obd *ed_ec; struct cl_site ed_site_myself; - struct cl_site *ed_site; + struct lu_site *ed_site; struct lu_device *ed_next; int ed_next_ismd; struct lu_client_seq *ed_cl_seq; @@ -230,7 +230,7 @@ struct echo_thread_info { struct md_attr eti_ma; struct lu_name eti_lname; /* per-thread values, can be re-used */ - void *eti_big_lmm; + void *eti_big_lmm; /* may be vmalloc'd */ int eti_big_lmmsize; char eti_name[20]; struct lu_buf eti_buf; @@ -584,9 +584,6 @@ static struct lu_device_operations echo_device_lu_ops = { /** @} echo_lu_dev_ops */ -static struct cl_device_operations echo_device_cl_ops = { -}; - /** \defgroup echo_init Setup and teardown * * Init and fini functions for echo client. @@ -598,28 +595,30 @@ static int echo_site_init(const struct lu_env *env, struct echo_device *ed) struct cl_site *site = &ed->ed_site_myself; int rc; - /* initialize site */ + /* initialize site */ rc = cl_site_init(site, &ed->ed_cl); if (rc) { - CERROR("Cannot initilize site for echo client(%d)\n", rc); + CERROR("Cannot initialize site for echo client(%d)\n", rc); return rc; } - rc = lu_site_init_finish(&site->cs_lu); - if (rc) - return rc; + rc = lu_site_init_finish(&site->cs_lu); + if (rc) { + cl_site_fini(site); + return rc; + } - ed->ed_site = site; - return 0; + ed->ed_site = &site->cs_lu; + return 0; } static void echo_site_fini(const struct lu_env *env, struct echo_device *ed) { - if (ed->ed_site) { - if (!ed->ed_next_ismd) - cl_site_fini(ed->ed_site); - ed->ed_site = NULL; - } + if (ed->ed_site) { + if (!ed->ed_next_ismd) + lu_site_fini(ed->ed_site); + ed->ed_site = NULL; + } } static void *echo_thread_key_init(const struct lu_context *ctx, @@ -841,7 +840,6 @@ static struct lu_device *echo_device_alloc(const struct lu_env *env, GOTO(out, rc); cd->cd_lu_dev.ld_ops = &echo_device_lu_ops; - cd->cd_ops = &echo_device_cl_ops; cleanup = 2; obd = class_name2obd(lustre_cfg_string(cfg, 0)); @@ -918,11 +916,10 @@ static struct lu_device *echo_device_alloc(const struct lu_env *env, GOTO(out, rc = -EINVAL); } - next = ld; - /* For MD echo client, it will use the site in MDS stack */ - ed->ed_site_myself.cs_lu = *ls; - ed->ed_site = &ed->ed_site_myself; - ed->ed_cl.cd_lu_dev.ld_site = &ed->ed_site_myself.cs_lu; + next = ld; + /* For MD echo client, it will use the site in MDS stack */ + ed->ed_site = ls; + ed->ed_cl.cd_lu_dev.ld_site = ls; rc = echo_fid_init(ed, obd->obd_name, lu_site2seq(ls)); if (rc) { CERROR("echo fid init error %d\n", rc); @@ -955,7 +952,7 @@ static struct lu_device *echo_device_alloc(const struct lu_env *env, if (next->ld_site != NULL) GOTO(out, rc = -EBUSY); - next->ld_site = &ed->ed_site->cs_lu; + next->ld_site = ed->ed_site; rc = next->ld_type->ldt_ops->ldto_device_init(env, next, next->ld_type->ldt_name, NULL); @@ -1028,7 +1025,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env, CDEBUG(D_INFO, "echo device:%p is going to be freed, next = %p\n", ed, next); - lu_site_purge(env, &ed->ed_site->cs_lu, -1); + lu_site_purge(env, ed->ed_site, -1); /* check if there are objects still alive. * It shouldn't have any object because lu_site_purge would cleanup @@ -1041,7 +1038,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env, spin_unlock(&ec->ec_lock); /* purge again */ - lu_site_purge(env, &ed->ed_site->cs_lu, -1); + lu_site_purge(env, ed->ed_site, -1); CDEBUG(D_INFO, "Waiting for the reference of echo object to be dropped\n"); @@ -1054,7 +1051,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env, "wait for 1 second\n"); set_current_state(TASK_UNINTERRUPTIBLE); schedule_timeout(cfs_time_seconds(1)); - lu_site_purge(env, &ed->ed_site->cs_lu, -1); + lu_site_purge(env, ed->ed_site, -1); spin_lock(&ec->ec_lock); } spin_unlock(&ec->ec_lock); @@ -1071,7 +1068,7 @@ static struct lu_device *echo_device_free(const struct lu_env *env, while (next && !ed->ed_next_ismd) next = next->ld_type->ldt_ops->ldto_device_free(env, next); - LASSERT(ed->ed_site == lu2cl_site(d->ld_site)); + LASSERT(ed->ed_site == d->ld_site); echo_site_fini(env, ed); cl_device_fini(&ed->ed_cl); OBD_FREE_PTR(ed); @@ -1118,7 +1115,7 @@ cl_echo_object_find(struct echo_device *d, const struct ost_id *oi) struct cl_object *obj; struct lov_oinfo *oinfo = NULL; struct lu_fid *fid; - int refcheck; + __u16 refcheck; int rc; ENTRY; @@ -1178,7 +1175,7 @@ static int cl_echo_object_put(struct echo_object *eco) { struct lu_env *env; struct cl_object *obj = echo_obj2cl(eco); - int refcheck; + __u16 refcheck; ENTRY; env = cl_env_get(&refcheck); @@ -1298,9 +1295,9 @@ static int cl_echo_object_brw(struct echo_object *eco, int rw, u64 offset, struct cl_page *clp; struct lustre_handle lh = { 0 }; int page_size = cl_page_size(obj); - int refcheck; int rc; int i; + __u16 refcheck; ENTRY; LASSERT((offset & ~PAGE_MASK) == 0); @@ -2063,7 +2060,7 @@ static int echo_md_handler(struct echo_device *ed, int command, struct echo_thread_info *info; struct lu_device *ld = ed->ed_next; struct lu_env *env; - int refcheck; + __u16 refcheck; struct lu_object *parent; char *name = NULL; int namelen = data->ioc_plen2; @@ -2358,27 +2355,27 @@ static int echo_client_kbrw(struct echo_device *ed, int rw, struct obdo *oa, RETURN(-ENOMEM); } - for (i = 0, pgp = pga, off = offset; - i < npages; + for (i = 0, pgp = pga, off = offset; + i < npages; i++, pgp++, off += PAGE_CACHE_SIZE) { - LASSERT (pgp->pg == NULL); /* for cleanup */ + LASSERT(pgp->pg == NULL); /* for cleanup */ - rc = -ENOMEM; - OBD_PAGE_ALLOC(pgp->pg, gfp_mask); - if (pgp->pg == NULL) - goto out; + rc = -ENOMEM; + pgp->pg = alloc_page(gfp_mask); + if (pgp->pg == NULL) + goto out; - pages[i] = pgp->pg; + pages[i] = pgp->pg; pgp->count = PAGE_CACHE_SIZE; - pgp->off = off; - pgp->flag = brw_flags; + pgp->off = off; + pgp->flag = brw_flags; if (verify) echo_client_page_debug_setup(pgp->pg, rw, ostid_id(&oa->o_oi), off, pgp->count); - } + } /* brw mode can only be used at client */ LASSERT(ed->ed_next != NULL); @@ -2400,7 +2397,7 @@ static int echo_client_kbrw(struct echo_device *ed, int rw, struct obdo *oa, if (vrc != 0 && rc == 0) rc = vrc; } - OBD_PAGE_FREE(pgp->pg); + __free_page(pgp->pg); } OBD_FREE(pga, npages * sizeof(*pga)); OBD_FREE(pages, npages * sizeof(*pages)); @@ -2415,7 +2412,7 @@ static int echo_client_prep_commit(const struct lu_env *env, { struct obd_ioobj ioo; struct niobuf_local *lnb; - struct niobuf_remote *rnb; + struct niobuf_remote rnb; u64 off; u64 npages, tot_pages; int i, ret = 0, brw_flags = 0; @@ -2428,40 +2425,35 @@ static int echo_client_prep_commit(const struct lu_env *env, npages = batch >> PAGE_CACHE_SHIFT; tot_pages = count >> PAGE_CACHE_SHIFT; - OBD_ALLOC(lnb, npages * sizeof(struct niobuf_local)); - OBD_ALLOC(rnb, npages * sizeof(struct niobuf_remote)); - - if (lnb == NULL || rnb == NULL) - GOTO(out, ret = -ENOMEM); + OBD_ALLOC(lnb, npages * sizeof(struct niobuf_local)); + if (lnb == NULL) + GOTO(out, ret = -ENOMEM); if (rw == OBD_BRW_WRITE && async) brw_flags |= OBD_BRW_ASYNC; - obdo_to_ioobj(oa, &ioo); + obdo_to_ioobj(oa, &ioo); - off = offset; + off = offset; - for(; tot_pages; tot_pages -= npages) { - int lpages; + for (; tot_pages > 0; tot_pages -= npages) { + int lpages; - if (tot_pages < npages) - npages = tot_pages; - - for (i = 0; i < npages; i++, off += PAGE_CACHE_SIZE) { - rnb[i].rnb_offset = off; - rnb[i].rnb_len = PAGE_CACHE_SIZE; - rnb[i].rnb_flags = brw_flags; - } + if (tot_pages < npages) + npages = tot_pages; - ioo.ioo_bufcnt = npages; + rnb.rnb_offset = off; + rnb.rnb_len = npages * PAGE_CACHE_SIZE; + rnb.rnb_flags = brw_flags; + ioo.ioo_bufcnt = 1; + off += npages * PAGE_CACHE_SIZE; lpages = npages; - ret = obd_preprw(env, rw, exp, oa, 1, &ioo, rnb, &lpages, lnb); + ret = obd_preprw(env, rw, exp, oa, 1, &ioo, &rnb, &lpages, lnb); if (ret != 0) GOTO(out, ret); - LASSERT(lpages == npages); - for (i = 0; i < lpages; i++) { + for (i = 0; i < lpages; i++) { struct page *page = lnb[i].lnb_page; /* read past eof? */ @@ -2478,17 +2470,17 @@ static int echo_client_prep_commit(const struct lu_env *env, if (rw == OBD_BRW_WRITE) echo_client_page_debug_setup(page, rw, - ostid_id(&oa->o_oi), - rnb[i].rnb_offset, - rnb[i].rnb_len); + ostid_id(&oa->o_oi), + lnb[i].lnb_file_offset, + lnb[i].lnb_len); else echo_client_page_debug_check(page, - ostid_id(&oa->o_oi), - rnb[i].rnb_offset, - rnb[i].rnb_len); + ostid_id(&oa->o_oi), + lnb[i].lnb_file_offset, + lnb[i].lnb_len); } - ret = obd_commitrw(env, rw, exp, oa, 1, &ioo, rnb, npages, lnb, + ret = obd_commitrw(env, rw, exp, oa, 1, &ioo, &rnb, npages, lnb, ret); if (ret != 0) GOTO(out, ret); @@ -2496,14 +2488,12 @@ static int echo_client_prep_commit(const struct lu_env *env, /* Reuse env context. */ lu_context_exit((struct lu_context *)&env->le_ctx); lu_context_enter((struct lu_context *)&env->le_ctx); - } + } out: - if (lnb) - OBD_FREE(lnb, npages * sizeof(struct niobuf_local)); - if (rnb) - OBD_FREE(rnb, npages * sizeof(struct niobuf_remote)); - RETURN(ret); + if (lnb) + OBD_FREE(lnb, npages * sizeof(struct niobuf_local)); + RETURN(ret); } static int echo_client_brw_ioctl(const struct lu_env *env, int rw, @@ -2565,7 +2555,7 @@ static int echo_client_brw_ioctl(const struct lu_env *env, int rw, static int echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int len, - void *karg, void *uarg) + void *karg, void __user *uarg) { #ifdef HAVE_SERVER_SUPPORT struct tgt_session_info *tsi; @@ -2654,7 +2644,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int len, } case OBD_IOC_ECHO_ALLOC_SEQ: { struct lu_env *cl_env; - int refcheck; + __u16 refcheck; __u64 seq; int max_count; @@ -2706,11 +2696,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int len, case OBD_IOC_GETATTR: rc = echo_get_object(&eco, ed, oa); if (rc == 0) { - struct obd_info oinfo = { - .oi_oa = oa, - }; - - rc = obd_getattr(env, ec->ec_exp, &oinfo); + rc = obd_getattr(env, ec->ec_exp, oa); echo_put_object(eco); } GOTO(out, rc); @@ -2721,11 +2707,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int len, rc = echo_get_object(&eco, ed, oa); if (rc == 0) { - struct obd_info oinfo = { - .oi_oa = oa, - }; - - rc = obd_setattr(env, ec->ec_exp, &oinfo); + rc = obd_setattr(env, ec->ec_exp, oa); echo_put_object(eco); } GOTO(out, rc); @@ -2906,27 +2888,6 @@ static struct obd_ops echo_client_obd_ops = { .o_disconnect = echo_client_disconnect }; -static int echo_client_init(void) -{ - int rc; - - rc = lu_kmem_init(echo_caches); - if (rc == 0) { - rc = class_register_type(&echo_client_obd_ops, NULL, true, NULL, - LUSTRE_ECHO_CLIENT_NAME, - &echo_device_type); - if (rc) - lu_kmem_fini(echo_caches); - } - return rc; -} - -static void echo_client_exit(void) -{ - class_unregister_type(LUSTRE_ECHO_CLIENT_NAME); - lu_kmem_fini(echo_caches); -} - static int __init obdecho_init(void) { int rc; @@ -2947,7 +2908,14 @@ static int __init obdecho_init(void) goto failed_1; # endif - rc = echo_client_init(); + rc = lu_kmem_init(echo_caches); + if (rc == 0) { + rc = class_register_type(&echo_client_obd_ops, NULL, true, NULL, + LUSTRE_ECHO_CLIENT_NAME, + &echo_device_type); + if (rc) + lu_kmem_fini(echo_caches); + } # ifdef HAVE_SERVER_SUPPORT if (rc == 0) @@ -2961,18 +2929,19 @@ failed_0: RETURN(rc); } -static void /*__exit*/ obdecho_exit(void) +static void __exit obdecho_exit(void) { - echo_client_exit(); + class_unregister_type(LUSTRE_ECHO_CLIENT_NAME); + lu_kmem_fini(echo_caches); -# ifdef HAVE_SERVER_SUPPORT - class_unregister_type(LUSTRE_ECHO_NAME); - echo_persistent_pages_fini(); -# endif +#ifdef HAVE_SERVER_SUPPORT + class_unregister_type(LUSTRE_ECHO_NAME); + echo_persistent_pages_fini(); +#endif } -MODULE_AUTHOR("Sun Microsystems, Inc. "); -MODULE_DESCRIPTION("Lustre Testing Echo OBD driver"); +MODULE_AUTHOR("OpenSFS, Inc. "); +MODULE_DESCRIPTION("Lustre Echo Client test driver"); MODULE_VERSION(LUSTRE_VERSION_STRING); MODULE_LICENSE("GPL");