Tree @HEAD (Download .tar.gz)
- ..
- add_inter.c
- aio_shim.c
- anticipatory_freeze.c
- arlinkdbg.h
- ast.h
- auto_zlink.c
- auto_zlink.h
- backup_buffer_flush.c
- bin_load.c
- bit_op.h
- buildaux.csh
- buildaux_dse.csh
- buildaux_gde.csh
- buildaux_gtcm_gnp_server.csh
- buildaux_gtcm_pkdisp.csh
- buildaux_gtcm_play.csh
- buildaux_gtcm_server.csh
- buildaux_gtcm_shmclean.csh
- buildaux_gtmcrypt.csh
- buildaux_gtmsecshr.csh
- buildaux_lke.csh
- buildaux_mupip.csh
- buildbdp.csh
- buildbta.csh
- builddbg.csh
- buildpro.csh
- buildshr.csh
- buildwarn.awk
- buildwarn.csh
- callg.c
- callintogtmxfer.c
- callintogtmxfer.h
- ccp_cluster_lock_wake.c
- ccp_fid_msg.c
- ccp_sendmsg.c
- ccp_userwait.c
- ce_init.c
- ce_substitute.c
- cenable.c
- cenable.h
- ch_cond_core.c
- ch_overrun.c
- change_fhead_timer.c
- check_encrypt_support.sh
- check_utf8_support.csh
- ci_ret_code.c
- clear_cache_array.c
- clear_cache_array.h
- cli.c
- cli.h
- cli_disallow.c
- cli_disallow.h
- cli_lex.c
- cli_parse.c
- cli_parse.h
- cmidefsp.h
- cmistub.c
- cms_load.csh
- cms_load_pre_v42.csh
- comimage.csh
- comlist.csh
- comp_lits.c
- comque.csh
- condstk_expand.c
- configure.gtc
- continue_handler.c
- continue_handler.h
- continue_proc.c
- coverage_cc.sh
- crit_wake.c
- ctrap_set.c
- ctrlc_handler.c
- ctrlc_handler.h
- ctrlc_set.c
- custom_errors_sample.txt
- cvtprot.c
- cvttime.c
- daemon_crit.c
- db_ipcs_reset.c
- db_ipcs_reset.h
- db_read.h
- db_snapshot.h
- db_write.h
- db_write_eof_block.c
- db_write_eof_block.h
- dbfilop.c
- dbinit_ch.c
- dec_err.c
- decomment.m
- deferred_signal_handler.c
- deferred_signal_handler.h
- dircompare.m.txt
- disk_block_available.c
- disk_block_available.h
- dm_audit_log.c
- dm_audit_log.h
- dm_read.c
- do_semop.c
- do_semop.h
- do_shmat.c
- do_shmat.h
- do_verify.c
- do_xform.c
- dollarh.c
- dollarh.h
- dpgbldir_sysops.c
- dpgbldir_sysops.h
- dse.c
- dse_cmd.c
- dse_cmd_disallow.c
- dse_cmd_disallow.h
- dse_ctrlc_handler.c
- dse_help.c
- dse_open.c
- dse_puttime.c
- dse_remove.c
- dsk_read.c
- dsk_write_nocache.c
- eintr_wrapper_semop.h
- encrypt_sign_db_key.sh
- err_init.c
- error_return.c
- errorsp.h
- exi_ch.c
- extract_signal_info.c
- exttab_parse.c
- exttime.c
- f_char.c
- f_piece.c
- fake_enospc.c
- fake_enospc.h
- fgn_getinfo.c
- fgncalsp.h
- file_head_read.c
- file_head_write.c
- file_input.c
- file_input.h
- filestruct.h
- fix_pages.c
- forced_exit_err_display.c
- forced_exit_err_display.h
- fork_init.h
- ftok_sem_get_common.c
- ftok_sem_incrcnt.c
- ftok_sem_incrcnt.h
- ftok_sems.c
- ftok_sems.h
- gbldirnam.h
- gcall.h
- gdedefaults.gtc
- gdeget.m
- gdeput.m
- gdeverif.m
- gds_file_size.c
- gds_rundown.c
- gds_rundown_ch.c
- gds_rundown_err_cleanup.c
- gds_rundown_err_cleanup.h
- gdsfheadsp.h
- gdsfilext.c
- gdsfilext_nojnl.c
- gdsfilext_nojnl.h
- gen_gtm_threadgbl_deftypes.csh
- gen_keypair.sh
- gen_sym_hash.sh
- gen_sym_key.sh
- gen_ttt.csh
- gen_vms_ttt.csh
- gen_xfer_desc.cmake
- gen_xfer_desc.csh
- generate_help.csh
- generic_signal_handler.c
- generic_signal_handler.h
- gengtmdeftypes.csh
- genpat.c
- get_command_line.c
- get_full_path.c
- get_page_size.c
- get_src_line.c
- get_ztimeout.c
- getcaps.c
- getcaps.h
- geteditor.c
- geteditor.h
- getjobnum.c
- getmaxfds.c
- getmaxfds.h
- getstorage.c
- getzmode.c
- getzprocess.c
- go_load.c
- golevel.c
- goq_load.c
- gpgagent.tab.in
- grab_crit.c
- grab_crit_encr_cycle_sync.c
- grab_crit_immediate.c
- grab_latch.c
- grab_lock.c
- gse.mpt
- gt_ar.csh
- gt_as.csh
- gt_cc.csh
- gt_timer.h
- gt_timers.c
- gt_timers_add_safe_hndlrs.c
- gt_timers_add_safe_hndlrs.h
- gtcmstub.c
- gtcmtrstub.c
- gtm.c
- gtm.gtc
- gtm_aio.h
- gtm_asm_establish.c
- gtm_bintim.c
- gtm_c_stack_trace.c
- gtm_c_stack_trace_semop.c
- gtm_c_stack_trace_semop.h
- gtm_compare_dir.csh
- gtm_compile.c
- gtm_compile.h
- gtm_confstr.c
- gtm_conv.c
- gtm_conv.h
- gtm_conv_init.c
- gtm_cshrc.csh
- gtm_dbjnl_dupfd_check.c
- gtm_dbjnl_dupfd_check.h
- gtm_descript.h
- gtm_dump.c
- gtm_dump_core.c
- gtm_env.csh
- gtm_env_init_sp.c
- gtm_env_translate.c
- gtm_exit_handler.c
- gtm_exit_handler.h
- gtm_fd_trace.c
- gtm_file_remove.c
- gtm_file_stat.c
- gtm_filter_command.c
- gtm_filter_command.h
- gtm_fork_n_core.c
- gtm_ftok.c
- gtm_getmsg.c
- gtm_getpwuid.c
- gtm_icu.c
- gtm_icu.h
- gtm_icu_api.h
- gtm_image_exit.c
- gtm_init_env.c
- gtm_ipc.h
- gtm_is_main_thread.c
- gtm_isanlp.c
- gtm_isanlp.h
- gtm_logicals.h
- gtm_main.c
- gtm_main.h
- gtm_multi_proc.c
- gtm_multi_proc.h
- gtm_multi_thread.c
- gtm_multi_thread.h
- gtm_permissions.c
- gtm_permissions.h
- gtm_pipe.c
- gtm_pipe.h
- gtm_poll.h
- gtm_post_startup_check_init.c
- gtm_post_startup_check_init.h
- gtm_pthread.h
- gtm_pthread_init_key.c
- gtm_pthread_init_key.h
- gtm_putmsg.c
- gtm_putmsg_list.c
- gtm_rel_quant.h
- gtm_rename.c
- gtm_repl_multi_inst.h
- gtm_sem.h
- gtm_semaphore.h
- gtm_semutils.c
- gtm_semutils.h
- gtm_signal.h
- gtm_startup.c
- gtm_startup.h
- gtm_startup_chk.c
- gtm_startup_chk.h
- gtm_statvfs.h
- gtm_stdio.c
- gtm_stdio.h
- gtm_syslog.h
- gtm_system.c
- gtm_term.h
- gtm_termios.h
- gtm_test_install.csh
- gtm_test_install.txt
- gtm_text_alloc.c
- gtm_threadgbl_asm_access.txt
- gtm_threadgbl_deftypes_asm.si
- gtm_times.h
- gtm_tls.c
- gtm_tls.h
- gtm_tls_funclist.h
- gtm_tls_impl.c
- gtm_tls_impl.h
- gtm_tls_interface.h
- gtm_tls_loadlibrary.c
- gtm_tparm.c
- gtm_tparm.h
- gtm_tputs.c
- gtm_tputs.h
- gtm_trigger.c
- gtm_trigger.h
- gtm_trigger_trc.h
- gtm_ulimit.h
- gtm_unique_file_util.c
- gtm_unlink_all.c
- gtm_unlink_all.h
- gtm_utf8.c
- gtm_utf8.h
- gtm_version_dirname.csh
- gtm_version_dirname.sed
- gtm_wake.c
- gtm_zlib.c
- gtm_zlib.h
- gtmbase.gtc
- gtmci.c
- gtmci.h
- gtmci_ch.c
- gtmci_isv.c
- gtmci_signals.c
- gtmci_signals.h
- gtmcrypt.h
- gtmcrypt_dbk_ref.c
- gtmcrypt_dbk_ref.h
- gtmcrypt_entry.c
- gtmcrypt_funclist.h
- gtmcrypt_interface.h
- gtmcrypt_pk_ref.c
- gtmcrypt_pk_ref.h
- gtmcrypt_ref.c
- gtmcrypt_ref.h
- gtmcrypt_sym_ref.c
- gtmcrypt_sym_ref.h
- gtmcrypt_util.c
- gtmcrypt_util.h
- gtmcshrc.gtc
- gtmdbgflags.h
- gtmdef.csh
- gtmdefinedtypestodb.m
- gtmexcludetypelist.txt
- gtmexe_symbols.exp
- gtmgblstat.c
- gtmgblstat.h
- gtmgblstat.xc
- gtmhelp.m
- gtmhlpld.m
- gtminstall.sh
- gtmio.h
- gtmio_ch.c
- gtmlink.c
- gtmlink.h
- gtmpcat_sh.txt
- gtmprofile.gtc
- gtmprofile_preV54000.gtc
- gtmrecv.c
- gtmrecv.h
- gtmrecv_end.c
- gtmrecv_fetchresync.c
- gtmrecv_poll_actions.c
- gtmrecv_process.c
- gtmrecv_shutdown.c
- gtmrecv_stopfilter.c
- gtmsecshr.c
- gtmsecshr.h
- gtmsecshr_sock_cleanup.c
- gtmsecshr_sock_init.c
- gtmsecshr_wrapper.c
- gtmshr_symbols.exp
- gtmsiginfo.h
- gtmsource.c
- gtmsource.h
- gtmsource_changelog.c
- gtmsource_checkforbacklog.c
- gtmsource_checkhealth.c
- gtmsource_end.c
- gtmsource_flush_fh.c
- gtmsource_freeze.c
- gtmsource_get_opt.c
- gtmsource_heartbeat.c
- gtmsource_inline.h
- gtmsource_jnl_release_timer.c
- gtmsource_jnlpool.c
- gtmsource_losttncomplete.c
- gtmsource_mode_change.c
- gtmsource_needrestart.c
- gtmsource_onln_rlbk_clnup.c
- gtmsource_process.c
- gtmsource_process_ops.c
- gtmsource_readfiles.c
- gtmsource_readpool.c
- gtmsource_rootprimary_init.c
- gtmsource_seqno_init.c
- gtmsource_showbacklog.c
- gtmsource_shutdown.c
- gtmsource_srv_latch.c
- gtmsource_srv_latch.h
- gtmsource_statslog.c
- gtmsource_stopfilter.c
- gtmsrc.csh
- gtmstart.gtc
- gtmstop.gtc
- gtmthreadgblasm.m
- gtmxc_types.h
- gv_trig_cmd_table.h
- gv_trigger.c
- gv_trigger.h
- gv_trigger_protos.h
- gvcmx_canremlk_stub.c
- gvcmx_reqremlk_stub.c
- gvcmx_resremlk_stub.c
- gvcmx_susremlk_stub.c
- gvcmy_open.h
- gvcmz_bunch_stub.c
- gvcmz_error_stub.c
- gvcmz_neterr_stub.c
- gvcmz_zflush_stub.c
- gvcst_init_sysops.c
- gvcst_spr_data.c
- gvcst_spr_kill.c
- gvcst_spr_order.c
- gvcst_spr_query.c
- gvcst_spr_queryget.c
- gvcst_spr_zprevious.c
- gvusr.c
- hex2utf.mpt
- hugetlbfs_overrides.c
- hugetlbfs_overrides.h
- import_and_sign_key.sh
- incr_link.c
- incr_link.h
- init_gtm.c
- install_debug_symbols_sh.txt
- install_gtmpcat_sh.txt
- interlock.h
- invocation_mode.h
- io_get_fgn_driver.c
- io_init_name.c
- io_is_rm.c
- io_is_sn.c
- io_open_try.c
- io_type.c
- iob.h
- iob_close.c
- iob_flush.c
- iob_open_rd.c
- iob_open_wt.c
- iob_read.c
- iob_write.c
- ioff_open.c
- iopi_iocontrol.c
- iopi_open.c
- iorm_close.c
- iorm_flush.c
- iorm_get.c
- iorm_open.c
- iorm_rdone.c
- iorm_read.c
- iorm_readfl.c
- iorm_use.c
- iorm_write.c
- iorm_wteol.c
- iormdef.h
- iosize.h
- iosocket_pass_local.c
- iosocket_tls.c
- iosp.h
- iott_close.c
- iott_edit.c
- iott_edit.h
- iott_flush.c
- iott_flush_time.h
- iott_iocontrol.c
- iott_open.c
- iott_rdone.c
- iott_read.c
- iott_readfl.c
- iott_use.c
- iott_write.c
- iottdef.h
- iottdefsp.h
- ious_iocontrol.c
- ious_open.c
- ious_rdone.c
- ious_read.c
- ious_readfl.c
- ious_write.c
- ious_wtone.c
- ipcrmid.c
- ipcrmid.h
- is_file_identical.c
- is_fstype_nfs.c
- is_fstype_nfs.h
- is_icu_symbol_rename.csh
- is_proc_alive.c
- is_raw_dev.c
- is_raw_dev.h
- jnl_file_close_timer.c
- jnl_file_close_timer.h
- jnl_file_extend.c
- jnl_file_open.c
- jnl_fsync.c
- jnl_output_sp.c
- jnl_prc_vector.c
- jnlext_merge_sort_prepare.c
- jnlext_write.c
- jnlpool_init.c
- jnlsp.h
- jobchild_init.c
- jobchild_init.h
- joberr.h
- jobexam_signal_handler.c
- jobexam_signal_handler.h
- jobsp.h
- kitstart.csh
- laberror.c
- lib_list_ar.sed
- lib_list_lint.sed
- libdse.list
- liblke.list
- libmupip.list
- libstub.list
- lintgtm.csh
- lintimage.csh
- linuxi686_badd.txt
- list_file.c
- lke.c
- lke_cmd.c
- lke_cmd_disallow.c
- lke_cmd_disallow.h
- lke_ctrlc_handler.c
- lke_fileio.c
- lke_fileio.h
- lke_getansw.c
- lke_help.c
- load.h
- lockdefs.h
- lowerc_cp.sh
- lref_parse.c
- m_zrupdate.c
- m_ztrigger.c
- make_cimode.c
- make_dmode.c
- make_mode.c
- make_mode.h
- Makefile.mk
- map_sym.c
- maskpass.c
- mdefsa.h
- mdefsp.h
- mem_access.c
- memprot.c
- memprot.h
- mkutf8dir.csh
- mmrhash.c
- mmrhash.h
- msg.h
- mu_all_version_standalone.c
- mu_all_version_standalone.h
- mu_cre_file.c
- mu_cre_structs.c
- mu_cre_structs.h
- mu_decrypt.c
- mu_decrypt.h
- mu_extract.c
- mu_getkey.c
- mu_getkey.h
- mu_getlst.c
- mu_gvis.c
- mu_int_ch.c
- mu_op_open.c
- mu_op_open.h
- mu_outofband_setup.c
- mu_replpool_grab_sem.c
- mu_replpool_release_sem.c
- mu_rndwn_all.c
- mu_rndwn_all.h
- mu_rndwn_file.c
- mu_rndwn_file.h
- mu_rndwn_repl_instance.c
- mu_rndwn_repl_instance.h
- mu_rndwn_replpool.c
- mu_rndwn_replpool.h
- mu_rndwn_rlnkctl.c
- mu_rndwn_rlnkctl.h
- mu_signal_process.c
- mu_size_arsample.c
- mu_size_impsample.c
- mu_size_scan.c
- mu_swap_root.c
- mu_term_setup.c
- mu_term_setup.h
- mu_trig_trgfile.c
- mu_trig_trgfile.h
- mu_truncate.c
- mu_truncate.h
- mu_upgrd_sig_init.h
- mubexpfilnam.c
- mubfilcpy.c
- mubgetfil.c
- mubinccpy.c
- mucblkini.c
- mumps.cmake
- mumps_clitab.c
- mup_bak_sys.c
- mupip.c
- mupip_cmd.c
- mupip_cmd_disallow.c
- mupip_cmd_disallow.h
- mupip_crypt.c
- mupip_crypt.h
- mupip_ctrl.c
- mupip_ctrl.h
- mupip_cvtgbl.c
- mupip_cvtpgm.c
- mupip_dump_fhead.c
- mupip_dump_fhead.h
- mupip_endiancvt.c
- mupip_endiancvt.h
- mupip_exit.c
- mupip_exit_handler.c
- mupip_ftok.c
- mupip_ftok.h
- mupip_hash.c
- mupip_hash.h
- mupip_help.c
- mupip_load_reg_list.c
- mupip_load_reg_list.h
- mupip_load_triggerfile.h
- mupip_quit.c
- mupip_rctldump.c
- mupip_rctldump.h
- mupip_reorg_encrypt.c
- mupip_reorg_encrypt.h
- mupip_restore.c
- mupip_rundown.c
- mupip_sems.c
- mupip_sems.h
- mupip_set_file.c
- mupip_set_jnlfile.c
- mupip_size.c
- mupip_size.h
- mupip_trigger.c
- mupip_trigger.h
- mupip_upgrade_standalone.c
- mupip_upgrade_standalone.h
- muprecsp.h
- mur_cre_file_extfmt.c
- mur_read_file_sp.c
- murgetlst.c
- mutex.c
- mutex_sock_cleanup.c
- mutex_sock_init.c
- mutex_wake_proc.c
- mutexsp.h
- obj_code.c
- obj_file.c
- obj_filesp.h
- obj_fileu.c
- offset.awk
- offset.csh
- ojchildioclean.c
- ojchildioset.c
- ojchildparms.c
- ojchkfs.c
- ojparams.c
- ojstartchild.c
- op_currhd.c
- op_fgnlookup.c
- op_fnextract.c
- op_fnextract.h
- op_fnfgncal.c
- op_fngetdvi.c
- op_fngetjpi.c
- op_fngetlki.c
- op_fngetsyi.c
- op_fnp1.c
- op_fnpiece.c
- op_fnpopulation.c
- op_fnrandom.c
- op_fnzcall.c
- op_fnzconvert.c
- op_fnzfile.c
- op_fnzlkid.c
- op_fnzparse.c
- op_fnzpeek.c
- op_fnzpid.c
- op_fnzpriv.c
- op_fnzsearch.c
- op_fnzsetprv.c
- op_fnzsyslog.c
- op_fnztrnlnm.c
- op_job.c
- op_setextract.c
- op_setp1.c
- op_setpiece.c
- op_zattach.c
- op_zedit.c
- op_zhelp_xfr.c
- op_zhorolog.c
- op_zlink.c
- op_zmess.c
- op_zrupdate.c
- op_ztrigger.c
- op_zut.c
- outc.c
- parse_file.c
- parse_file.h
- peekbyname.mpt
- pinentry-gtm.sh
- pinentry.m
- pipeint_stats.c
- pipeint_stats.h
- probecrit_rec.h
- proc_wait_stat.c
- proc_wait_stat.h
- process_reorg_encrypt_restart.c
- process_reorg_encrypt_restart.h
- put_cdidx.c
- random.c
- random.h
- rc.h
- rc_cpt.h
- rc_cpt_ops.c
- recover_truncate.c
- recover_truncate.h
- recvpool_init.c
- reg_cmcheck.c
- rel_crit.c
- rel_latch.c
- rel_lock.c
- rel_quant.c
- relinkctl.c
- relinkctl.h
- remove_rms.c
- repl_inst_create.c
- repl_inst_dump.c
- repl_inst_dump.h
- repl_inst_edit.c
- repl_inst_ftok_counter_halted.c
- repl_inst_ftok_counter_halted.h
- repl_instance.c
- repl_instance.h
- repl_ipc_cleanup.c
- repl_log.c
- repl_log_init.c
- repl_logfileinfo_get.c
- repl_msg.h
- repl_sem.c
- repl_sem.h
- repl_sem_sp.h
- repl_sp.h
- resetterm.c
- rmv_mul_slsh.c
- rmv_mul_slsh.h
- rtnhdr.h
- rtnobj.c
- rtnobj.h
- rts_error.c
- runall.csh
- runall_cc_many.csh
- runall_cc_one.csh
- same_device_check.c
- scantypedefs.m
- secshr_client.c
- secshr_client.h
- send_msg.c
- set_jnl_file_close.c
- set_library_path.csh
- set_num_additional_processors.c
- set_zstatus.c
- setactive.csh
- setterm.c
- sgtm_putmsg.c
- show_install_config.sh
- sig_init.c
- sig_init.h
- simple_timeout_timer.c
- sleep.c
- sleep.h
- source_file.c
- ss_anal_shdw_file.c
- ss_context_mgr.c
- ss_get_block.c
- ss_initiate.c
- ss_lock_facility.c
- ss_lock_facility.h
- ss_read_block.c
- ss_release.c
- ss_shdw_mgr.c
- ss_write_block.c
- std_dev_outbndset.c
- stop_image.c
- stop_image_ch.c
- str_match.c
- str_match.h
- stripmine.awk
- suspend.c
- suspsigs_handler.c
- suspsigs_handler.h
- t_recycled2free.c
- t_recycled2free.h
- tab_probecrit_rec.h
- term_setup.c
- timersp.h
- trans_log_name.c
- trigger.h
- trigger_cmd.c
- trigger_compare.c
- trigger_compare_protos.h
- trigger_delete.c
- trigger_delete_protos.h
- trigger_fill_xecute_buffer.c
- trigger_fill_xecute_buffer.h
- trigger_gbl_fill_xecute_buffer.c
- trigger_gbl_fill_xecute_buffer.h
- trigger_incr_cycle.c
- trigger_incr_cycle.h
- trigger_locate_andor_load.c
- trigger_parse.c
- trigger_parse_protos.h
- trigger_read_andor_locate.h
- trigger_scan_string.c
- trigger_scan_string.h
- trigger_select.c
- trigger_select_protos.h
- trigger_source_read_andor_verify.c
- trigger_subs_def.h
- trigger_tpwrap_ch.c
- trigger_trgfile.c
- trigger_trgfile_protos.h
- trigger_update.c
- trigger_update_protos.h
- trigger_upgrade.c
- trigger_upgrade_protos.h
- trigger_user_name.c
- trigger_user_name.h
- trmdef.h
- ttt.txt
- upd_log_init.c
- urx_remove.c
- utf2hex.mpt
- utfcgr.c
- utfcgr.h
- utfcgr_trc.h
- util_exit_handler.c
- util_help.c
- util_help.h
- util_in_open.c
- util_input.c
- util_out_print_gtmio.c
- util_out_print_vaparm.h
- util_output.c
- util_output_cm.c
- util_spawn.c
- v15_filestruct.h
- versions.csh
- wait_for_disk_space.c
- wait_for_disk_space.h
- warn_db_sz.c
- warn_db_sz.h
- wcs_clean_dbsync.c
- wcs_clean_dbsync.h
- wcs_clean_dbsync_timer.c
- wcs_flu.c
- wcs_get_space.c
- wcs_write_in_progress_wait.c
- wcs_write_in_progress_wait.h
- wcs_wt.h
- wcs_wt_restart.c
- wcs_wterror.c
- wcs_wtfini.c
- wcs_wtfini_nocrit.c
- wcs_wtstart.c
- wcs_wtstart_fini.c
- xtrgtmtypes.awk
- ygblstat.mpt
- zbreaksp.h
- zcall_package.c
- zcall_package.h
- zhist.c
- zl_cmd_qlf.c
- zlmov_lnames.c
- zro_gettok.c
- zro_load.c
- zro_search.c
- zro_shlibs.c
- zro_shlibs.h
- zroutinessp.h
- zshow_devices.c
- zshow_rctldump.c
- zshow_zcalls.c
- ztimeout_routines.c
- ztimeout_routines.h
dsk_read.c @HEAD — raw · history · blame
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 | /**************************************************************** * * * Copyright (c) 2001-2021 Fidelity National Information * * Services, Inc. and/or its subsidiaries. All rights reserved. * * * * This source code contains the intellectual property * * of its copyright holder(s), and is made available * * under a license. If you do not know the terms of * * the license, please stop and do not read further. * * * ****************************************************************/ #include "mdef.h" #include <sys/types.h> #include "gtm_unistd.h" #include "gtm_string.h" #include "gtm_signal.h" #include <errno.h> #ifdef DEBUG #include "gtm_stdio.h" #endif #include "gdsroot.h" #include "gdsblk.h" #include "gtm_facility.h" #include "fileinfo.h" #include "gdsbt.h" #include "gdsfhead.h" #include "filestruct.h" #include "iosp.h" #include "error.h" #include "gtmio.h" #include "gds_blk_upgrade.h" #include "gdsbml.h" #include "gtmcrypt.h" #include "t_retry.h" #include "gdsdbver.h" #include "min_max.h" #include "gtmimagename.h" #include "memcoherency.h" #include "gdskill.h" #include "gdscc.h" #include "jnl.h" #include "buddy_list.h" /* needed for tp.h */ #include "have_crit.h" #include "tp.h" #include "cdb_sc.h" #include "mupip_reorg_encrypt.h" #include "mu_reorg.h" GBLREF gd_region *gv_cur_region; GBLREF sgmnt_addrs *cs_addrs; GBLREF sgmnt_data_ptr_t cs_data; GBLREF volatile int4 fast_lock_count; GBLREF boolean_t dse_running, is_updhelper; GBLREF boolean_t mu_reorg_upgrd_dwngrd_in_prog; GBLREF unsigned int t_tries; GBLREF uint4 dollar_tlevel; GBLREF sgm_info *sgm_info_ptr; GBLREF sgmnt_addrs *kip_csa; GBLREF jnl_gbls_t jgbl; GBLREF uint4 process_id; GBLREF uint4 mu_reorg_encrypt_in_prog; error_def(ERR_DSEBLKRDFAIL); /* TODO: use more helpful error */ int4 dsk_read (block_id blk, sm_uc_ptr_t buff, enum db_ver *ondsk_blkver, boolean_t blk_free) { boolean_t buff_is_modified_after_lseekread = FALSE, db_is_encrypted, fully_upgraded, use_new_key; block_id blk_num, *blk_ptr, offset; char *in, *out; enum db_ver tmp_ondskblkver; int bsiz, in_len, level, gtmcrypt_errno; int4 save_errno, size; intrpt_state_t prev_intrpt_state; node_local_ptr_t cnl; sm_uc_ptr_t enc_save_buff, recBase; sgmnt_addrs *csa; sgmnt_data_ptr_t csd; /* It is possible that an index block we read in from disk has a block_id that needs adjustment subsequent to enlargement * of the master bit map. The database block scanning routines (gvcst_*search*.c) can deal with V6 or V7 index blocks, * but only dsk_read does the offset adjustment Therefore we do not want to risk reading a potential pre-move index block * directly into the cache and then adjusting it. Instead, we read it into a private buffer, upgrade it there and then * copy it over to the cache. This uses the static variable read_reformat_buffer. We could have as well used the global * variable "reformat_buffer" for this purpose. But that would then prevent dsk_reads and concurrent dsk_writes from * proceeding. We don't want that loss of asynchronocity, hence we keep them separate. Note that while a lot of routines * use "reformat_buffer" only this routine uses "read_reformat_buffer" which is a static rather than a GBLDEF. */ static sm_uc_ptr_t read_reformat_buffer; unix_db_info *udi; unsigned short temp_ushort; # ifdef DEBUG unsigned int effective_t_tries; boolean_t killinprog; static int in_dsk_read; # endif DCL_THREADGBL_ACCESS; SETUP_THREADGBL_ACCESS; save_errno = 0; csa = cs_addrs; csd = csa->hdr; cnl = csa->nl; assert(csd == cs_data); assert(NULL != cnl); assert(0 == in_dsk_read); /* dsk_read should never be nested. the read_reformat_buffer logic below relies on this */ DEBUG_ONLY(in_dsk_read++;) assert(GDSVCURR == GDSV7); /* assert should fail if GDSVCURR changes */ /* Note: Even in snapshots, only INTEG requires dsk_read to read FREE blocks. The assert below should be modified * if we later introduce a scheme where we can figure out as to who started the snapshots and assert accordingly */ assert(!blk_free || SNAPSHOTS_IN_PROG(csa)); /* Only SNAPSHOTS require dsk_read to read a FREE block from the disk */ udi = FILE_INFO(gv_cur_region); assert(csd == cs_data); size = csd->blk_size; tmp_ondskblkver = (enum db_ver)csd->desired_db_format; /* Cache csd->fully_upgraded once so that all uses work the same way. Repeatedly referencing csd->fully_upgraded could * result in different values seen through-out the function resulting in incorrect operation. For example, the code does * not allocate scratch space for the temporary pre-V7 formatted block which is needed later in the function. It is ok if * the value of csd->fully_upgraded changes after we took a copy of it since we have a buffer locked for this particular * block (in BG) so no concurrent process could be changing the format of this block. For MM, there is no such protection. * We have 2 possibilities: * - fully_upgraded is cached as FALSE but becomes TRUE before reading the block from disk. This only results in a little * extra work since the block on disk will already have been upgraded * - fully_upgraded is cached as TRUE but becomes FALSE before reading the block from disk/mmap. There is no problem since * the process performs NO upgrade. Some later process will take the responsiblity for such an upgrade */ fully_upgraded = csd->fully_upgraded; assert(0 == (long)buff % SIZEOF(block_id)); assert(NULL != cnl); INCR_GVSTATS_COUNTER(csa, cnl, n_dsk_read, 1); enc_save_buff = buff; /* The value of MUPIP_REORG_IN_PROG_LOCAL_DSK_READ indicates that this is a direct call from mupip_reorg_encrypt, operating * on a local buffer. */ if (USES_ENCRYPTION(csd->is_encrypted) && (MUPIP_REORG_IN_PROG_LOCAL_DSK_READ != mu_reorg_encrypt_in_prog)) { DBG_ENSURE_PTR_IS_VALID_GLOBUFF(csa, csd, buff); enc_save_buff = GDS_ANY_ENCRYPTGLOBUF(buff, csa); DBG_ENSURE_PTR_IS_VALID_ENCTWINGLOBUFF(csa, csd, enc_save_buff); } DB_LSEEKREAD(udi, udi->fd, (BLK_ZERO_OFF(csd->start_vbn) + ((off_t)blk * size)), enc_save_buff, size, save_errno); assert((0 == save_errno) || (-1 == save_errno)); WBTEST_ASSIGN_ONLY(WBTEST_PREAD_SYSCALL_FAIL, save_errno, EIO); if ((enc_save_buff != buff) && (0 == save_errno)) { assert(USES_ENCRYPTION(csd->is_encrypted) && (MUPIP_REORG_IN_PROG_LOCAL_DSK_READ != mu_reorg_encrypt_in_prog)); DEFER_INTERRUPTS(INTRPT_IN_CRYPT_RECONFIG, prev_intrpt_state); db_is_encrypted = IS_ENCRYPTED(csd->is_encrypted); assert(NULL != csa->encr_ptr); assert(csa->encr_ptr->reorg_encrypt_cycle == cnl->reorg_encrypt_cycle); /* caller should have ensured this */ use_new_key = NEEDS_NEW_KEY(csd, ((blk_hdr_ptr_t)enc_save_buff)->tn); if (use_new_key || db_is_encrypted) { bsiz = (int)((blk_hdr_ptr_t)enc_save_buff)->bsiz; in_len = MIN(csd->blk_size, bsiz) - SIZEOF(blk_hdr); buff_is_modified_after_lseekread = TRUE; if (IS_BLK_ENCRYPTED(((blk_hdr_ptr_t)enc_save_buff)->levl, in_len)) { /* Due to concurrency conflicts, we are potentially reading a free block even though * blk_free is FALSE. Go ahead and safely "decrypt" such a block, even though it contains no * valid contents. We expect GTMCRYPT_DECRYPT to return success even if it is presented with * garbage data. */ ASSERT_ENCRYPTION_INITIALIZED; memcpy(buff, enc_save_buff, SIZEOF(blk_hdr)); in = (char *)(enc_save_buff + SIZEOF(blk_hdr)); out = (char *)(buff + SIZEOF(blk_hdr)); if (use_new_key) { GTMCRYPT_DECRYPT(csa, TRUE, csa->encr_key_handle2, in, in_len, out, enc_save_buff, SIZEOF(blk_hdr), gtmcrypt_errno); assert(0 == gtmcrypt_errno); } else { GTMCRYPT_DECRYPT(csa, csd->non_null_iv, csa->encr_key_handle, in, in_len, out, enc_save_buff, SIZEOF(blk_hdr), gtmcrypt_errno); assert(0 == gtmcrypt_errno); } save_errno = gtmcrypt_errno; DBG_RECORD_BLOCK_READ(csd, csa, cnl, process_id, blk, ((blk_hdr_ptr_t)enc_save_buff)->tn, 1, use_new_key, enc_save_buff, buff, size, in_len); } else { memcpy(buff, enc_save_buff, size); DBG_RECORD_BLOCK_READ(csd, csa, cnl, process_id, blk, ((blk_hdr_ptr_t)enc_save_buff)->tn, 2, use_new_key, enc_save_buff, buff, size, in_len); } } else { memcpy(buff, enc_save_buff, size); DBG_RECORD_BLOCK_READ(csd, csa, cnl, process_id, blk, ((blk_hdr_ptr_t)enc_save_buff)->tn, 3, use_new_key, enc_save_buff, buff, size, 0); } ENABLE_INTERRUPTS(INTRPT_IN_CRYPT_RECONFIG, prev_intrpt_state); } if (0 == save_errno) /* this bloc is a kissing cousin to code in mm_read and the 2should be maintained in parallel */ { /* see if block needs to be converted to current version */ if ((GDSV6p == (tmp_ondskblkver = ((blk_hdr_ptr_t)buff)->bver)) && (GDSMV70000 == csd->creation_mdb_ver)) { /* adjust for shift of GDSV7 id from 2 to 4 */ buff_is_modified_after_lseekread = TRUE; tmp_ondskblkver = ((blk_hdr_ptr_t)buff)->bver = GDSV7; } if (blk_free || (GDSV4 == tmp_ondskblkver)) { /* but might be uninitialed */ buff_is_modified_after_lseekread = TRUE; # ifdef DEBUG if (!blk_free && !is_updhelper && !dse_running && !mu_reorg_encrypt_in_prog && !mu_reorg_upgrd_dwngrd_in_prog) TREF(donot_commit) = DONOTCOMMIT_DSK_READ_EMPTY_BUT_NOT_FREE; /* expected data, but got empty */ # endif /* might not be correct, but any writer would correct it before it goes to a DB file */ tmp_ondskblkver = ((blk_hdr_ptr_t)buff)->bver = csd->desired_db_format; } else assert((GDSV7 == tmp_ondskblkver) || (GDSV6 == tmp_ondskblkver) /* vanilla cases */ || ((GDSV7m == tmp_ondskblkver) && IS_64_BLK_ID(buff)) /* block upgrade complete from V6 */ || (!fully_upgraded && (GDSV6p == tmp_ondskblkver))); /* shuffled & adjusted but still 4 byte ID */ if (!fully_upgraded && !blk_free && (GDSV7m != tmp_ondskblkver)) /* !fully_upgraded only during V6 -> V7 upgrade */ { /* block in need of attention */ buff_is_modified_after_lseekread = TRUE; /* data blocks & local bit maps just get a version update */ if ((0 == (level = (int)((blk_hdr_ptr_t)buff)->levl)) || (LCL_MAP_LEVL == level)) /* WARNING assignment */ tmp_ondskblkver = level ? GDSV7m : GDSV6; else if ((csd->offset) && (GDSV6 == tmp_ondskblkver)) { /* This is a pre-V7 index block needing its offset adjusted */ assert(MEMCMP_LIT(csd->label, GDS_LABEL)); blk_ptr_adjust(buff, csd->offset); tmp_ondskblkver = ((blk_hdr_ptr_t)buff)->bver = GDSV6p; /* 4 byte block_id with offset applied */ } else assert(GDSV6p == tmp_ondskblkver); } /* V7 block with V7 DB intent or V6 with V6 DB intent or V6 in transition to V7 */ assert(!fully_upgraded ? (GDSV7 != tmp_ondskblkver) /* note: GDSV6p cannot exist when fully_upgraded is TRUE */ : (((GDSV7 == tmp_ondskblkver) || (GDSV7m == tmp_ondskblkver) && MEMCMP_LIT(csd->label, GDS_LABEL)) || ((GDSV6 == tmp_ondskblkver) && (!MEMCMP_LIT(csd->label, V6_GDS_LABEL))))); assert((GDSV4 != tmp_ondskblkver) && (NULL != ondsk_blkver)); /* REORG encrypt does not pass ondsk_blkver */ *ondsk_blkver = tmp_ondskblkver; } if (buff_is_modified_after_lseekread) { /* Normally the disk read (done in LSEEKREAD macro) would do the necessary write memory barrier to make the * updated shared memory global buffer contents visible to all other processes as long as they see any later * updates done to shared memory by the reader. But in case of a V4 -> V5 upgrade or reading of an encrypted * block, the actual disk read would have happened into a different buffer. That would then be used as a * source for the upgrade or decryption before placing the final contents in the input global buffer. * We now need a write memory barrier before returning from this function to publish this shared memory * update to other processes waiting on this read. Note: it is possible in rare cases (e.g. mupip reorg upgrade) * that the input buffer is NOT a shared memory buffer in which case the write memory barrier is not necessary * but it is not easily possible to identify that and we want to save if checks on the fast path and so do * the memory barrier in all cases. */ SHM_WRITE_MEMORY_BARRIER; } # ifdef DEBUG in_dsk_read--; assert(0 == in_dsk_read); /* Expect t_tries to be 3 if we have crit. Exceptions: gvcst_redo_root_search (where t_tries is temporarily reset * for the duration of the redo_root_search and so we should look at the real t_tries in redo_rootsrch_ctxt), * gvcst_expand_free_subtree, REORG UPGRADE/DOWNGRADE, DSE (where we grab crit before doing the t_qread irrespective * of t_tries), forward recovery (where we grab crit before doing everything), MUPIP TRIGGER -UPGRADE (where we * grab crit before doing the entire ^#t upgrade TP transaction) OR bm_getfree (where we did a preemptive crit grab * before doing a file extension). */ effective_t_tries = UNIX_ONLY( (TREF(in_gvcst_redo_root_search)) ? (TREF(redo_rootsrch_ctxt)).t_tries : ) t_tries; effective_t_tries = MAX(effective_t_tries, t_tries); killinprog = (NULL != ((dollar_tlevel) ? sgm_info_ptr->kip_csa : kip_csa)); assert(dse_running || killinprog || jgbl.forw_phase_recovery || mu_reorg_upgrd_dwngrd_in_prog || mu_reorg_encrypt_in_prog GTMTRIG_ONLY(|| TREF(in_trigger_upgrade)) || TREF(in_bm_getfree_gdsfilext) || (csa->now_crit != (CDB_STAGNATE > effective_t_tries))); # endif return save_errno; } |