88 lines
2.8 KiB
C
88 lines
2.8 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2009 Fidelity Information Services, Inc *
|
|
* *
|
|
* 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. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
/* mu_reduce_level.c: Reduce level overwriting root with it's star-record-only child block. */
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_string.h"
|
|
|
|
#include "cdb_sc.h"
|
|
#include "gdsroot.h"
|
|
#include "gdsblk.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "gdsblkops.h"
|
|
#include "gdskill.h"
|
|
#include "gdscc.h"
|
|
#include "jnl.h"
|
|
#include "copy.h"
|
|
#include "muextr.h"
|
|
#include "mu_reorg.h"
|
|
|
|
/* Include prototypes */
|
|
#include "t_write.h"
|
|
#include "mupip_reorg.h"
|
|
|
|
GBLREF gv_namehead *gv_target;
|
|
GBLREF sgmnt_data_ptr_t cs_data;
|
|
GBLREF uint4 update_array_size; /* for the BLK_* macros */
|
|
GBLREF char *update_array, *update_array_ptr;
|
|
GBLREF unsigned int t_tries;
|
|
GBLREF uint4 t_err;
|
|
|
|
/**************************************************************************************
|
|
Input Parameters:
|
|
(GBL_DEF) gv_target: For reference block's history
|
|
Output Parameters:
|
|
kill_set_ptr : List of blocks to be freed
|
|
***************************************************************************************/
|
|
enum cdb_sc mu_reduce_level(kill_set *kill_set_ptr)
|
|
{
|
|
int level;
|
|
int old_blk_sz;
|
|
int blk_seg_cnt, blk_size;
|
|
blk_segment *bs_ptr1, *bs_ptr2;
|
|
sm_uc_ptr_t old_blk_base, save_blk;
|
|
|
|
level = gv_target->hist.depth;
|
|
if (1 == level)
|
|
return cdb_sc_oprnotneeded;
|
|
|
|
blk_size = cs_data->blk_size;
|
|
kill_set_ptr->used = 0;
|
|
memset(kill_set_ptr, 0, SIZEOF(kill_set));
|
|
CHECK_AND_RESET_UPDATE_ARRAY; /* reset update_array_ptr to update_array */
|
|
old_blk_base = gv_target->hist.h[level].buffaddr;
|
|
old_blk_sz = ((blk_hdr_ptr_t)(old_blk_base))->bsiz;
|
|
if (SIZEOF(blk_hdr) + BSTAR_REC_SIZE != old_blk_sz)
|
|
return cdb_sc_oprnotneeded;
|
|
old_blk_base = gv_target->hist.h[level-1].buffaddr;
|
|
old_blk_sz = ((blk_hdr_ptr_t)(old_blk_base))->bsiz;
|
|
BLK_ADDR(save_blk, old_blk_sz - SIZEOF(blk_hdr), unsigned char);
|
|
memcpy(save_blk, old_blk_base + SIZEOF(blk_hdr), old_blk_sz - SIZEOF(blk_hdr));
|
|
BLK_INIT(bs_ptr2, bs_ptr1);
|
|
BLK_SEG(bs_ptr2, save_blk, old_blk_sz - SIZEOF(blk_hdr));
|
|
if (!BLK_FINI(bs_ptr2, bs_ptr1))
|
|
{
|
|
assert(t_tries < CDB_STAGNATE);
|
|
return cdb_sc_blkmod;
|
|
}
|
|
t_write(&gv_target->hist.h[level], (unsigned char *)bs_ptr1, 0, 0, level - 1, TRUE, TRUE, GDS_WRITE_KILLTN);
|
|
kill_set_ptr->blk[kill_set_ptr->used].flag = 0;
|
|
kill_set_ptr->blk[kill_set_ptr->used].level = 0;
|
|
kill_set_ptr->blk[kill_set_ptr->used++].block = gv_target->hist.h[level-1].blk_num;
|
|
return cdb_sc_normal;
|
|
}
|