boolean_t rel_gtmsource_srv_latch(sm_global_latch_ptr_t latch) { sgmnt_addrs *repl_csa; repl_csa = &FILE_INFO(jnlpool.jnlpool_dummy_reg)->s_addrs; DEBUG_ONLY(locknl = repl_csa->nl); LOCK_HIST("RLSE", latch, process_id, 0); DEBUG_ONLY(locknl = NULL); assert(process_id == latch->u.parts.latch_pid); RELEASE_SWAPLOCK(latch); return TRUE; }
void jnl_fsync(gd_region *reg, uint4 fsync_addr) { jnl_private_control *jpc; jnl_buffer_ptr_t jb; uint4 lcnt, saved_dsk_addr, saved_status; sgmnt_addrs *csa; sgmnt_data_ptr_t csd; int4 lck_state; int fsync_ret, save_errno; error_def(ERR_JNLFSYNCERR); error_def(ERR_FSYNCTIMOUT); error_def(ERR_TEXT); error_def(ERR_JNLFRCDTERM); error_def(ERR_JNLFSYNCLSTCK); csa = &FILE_INFO(reg)->s_addrs; jpc = csa->jnl; jb = jpc->jnl_buff; if ((NOJNL != jpc->channel) && !JNL_FILE_SWITCHED(jpc)) { csd = csa->hdr; for (lcnt = 1; fsync_addr > jb->fsync_dskaddr && !JNL_FILE_SWITCHED(jpc); lcnt++) { if (MAX_FSYNC_WAIT_CNT / 2 == lcnt) /* half way into max.patience*/ { saved_status = jpc->status; jpc->status = SS_NORMAL; jnl_send_oper(jpc, ERR_JNLFSYNCLSTCK); jpc->status = saved_status ; } if (MAX_FSYNC_WAIT_CNT == lcnt) /* tried a long */ { saved_status = jpc->status; jpc->status = SS_NORMAL; jnl_send_oper(jpc, ERR_JNLFSYNCLSTCK); jpc->status = saved_status ; send_msg(VARLSTCNT(4) ERR_FSYNCTIMOUT, 2, JNL_LEN_STR(csd)); GTMASSERT; } BG_TRACE_PRO_ANY(csa, n_jnl_fsync_tries); if (GET_SWAPLOCK(&jb->fsync_in_prog_latch)) break; wcs_sleep(lcnt); performCASLatchCheck(&jb->fsync_in_prog_latch, lcnt); } if (fsync_addr > jb->fsync_dskaddr && !JNL_FILE_SWITCHED(jpc)) { assert(process_id == jb->fsync_in_prog_latch.u.parts.latch_pid); /* assert we have the lock */ saved_dsk_addr = jb->dskaddr; if (jpc->sync_io) { /* We need to maintain the fsync control fields irrespective of the type of IO, because we might * switch between these at any time. */ jb->fsync_dskaddr = saved_dsk_addr; } else { GTM_FSYNC(jpc->channel, fsync_ret); if (-1 == fsync_ret) { save_errno = errno; assert(FALSE); send_msg(VARLSTCNT(9) ERR_JNLFSYNCERR, 2, JNL_LEN_STR(csd), ERR_TEXT, 2, RTS_ERROR_TEXT("Error with fsync"), save_errno); rts_error(VARLSTCNT(9) ERR_JNLFSYNCERR, 2, JNL_LEN_STR(csd), ERR_TEXT, 2, RTS_ERROR_TEXT("Error with fsync"), save_errno); } else { jb->fsync_dskaddr = saved_dsk_addr; BG_TRACE_PRO_ANY(csa, n_jnl_fsyncs); } } } if (process_id == jb->fsync_in_prog_latch.u.parts.latch_pid) RELEASE_SWAPLOCK(&jb->fsync_in_prog_latch); } return; }