X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fobdecho%2Fecho_client.c;h=b52d52b94cd367255c25edd2539fdf14129ab13b;hb=a74d5df65aa887939138ea07dc7a23d0d293f7e0;hp=5d174fef3c589aa23563ae07ad22a35f0b79f18c;hpb=eef0dc3356976bad84f7aefb6595f10443a5980d;p=fs%2Flustre-release.git diff --git a/lustre/obdecho/echo_client.c b/lustre/obdecho/echo_client.c index 5d174fe..b52d52b 100644 --- a/lustre/obdecho/echo_client.c +++ b/lustre/obdecho/echo_client.c @@ -29,6 +29,7 @@ #include #endif #include +#include #else #include #endif @@ -65,7 +66,7 @@ echo_printk_object (char *msg, struct ec_object *eco) static struct ec_object * echo_find_object_locked (struct obd_device *obd, obd_id id) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct ec_object *eco = NULL; struct list_head *el; @@ -97,7 +98,7 @@ static int echo_copyin_lsm (struct obd_device *obd, struct lov_stripe_md *lsm, void *ulsm, int ulsm_nob) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; int nob; if (ulsm_nob < sizeof (*lsm)) @@ -125,7 +126,7 @@ echo_copyin_lsm (struct obd_device *obd, struct lov_stripe_md *lsm, static struct ec_object * echo_allocate_object (struct obd_device *obd) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct ec_object *eco; int rc; @@ -152,7 +153,7 @@ static void echo_free_object (struct ec_object *eco) { struct obd_device *obd = eco->eco_device; - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; LASSERT (eco->eco_refcount == 0); obd_free_memmd(ec->ec_exp, &eco->eco_lsm); @@ -163,7 +164,7 @@ static int echo_create_object(struct obd_device *obd, int on_target, struct obdo *oa, void *ulsm, int ulsm_nob, struct obd_trans_info *oti) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct ec_object *eco2; struct ec_object *eco; struct lov_stripe_md *lsm; @@ -218,8 +219,7 @@ static int echo_create_object(struct obd_device *obd, int on_target, oa->o_id = ++last_object_id; if (on_target) { - /* XXX get some filter group constants */ - oa->o_gr = 2; + oa->o_gr = FILTER_GROUP_ECHO; oa->o_valid |= OBD_MD_FLGROUP; rc = obd_create(ec->ec_exp, oa, &lsm, oti); if (rc != 0) @@ -269,7 +269,7 @@ static int echo_get_object (struct ec_object **ecop, struct obd_device *obd, struct obdo *oa) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct ec_object *eco; struct ec_object *eco2; int rc; @@ -354,7 +354,7 @@ static void echo_put_object (struct ec_object *eco) { struct obd_device *obd = eco->eco_device; - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; /* Release caller's ref on the object. * delete => mark for deletion when last ref goes @@ -480,8 +480,10 @@ echo_client_page_debug_check(struct lov_stripe_md *lsm, rc2 = block_debug_check("test_brw", addr + delta, OBD_ECHO_BLOCK_SIZE, stripe_off, stripe_id); - if (rc2 != 0) + if (rc2 != 0) { + CERROR ("Error in echo object "LPX64"\n", id); rc = rc2; + } } kunmap(page); @@ -492,7 +494,7 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa, struct lov_stripe_md *lsm, obd_off offset, obd_size count, struct obd_trans_info *oti) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; obd_count npages; struct brw_page *pga; struct brw_page *pgp; @@ -502,10 +504,10 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa, int verify = 0; int gfp_mask; - /* oa_id == ECHO_PERSISTENT_OBJID => speed test (no verification). - * oa & 1 => use HIGHMEM */ + verify = ((oa->o_id) != ECHO_PERSISTENT_OBJID && + (oa->o_valid & OBD_MD_FLFLAGS) != 0 && + (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0); - verify = (oa->o_id) != ECHO_PERSISTENT_OBJID; gfp_mask = ((oa->o_id & 2) == 0) ? GFP_KERNEL : GFP_HIGHUSER; LASSERT(rw == OBD_BRW_WRITE || rw == OBD_BRW_READ); @@ -535,7 +537,7 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa, goto out; pgp->count = PAGE_SIZE; - pgp->off = off; + pgp->disk_offset = pgp->page_offset = off; pgp->flag = 0; if (verify) @@ -556,7 +558,8 @@ static int echo_client_kbrw(struct obd_device *obd, int rw, struct obdo *oa, if (verify) { int vrc; vrc = echo_client_page_debug_check(lsm, pgp->pg, oa->o_id, - pgp->off, pgp->count); + pgp->page_offset, + pgp->count); if (vrc != 0 && rc == 0) rc = vrc; } @@ -573,7 +576,7 @@ static int echo_client_ubrw(struct obd_device *obd, int rw, obd_off offset, obd_size count, char *buffer, struct obd_trans_info *oti) { - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; obd_count npages; struct brw_page *pga; struct brw_page *pgp; @@ -615,7 +618,7 @@ static int echo_client_ubrw(struct obd_device *obd, int rw, for (i = 0, off = offset, pgp = pga; i < npages; i++, off += PAGE_SIZE, pgp++) { - pgp->off = off; + pgp->disk_offset = pgp->page_offset = off; pgp->pg = kiobuf->maplist[i]; pgp->count = PAGE_SIZE; pgp->flag = 0; @@ -658,6 +661,10 @@ struct echo_async_page { struct list_head eap_item; }; +#define EAP_FROM_COOKIE(c) \ + (LASSERT(((struct echo_async_page *)(c))->eap_magic == EAP_MAGIC), \ + (struct echo_async_page *)(c)) + struct echo_async_state { spinlock_t eas_lock; obd_off eas_next_offset; @@ -681,14 +688,6 @@ static int eas_should_wake(struct echo_async_state *eas) return rc; }; -struct echo_async_page *eap_from_cookie(void *cookie) -{ - struct echo_async_page *eap = cookie; - if (eap->eap_magic != EAP_MAGIC) - return ERR_PTR(-EINVAL); - return eap; -}; - static int ec_ap_make_ready(void *data, int cmd) { /* our pages are issued ready */ @@ -703,26 +702,23 @@ static int ec_ap_refresh_count(void *data, int cmd) } static void ec_ap_fill_obdo(void *data, int cmd, struct obdo *oa) { - struct echo_async_page *eap; - eap = eap_from_cookie(data); - if (IS_ERR(eap)) - return; + struct echo_async_page *eap = EAP_FROM_COOKIE(data); memcpy(oa, &eap->eap_eas->eas_oa, sizeof(*oa)); } static void ec_ap_completion(void *data, int cmd, struct obdo *oa, int rc) { - struct echo_async_page *eap = eap_from_cookie(data); + struct echo_async_page *eap = EAP_FROM_COOKIE(data); struct echo_async_state *eas; unsigned long flags; - if (IS_ERR(eap)) - return; eas = eap->eap_eas; if (cmd == OBD_BRW_READ && - eas->eas_oa.o_id != ECHO_PERSISTENT_OBJID) + eas->eas_oa.o_id != ECHO_PERSISTENT_OBJID && + (eas->eas_oa.o_valid & OBD_MD_FLFLAGS) != 0 && + (eas->eas_oa.o_flags & OBD_FL_DEBUG_CHECK) != 0) echo_client_page_debug_check(eas->eas_lsm, eap->eap_page, eas->eas_oa.o_id, eap->eap_off, PAGE_SIZE); @@ -794,7 +790,7 @@ static int echo_client_async_page(struct obd_export *exp, int rw, GOTO(out, rc = -ENOMEM); page->private = 0; - list_add_tail(&page->list, &pages); + list_add_tail(&PAGE_LIST(page), &pages); OBD_ALLOC(eap, sizeof(*eap)); if (eap == NULL) @@ -847,7 +843,9 @@ static int echo_client_async_page(struct obd_export *exp, int rw, break; } - if (oa->o_id != ECHO_PERSISTENT_OBJID) + if (oa->o_id != ECHO_PERSISTENT_OBJID && + (oa->o_valid & OBD_MD_FLFLAGS) != 0 && + (oa->o_flags & OBD_FL_DEBUG_CHECK) != 0) echo_client_page_debug_setup(lsm, eap->eap_page, rw, oa->o_id, eap->eap_off, PAGE_SIZE); @@ -880,9 +878,10 @@ static int echo_client_async_page(struct obd_export *exp, int rw, out: list_for_each_safe(pos, n, &pages) { - struct page *page = list_entry(pos, struct page, list); + struct page *page = list_entry(pos, struct page, + PAGE_LIST_ENTRY); - list_del(&page->list); + list_del(&PAGE_LIST(page)); if (page->private != 0) { eap = (struct echo_async_page *)page->private; if (eap->eap_cookie != NULL) @@ -950,9 +949,12 @@ static int echo_client_prep_commit(struct obd_export *exp, int rw, if (page == NULL && lnb[i].rc == 0) continue; - if (oa->o_id == ECHO_PERSISTENT_OBJID) + if (oa->o_id == ECHO_PERSISTENT_OBJID || + (oa->o_valid & OBD_MD_FLFLAGS) == 0 || + (oa->o_flags & OBD_FL_DEBUG_CHECK) == 0) continue; + if (rw == OBD_BRW_WRITE) echo_client_page_debug_setup(lsm, page, rw, oa->o_id, @@ -982,7 +984,7 @@ int echo_client_brw_ioctl(int rw, struct obd_export *exp, struct obd_ioctl_data *data) { struct obd_device *obd = class_exp2obd(exp); - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct obd_trans_info dummy_oti; struct ec_object *eco; int rc; @@ -996,7 +998,7 @@ int echo_client_brw_ioctl(int rw, struct obd_export *exp, data->ioc_obdo1.o_valid &= ~OBD_MD_FLHANDLE; data->ioc_obdo1.o_valid |= OBD_MD_FLGROUP; - data->ioc_obdo1.o_gr = 2; + data->ioc_obdo1.o_gr = FILTER_GROUP_ECHO; switch((long)data->ioc_pbuf1) { case 1: @@ -1036,7 +1038,7 @@ echo_ldlm_callback (struct ldlm_lock *lock, struct ldlm_lock_desc *new, void *data, int flag) { struct ec_object *eco = (struct ec_object *)data; - struct echo_client_obd *ec = &(eco->eco_device->u.echo_client); + struct echo_client_obd *ec = &(eco->eco_device->u.echocli); struct lustre_handle lockh; struct list_head *el; int found = 0; @@ -1081,7 +1083,7 @@ echo_client_enqueue(struct obd_export *exp, struct obdo *oa, int mode, obd_off offset, obd_size nob) { struct obd_device *obd = exp->exp_obd; - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct lustre_handle *ulh = obdo_handle (oa); struct ec_object *eco; struct ec_lock *ecl; @@ -1142,7 +1144,7 @@ static int echo_client_cancel(struct obd_export *exp, struct obdo *oa) { struct obd_device *obd = exp->exp_obd; - struct echo_client_obd *ec = &obd->u.echo_client; + struct echo_client_obd *ec = &obd->u.echocli; struct lustre_handle *ulh = obdo_handle (oa); struct ec_lock *ecl = NULL; int found = 0; @@ -1193,10 +1195,12 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, int i; ENTRY; + unlock_kernel(); + memset(&dummy_oti, 0, sizeof(dummy_oti)); obd = exp->exp_obd; - ec = &obd->u.echo_client; + ec = &obd->u.echocli; switch (cmd) { case OBD_IOC_CREATE: /* may create echo object */ @@ -1215,7 +1219,7 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, rc = echo_get_object (&eco, obd, &data->ioc_obdo1); if (rc == 0) { oa = &data->ioc_obdo1; - oa->o_gr = 2; + oa->o_gr = FILTER_GROUP_ECHO; oa->o_valid |= OBD_MD_FLGROUP; rc = obd_destroy(ec->ec_exp, oa, eco->eco_lsm, &dummy_oti); @@ -1311,6 +1315,8 @@ echo_client_iocontrol(unsigned int cmd, struct obd_export *exp, ldlm_lock_decref(&ack_lock->lock, ack_lock->mode); } + lock_kernel(); + return rc; } @@ -1318,7 +1324,7 @@ static int echo_client_setup(struct obd_device *obddev, obd_count len, void *buf) { struct lustre_cfg* lcfg = buf; - struct echo_client_obd *ec = &obddev->u.echo_client; + struct echo_client_obd *ec = &obddev->u.echocli; struct obd_device *tgt; struct lustre_handle conn = {0, }; struct obd_uuid echo_uuid = { "ECHO_UUID" }; @@ -1341,7 +1347,7 @@ echo_client_setup(struct obd_device *obddev, obd_count len, void *buf) INIT_LIST_HEAD (&ec->ec_objects); ec->ec_unique = 0; - rc = obd_connect(&conn, tgt, &echo_uuid); + rc = obd_connect(&conn, tgt, &echo_uuid, NULL, FILTER_GROUP_ECHO); if (rc) { CERROR("fail to connect to device %s\n", lcfg->lcfg_inlbuf1); return (rc); @@ -1355,7 +1361,7 @@ static int echo_client_cleanup(struct obd_device *obddev, int flags) { struct list_head *el; struct ec_object *eco; - struct echo_client_obd *ec = &obddev->u.echo_client; + struct echo_client_obd *ec = &obddev->u.echocli; int rc; ENTRY; @@ -1383,7 +1389,10 @@ static int echo_client_cleanup(struct obd_device *obddev, int flags) } static int echo_client_connect(struct lustre_handle *conn, - struct obd_device *src, struct obd_uuid *cluuid) + struct obd_device *src, + struct obd_uuid *cluuid, + struct obd_connect_data *data, + unsigned long flags) { struct obd_export *exp; int rc; @@ -1398,7 +1407,8 @@ static int echo_client_connect(struct lustre_handle *conn, RETURN (rc); } -static int echo_client_disconnect(struct obd_export *exp, int flags) +static int echo_client_disconnect(struct obd_export *exp, + unsigned long flags) { struct obd_device *obd; struct echo_client_obd *ec; @@ -1410,7 +1420,7 @@ static int echo_client_disconnect(struct obd_export *exp, int flags) GOTO(out, rc = -EINVAL); obd = exp->exp_obd; - ec = &obd->u.echo_client; + ec = &obd->u.echocli; /* no more contention on export's lock list */ while (!list_empty (&exp->exp_ec_data.eced_locks)) { @@ -1435,12 +1445,12 @@ static int echo_client_disconnect(struct obd_export *exp, int flags) } static struct obd_ops echo_obd_ops = { - o_owner: THIS_MODULE, - o_setup: echo_client_setup, - o_cleanup: echo_client_cleanup, - o_iocontrol: echo_client_iocontrol, - o_connect: echo_client_connect, - o_disconnect: echo_client_disconnect + .o_owner = THIS_MODULE, + .o_setup = echo_client_setup, + .o_cleanup = echo_client_cleanup, + .o_iocontrol = echo_client_iocontrol, + .o_connect = echo_client_connect, + .o_disconnect = echo_client_disconnect }; int echo_client_init(void) @@ -1448,7 +1458,7 @@ int echo_client_init(void) struct lprocfs_static_vars lvars; lprocfs_init_vars(echo, &lvars); - return class_register_type(&echo_obd_ops, lvars.module_vars, + return class_register_type(&echo_obd_ops, NULL, lvars.module_vars, OBD_ECHO_CLIENT_DEVICENAME); }