int lwt_init () { int i; int j; for (i = 0; i < cfs_num_online_cpus(); i++) if (lwt_cpus[i].lwtc_current_page != NULL) return (-EALREADY); LASSERT (!lwt_enabled); /* NULL pointers, zero scalars */ memset (lwt_cpus, 0, sizeof (lwt_cpus)); lwt_pages_per_cpu = LWT_MEMORY / (cfs_num_online_cpus() * PAGE_CACHE_SIZE); for (i = 0; i < cfs_num_online_cpus(); i++) for (j = 0; j < lwt_pages_per_cpu; j++) { struct page *page = alloc_page(GFP_KERNEL); lwt_page_t *lwtp; if (page == NULL) { CERROR ("Can't allocate page\n"); lwt_fini (); return (-ENOMEM); } LIBCFS_ALLOC(lwtp, sizeof (*lwtp)); if (lwtp == NULL) { CERROR ("Can't allocate lwtp\n"); __free_page(page); lwt_fini (); return (-ENOMEM); } lwtp->lwtp_page = page; lwtp->lwtp_events = page_address(page); memset(lwtp->lwtp_events, 0, PAGE_CACHE_SIZE); if (j == 0) { CFS_INIT_LIST_HEAD (&lwtp->lwtp_list); lwt_cpus[i].lwtc_current_page = lwtp; } else { cfs_list_add (&lwtp->lwtp_list, &lwt_cpus[i].lwtc_current_page->lwtp_list); } } lwt_enabled = 1; cfs_mb(); LWT_EVENT(0,0,0,0); return (0); }
int lwt_control (int enable, int clear) { lwt_page_t *p; int i; int j; if (!cfs_capable(CFS_CAP_SYS_ADMIN)) return (-EPERM); if (!enable) { LWT_EVENT(0,0,0,0); lwt_enabled = 0; cfs_mb(); /* give people some time to stop adding traces */ cfs_schedule_timeout(10); } for (i = 0; i < cfs_num_online_cpus(); i++) { p = lwt_cpus[i].lwtc_current_page; if (p == NULL) return (-ENODATA); if (!clear) continue; for (j = 0; j < lwt_pages_per_cpu; j++) { memset(p->lwtp_events, 0, PAGE_CACHE_SIZE); p = cfs_list_entry (p->lwtp_list.next, lwt_page_t, lwtp_list); } } if (enable) { lwt_enabled = 1; cfs_mb(); LWT_EVENT(0,0,0,0); } return (0); }
void cfs_trace_assertion_failed(const char *str, const char *fn, const char *file, int line) { struct ptldebug_header hdr; libcfs_panic_in_progress = 1; libcfs_catastrophe = 1; cfs_mb(); cfs_set_ptldebug_header(&hdr, DEBUG_SUBSYSTEM, D_EMERG, line, CDEBUG_STACK()); cfs_print_to_console(&hdr, D_EMERG, str, strlen(str), file, fn); LIBCFS_PANIC("Lustre debug assertion failure\n"); /* not reached */ }
/* * Concurrency: shouldn't matter. */ int osd_object_init0(const struct lu_env *env, struct osd_object *obj) { struct osd_device *osd = osd_obj2dev(obj); udmu_objset_t *uos = &osd->od_objset; const struct lu_fid *fid = lu_object_fid(&obj->oo_dt.do_lu); int rc = 0; ENTRY; if (obj->oo_db == NULL) RETURN(0); /* object exist */ rc = osd_object_sa_init(obj, uos); if (rc) RETURN(rc); /* cache attrs in object */ rc = __osd_object_attr_get(env, &osd->od_objset, obj, &obj->oo_attr); if (rc) RETURN(rc); if (likely(!fid_is_acct(fid))) /* no body operations for accounting objects */ obj->oo_dt.do_body_ops = &osd_body_ops; /* * initialize object before marking it existing */ obj->oo_dt.do_lu.lo_header->loh_attr |= obj->oo_attr.la_mode & S_IFMT; cfs_mb(); obj->oo_dt.do_lu.lo_header->loh_attr |= LOHA_EXISTS; RETURN(0); }