static int llog_read_header(const struct lu_env *env, struct llog_handle *handle, struct obd_uuid *uuid) { struct llog_operations *lop; int rc; rc = llog_handle2ops(handle, &lop); if (rc) return rc; if (lop->lop_read_header == NULL) return -EOPNOTSUPP; rc = lop->lop_read_header(env, handle); if (rc == LLOG_EEMPTY) { struct llog_log_hdr *llh = handle->lgh_hdr; handle->lgh_last_idx = 0; /* header is record with index 0 */ llh->llh_count = 1; /* for the header record */ llh->llh_hdr.lrh_type = LLOG_HDR_MAGIC; llh->llh_hdr.lrh_len = llh->llh_tail.lrt_len = LLOG_CHUNK_SIZE; llh->llh_hdr.lrh_index = llh->llh_tail.lrt_index = 0; llh->llh_timestamp = cfs_time_current_sec(); if (uuid) memcpy(&llh->llh_tgtuuid, uuid, sizeof(llh->llh_tgtuuid)); llh->llh_bitmap_offset = offsetof(typeof(*llh), llh_bitmap); ext2_set_bit(0, llh->llh_bitmap); rc = 0; } return rc; }
int llog_write_rec(const struct lu_env *env, struct llog_handle *handle, struct llog_rec_hdr *rec, struct llog_cookie *logcookies, int numcookies, void *buf, int idx, struct thandle *th) { struct llog_operations *lop; int raised, rc, buflen; rc = llog_handle2ops(handle, &lop); if (rc) return rc; LASSERT(lop); if (lop->lop_write_rec == NULL) return -EOPNOTSUPP; if (buf) buflen = rec->lrh_len + sizeof(struct llog_rec_hdr) + sizeof(struct llog_rec_tail); else buflen = rec->lrh_len; LASSERT(cfs_size_round(buflen) == buflen); raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); if (!raised) cfs_cap_raise(CFS_CAP_SYS_RESOURCE); rc = lop->lop_write_rec(env, handle, rec, logcookies, numcookies, buf, idx, th); if (!raised) cfs_cap_lower(CFS_CAP_SYS_RESOURCE); return rc; }
int llog_declare_write_rec(const struct lu_env *env, struct llog_handle *handle, struct llog_rec_hdr *rec, int idx, struct thandle *th) { struct llog_operations *lop; int raised, rc; ENTRY; rc = llog_handle2ops(handle, &lop); if (rc) RETURN(rc); LASSERT(lop); if (lop->lop_declare_write_rec == NULL) RETURN(-EOPNOTSUPP); raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); if (!raised) cfs_cap_raise(CFS_CAP_SYS_RESOURCE); rc = lop->lop_declare_write_rec(env, handle, rec, idx, th); if (!raised) cfs_cap_lower(CFS_CAP_SYS_RESOURCE); RETURN(rc); }
int llog_write_rec(const struct lu_env *env, struct llog_handle *handle, struct llog_rec_hdr *rec, struct llog_cookie *logcookies, int idx, struct thandle *th) { struct llog_operations *lop; int raised, rc, buflen; ENTRY; rc = llog_handle2ops(handle, &lop); if (rc) RETURN(rc); LASSERT(lop); if (lop->lop_write_rec == NULL) RETURN(-EOPNOTSUPP); buflen = rec->lrh_len; LASSERT(cfs_size_round(buflen) == buflen); raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); if (!raised) cfs_cap_raise(CFS_CAP_SYS_RESOURCE); rc = lop->lop_write_rec(env, handle, rec, logcookies, idx, th); if (!raised) cfs_cap_lower(CFS_CAP_SYS_RESOURCE); RETURN(rc); }
/** * new llog API * * API functions: * llog_open - open llog, may not exist * llog_exist - check if llog exists * llog_close - close opened llog, pair for open, frees llog_handle * llog_declare_create - declare llog creation * llog_create - create new llog on disk, need transaction handle * llog_declare_write_rec - declaration of llog write * llog_write_rec - write llog record on disk, need transaction handle * llog_declare_add - declare llog catalog record addition * llog_add - add llog record in catalog, need transaction handle */ int llog_exist(struct llog_handle *loghandle) { struct llog_operations *lop; int rc; rc = llog_handle2ops(loghandle, &lop); if (rc) return rc; if (lop->lop_exist == NULL) return -EOPNOTSUPP; rc = lop->lop_exist(loghandle); return rc; }
int llog_close(const struct lu_env *env, struct llog_handle *loghandle) { struct llog_operations *lop; int rc; rc = llog_handle2ops(loghandle, &lop); if (rc) GOTO(out, rc); if (lop->lop_close == NULL) GOTO(out, rc = -EOPNOTSUPP); rc = lop->lop_close(env, loghandle); out: llog_handle_put(loghandle); return rc; }
/** * new llog API * * API functions: * llog_open - open llog, may not exist * llog_exist - check if llog exists * llog_close - close opened llog, pair for open, frees llog_handle * llog_declare_create - declare llog creation * llog_create - create new llog on disk, need transaction handle * llog_declare_write_rec - declaration of llog write * llog_write_rec - write llog record on disk, need transaction handle * llog_declare_add - declare llog catalog record addition * llog_add - add llog record in catalog, need transaction handle */ int llog_exist(struct llog_handle *loghandle) { struct llog_operations *lop; int rc; ENTRY; rc = llog_handle2ops(loghandle, &lop); if (rc) RETURN(rc); if (lop->lop_exist == NULL) RETURN(-EOPNOTSUPP); rc = lop->lop_exist(loghandle); RETURN(rc); }
int llog_close(const struct lu_env *env, struct llog_handle *loghandle) { struct llog_operations *lop; int rc; rc = llog_handle2ops(loghandle, &lop); if (rc) goto out; if (!lop->lop_close) { rc = -EOPNOTSUPP; goto out; } rc = lop->lop_close(env, loghandle); out: llog_handle_put(loghandle); return rc; }
int llog_destroy(const struct lu_env *env, struct llog_handle *handle) { struct llog_operations *lop; struct dt_device *dt; struct thandle *th; int rc; ENTRY; rc = llog_handle2ops(handle, &lop); if (rc < 0) RETURN(rc); if (lop->lop_destroy == NULL) RETURN(-EOPNOTSUPP); if (handle->lgh_obj == NULL) { /* if lgh_obj == NULL, then it is from client side destroy */ rc = lop->lop_destroy(env, handle, NULL); RETURN(rc); } if (!dt_object_exists(handle->lgh_obj)) RETURN(0); dt = lu2dt_dev(handle->lgh_obj->do_lu.lo_dev); th = dt_trans_create(env, dt); if (IS_ERR(th)) RETURN(PTR_ERR(th)); rc = llog_declare_destroy(env, handle, th); if (rc != 0) GOTO(out_trans, rc); rc = dt_trans_start_local(env, dt, th); if (rc < 0) GOTO(out_trans, rc); rc = lop->lop_destroy(env, handle, th); out_trans: dt_trans_stop(env, dt, th); RETURN(rc); }
int llog_read_header(const struct lu_env *env, struct llog_handle *handle, const struct obd_uuid *uuid) { struct llog_operations *lop; int rc; ENTRY; rc = llog_handle2ops(handle, &lop); if (rc) RETURN(rc); if (lop->lop_read_header == NULL) RETURN(-EOPNOTSUPP); rc = lop->lop_read_header(env, handle); if (rc == LLOG_EEMPTY) { struct llog_log_hdr *llh = handle->lgh_hdr; /* lrh_len should be initialized in llog_init_handle */ handle->lgh_last_idx = 0; /* header is record with index 0 */ handle->lgh_write_offset = 0; llh->llh_count = 1; /* for the header record */ llh->llh_hdr.lrh_type = LLOG_HDR_MAGIC; LASSERT(handle->lgh_ctxt->loc_chunk_size >= LLOG_MIN_CHUNK_SIZE); llh->llh_hdr.lrh_len = handle->lgh_ctxt->loc_chunk_size; llh->llh_hdr.lrh_index = 0; llh->llh_timestamp = cfs_time_current_sec(); if (uuid) memcpy(&llh->llh_tgtuuid, uuid, sizeof(llh->llh_tgtuuid)); llh->llh_bitmap_offset = offsetof(typeof(*llh), llh_bitmap); /* Since update llog header might also call this function, * let's reset the bitmap to 0 here */ memset(LLOG_HDR_BITMAP(llh), 0, llh->llh_hdr.lrh_len - llh->llh_bitmap_offset - sizeof(llh->llh_tail)); ext2_set_bit(0, LLOG_HDR_BITMAP(llh)); LLOG_HDR_TAIL(llh)->lrt_len = llh->llh_hdr.lrh_len; LLOG_HDR_TAIL(llh)->lrt_index = llh->llh_hdr.lrh_index; rc = 0; } RETURN(rc); }
static int llog_declare_destroy(const struct lu_env *env, struct llog_handle *handle, struct thandle *th) { struct llog_operations *lop; int rc; ENTRY; rc = llog_handle2ops(handle, &lop); if (rc) RETURN(rc); if (lop->lop_declare_destroy == NULL) RETURN(-EOPNOTSUPP); rc = lop->lop_declare_destroy(env, handle, th); RETURN(rc); }
int llog_create(const struct lu_env *env, struct llog_handle *handle, struct thandle *th) { struct llog_operations *lop; int raised, rc; rc = llog_handle2ops(handle, &lop); if (rc) return rc; if (lop->lop_create == NULL) return -EOPNOTSUPP; raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); if (!raised) cfs_cap_raise(CFS_CAP_SYS_RESOURCE); rc = lop->lop_create(env, handle, th); if (!raised) cfs_cap_lower(CFS_CAP_SYS_RESOURCE); return rc; }
int llog_trans_destroy(const struct lu_env *env, struct llog_handle *handle, struct thandle *th) { struct llog_operations *lop; int rc; ENTRY; rc = llog_handle2ops(handle, &lop); if (rc < 0) RETURN(rc); if (lop->lop_destroy == NULL) RETURN(-EOPNOTSUPP); LASSERT(handle->lgh_obj != NULL); if (!dt_object_exists(handle->lgh_obj)) RETURN(0); rc = lop->lop_destroy(env, handle, th); RETURN(rc); }
int llog_declare_create(const struct lu_env *env, struct llog_handle *loghandle, struct thandle *th) { struct llog_operations *lop; int raised, rc; ENTRY; rc = llog_handle2ops(loghandle, &lop); if (rc) RETURN(rc); if (lop->lop_declare_create == NULL) RETURN(-EOPNOTSUPP); raised = cfs_cap_raised(CFS_CAP_SYS_RESOURCE); if (!raised) cfs_cap_raise(CFS_CAP_SYS_RESOURCE); rc = lop->lop_declare_create(env, loghandle, th); if (!raised) cfs_cap_lower(CFS_CAP_SYS_RESOURCE); RETURN(rc); }