Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef _P_CACHE_DISK_H__
00025 #define _P_CACHE_DISK_H__
00026
00027 #include "I_Cache.h"
00028
00029 extern int cache_config_max_disk_errors;
00030
00031 #define DISK_BAD(_x) ((_x)->num_errors >= cache_config_max_disk_errors)
00032 #define DISK_BAD_SIGNALLED(_x) (_x->num_errors > cache_config_max_disk_errors)
00033 #define SET_DISK_BAD(_x) (_x->num_errors = cache_config_max_disk_errors)
00034 #define SET_DISK_OKAY(_x) (_x->num_errors = 0)
00035
00036 #define VOL_BLOCK_SIZE (1024 * 1024 * 128)
00037 #define MIN_VOL_SIZE VOL_BLOCK_SIZE
00038 #define ROUND_DOWN_TO_VOL_BLOCK(_x) (((_x) &~ (VOL_BLOCK_SIZE - 1)))
00039 #define VOL_BLOCK_SHIFT 27
00040 #define ROUND_DOWN_TO_STORE_BLOCK(_x) (((_x) >> STORE_BLOCK_SHIFT) << STORE_BLOCK_SHIFT)
00041
00042 #define STORE_BLOCKS_PER_VOL (VOL_BLOCK_SIZE / STORE_BLOCK_SIZE)
00043 #define DISK_HEADER_MAGIC 0xABCD1237
00044
00045
00046 struct CacheDisk;
00047
00048 struct DiskVolBlock
00049 {
00050 uint64_t offset;
00051 uint64_t len;
00052 int number;
00053 unsigned int type:3;
00054 unsigned int free:1;
00055 };
00056
00057 struct DiskVolBlockQueue
00058 {
00059 DiskVolBlock *b;
00060 int new_block;
00061 LINK(DiskVolBlockQueue, link);
00062
00063 DiskVolBlockQueue()
00064 : b(NULL), new_block(0)
00065 { }
00066 };
00067
00068 struct DiskVol
00069 {
00070 int num_volblocks;
00071 int vol_number;
00072 uint64_t size;
00073 CacheDisk *disk;
00074 Queue<DiskVolBlockQueue> dpb_queue;
00075 };
00076
00077 struct DiskHeader
00078 {
00079 unsigned int magic;
00080 unsigned int num_volumes;
00081 unsigned int num_free;
00082 unsigned int num_used;
00083 unsigned int num_diskvol_blks;
00084 uint64_t num_blocks;
00085 DiskVolBlock vol_info[1];
00086 };
00087
00088 struct CacheDisk: public Continuation
00089 {
00090 DiskHeader *header;
00091 char *path;
00092 int header_len;
00093 AIOCallbackInternal io;
00094 off_t len;
00095 off_t start;
00096 off_t skip;
00097 off_t num_usable_blocks;
00098 int hw_sector_size;
00099 int fd;
00100 off_t free_space;
00101 off_t wasted_space;
00102 DiskVol **disk_vols;
00103 DiskVol *free_blocks;
00104 int num_errors;
00105 int cleared;
00106
00107
00108 int forced_volume_num;
00109 ats_scoped_str hash_base_string;
00110
00111 CacheDisk()
00112 : Continuation(new_ProxyMutex()), header(NULL),
00113 path(NULL), header_len(0), len(0), start(0), skip(0),
00114 num_usable_blocks(0), fd(-1), free_space(0), wasted_space(0),
00115 disk_vols(NULL), free_blocks(NULL), num_errors(0), cleared(0),
00116 forced_volume_num(-1)
00117 { }
00118
00119 ~CacheDisk();
00120
00121 int open(bool clear);
00122 int open(char *s, off_t blocks, off_t skip, int hw_sector_size, int fildes, bool clear);
00123 int clearDisk();
00124 int clearDone(int event, void *data);
00125 int openStart(int event, void *data);
00126 int openDone(int event, void *data);
00127 int sync();
00128 int syncDone(int event, void *data);
00129 DiskVolBlock *create_volume(int number, off_t size, int scheme);
00130 int delete_volume(int number);
00131 int delete_all_volumes();
00132 void update_header();
00133 DiskVol *get_diskvol(int vol_number);
00134
00135 };
00136
00137
00138 #endif