#ifndef _RF__RF_DECLUSTER_H_
#define _RF__RF_DECLUSTER_H_
#include <dev/raidframe/raidframevar.h>
struct RF_DeclusteredConfigInfo_s {
RF_StripeCount_t groupSize;
RF_RowCol_t **LayoutTable;
RF_RowCol_t **OffsetTable;
RF_RowCol_t **BlockTable;
RF_StripeCount_t SUsPerFullTable;
RF_StripeCount_t SUsPerTable;
RF_StripeCount_t PUsPerBlock;
RF_StripeCount_t SUsPerBlock;
RF_StripeCount_t BlocksPerTable;
RF_StripeCount_t NumParityReps;
RF_StripeCount_t TableDepthInPUs;
RF_StripeCount_t FullTableDepthInPUs;
RF_StripeCount_t FullTableLimitSUID;
RF_StripeCount_t ExtraTablesPerDisk;
RF_SectorNum_t DiskOffsetOfLastFullTableInSUs;
RF_StripeCount_t numCompleteFullTablesPerDisk;
u_int Lambda;
RF_StripeCount_t FullTablesPerSpareRegion;
RF_StripeCount_t TablesPerSpareRegion;
RF_SectorCount_t SpareSpaceDepthPerRegionInSUs;
RF_SectorCount_t SpareRegionDepthInSUs;
RF_SectorNum_t DiskOffsetOfLastSpareSpaceChunkInSUs;
RF_StripeCount_t TotSparePUsPerDisk;
RF_StripeCount_t NumCompleteSRs;
RF_SpareTableEntry_t **SpareTable;
char sparemap_fname[RF_SPAREMAP_NAME_LEN];
};
int
rf_ConfigureDeclustered(RF_ShutdownList_t ** listp, RF_Raid_t * raidPtr,
RF_Config_t * cfgPtr);
int
rf_ConfigureDeclusteredDS(RF_ShutdownList_t ** listp, RF_Raid_t * raidPtr,
RF_Config_t * cfgPtr);
void
rf_MapSectorDeclustered(RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
RF_RowCol_t * col, RF_SectorNum_t * diskSector, int remap);
void
rf_MapParityDeclustered(RF_Raid_t * raidPtr, RF_RaidAddr_t raidSector,
RF_RowCol_t * col, RF_SectorNum_t * diskSector, int remap);
void
rf_IdentifyStripeDeclustered(RF_Raid_t * raidPtr, RF_RaidAddr_t addr,
RF_RowCol_t ** diskids);
void
rf_MapSIDToPSIDDeclustered(RF_RaidLayout_t * layoutPtr,
RF_StripeNum_t stripeID, RF_StripeNum_t * psID,
RF_ReconUnitNum_t * which_ru);
int rf_InstallSpareTable(RF_Raid_t * raidPtr, RF_RowCol_t fcol);
void rf_FreeSpareTable(RF_Raid_t * raidPtr);
RF_HeadSepLimit_t rf_GetDefaultHeadSepLimitDeclustered(RF_Raid_t * raidPtr);
int rf_GetDefaultNumFloatingReconBuffersDeclustered(RF_Raid_t * raidPtr);
void
rf_decluster_adjust_params(RF_RaidLayout_t * layoutPtr,
RF_StripeNum_t * SUID, RF_StripeCount_t * sus_per_fulltable,
RF_StripeCount_t * fulltable_depth, RF_StripeNum_t * base_suid);
void
rf_remap_to_spare_space(
RF_RaidLayout_t * layoutPtr,
RF_DeclusteredConfigInfo_t * info, RF_StripeNum_t FullTableID,
RF_StripeNum_t TableID, RF_SectorNum_t BlockID, RF_StripeNum_t base_suid,
RF_StripeNum_t SpareRegion, RF_RowCol_t * outCol, RF_StripeNum_t * outSU);
int rf_SetSpareTable(RF_Raid_t * raidPtr, void *data);
RF_ReconUnitCount_t rf_GetNumSpareRUsDeclustered(RF_Raid_t * raidPtr);
#endif