Index: src/cf.data.pre =================================================================== RCS file: /squid/squid/src/cf.data.pre,v retrieving revision 1.371 diff -u -p -r1.371 cf.data.pre --- src/cf.data.pre 22 Sep 2006 06:36:51 -0000 1.371 +++ src/cf.data.pre 24 Sep 2006 11:59:22 -0000 @@ -1062,10 +1062,13 @@ DOC_START see the --enable-storeio configure option. 'Directory' is a top-level directory where cache swap - files will be stored. If you want to use an entire disk + files will be stored. If you want to use an entire disk for caching, this can be the mount-point directory. The directory must exist and be writable by the Squid - process. Squid will NOT create this directory for you. + process. Squid will NOT create this directory for you. + Only using COSS, a raw disk device or a stripe file can + be specified, but the configuration of the "cache_wap_log" + tag is mandatory. The ufs store type: Index: src/fs/coss/store_coss.h =================================================================== RCS file: /squid/squid/src/fs/coss/store_coss.h,v retrieving revision 1.13 diff -u -p -r1.13 store_coss.h --- src/fs/coss/store_coss.h 23 Sep 2006 10:34:41 -0000 1.13 +++ src/fs/coss/store_coss.h 24 Sep 2006 11:59:22 -0000 @@ -22,6 +22,8 @@ typedef struct _cossstripe CossStripe; #define COSS_ALLOC_ALLOCATE 1 #define COSS_ALLOC_REALLOC 2 +#define SWAPDIR_COSS "coss" + #if USE_AUFSOPS /* XXX a hack; the async ops should be broken out! */ typedef void AIOCB(int fd, void *cbdata, const char *buf, Index: src/fs/coss/store_dir_coss.c =================================================================== RCS file: /squid/squid/src/fs/coss/store_dir_coss.c,v retrieving revision 1.59 diff -u -p -r1.59 store_dir_coss.c --- src/fs/coss/store_dir_coss.c 23 Sep 2006 10:34:41 -0000 1.59 +++ src/fs/coss/store_dir_coss.c 24 Sep 2006 11:59:23 -0000 @@ -50,7 +50,7 @@ int n_coss_dirs = 0; int max_coss_dir_size = 0; -/* static int last_coss_pick_index = -1; */ +static int last_coss_pick_index = -1; int coss_initialised = 0; MemPool *coss_state_pool = NULL; MemPool *coss_index_pool = NULL; @@ -137,7 +137,8 @@ stripePath(SwapDir * sd) if (stat(sd->path, &st) == 0) { if (S_ISDIR(st.st_mode)) strcat(pathtmp, "/stripe"); - } + } else + fatalf("stripePath: Cannot stat %s.", sd->path); cs->stripe_path = xstrdup(pathtmp); } return cs->stripe_path; @@ -150,6 +151,8 @@ storeCossDirSwapLogFile(SwapDir * sd, co LOCAL_ARRAY(char, pathtmp, SQUID_MAXPATHLEN); LOCAL_ARRAY(char, digit, 32); char *pathtmp2; + struct stat st; + if (Config.Log.swap) { xstrncpy(pathtmp, sd->path, SQUID_MAXPATHLEN - 64); pathtmp2 = pathtmp; @@ -165,8 +168,14 @@ storeCossDirSwapLogFile(SwapDir * sd, co strncat(path, digit, 3); } } else { - xstrncpy(path, sd->path, SQUID_MAXPATHLEN - 64); - strcat(path, "/swap.state"); + if (stat(sd->path, &st) == 0) { + if (S_ISDIR(st.st_mode)) { + xstrncpy(path, sd->path, SQUID_MAXPATHLEN - 64); + strcat(path, "/swap.state"); + } else + fatal("storeCossDirSwapLogFile: 'cache_swap_log' is needed in your COSS configuration."); + } else + fatalf("storeCossDirSwapLogFile: Cannot stat %s.", sd->path); } if (ext) strncat(path, ext, 16); @@ -568,6 +577,24 @@ storeCossDirNewfs(SwapDir * sd) debug(47, 3) ("Creating swap space in %s\n", stripePath(sd)); } +/* + * Only "free" the filesystem specific stuff here + */ +static void +storeCossDirFree(SwapDir * SD) +{ + CossInfo *cs = (CossInfo *) SD->fsdata; + if (cs->swaplog_fd > -1) { + file_close(cs->swaplog_fd); + cs->swaplog_fd = -1; + } + xfree(cs->stripes); + xfree(cs->memstripes); + xfree(cs); + SD->fsdata = NULL; /* Will aid debugging... */ + +} + /* we are shutting down, flush all membufs to disk */ static void storeCossDirShutdown(SwapDir * SD) @@ -575,10 +602,7 @@ storeCossDirShutdown(SwapDir * SD) CossInfo *cs = (CossInfo *) SD->fsdata; debug(47, 1) ("COSS: %s: syncing\n", stripePath(SD)); -#if USE_AUFSOPS - aioSync(SD); -#endif - storeCossSync(SD); /* This'll call a_file_syncqueue() */ + storeCossSync(SD); /* This'll call a_file_syncqueue() or a aioSync() */ #if !USE_AUFSOPS a_file_closequeue(&cs->aq); #endif @@ -746,7 +770,7 @@ storeCossDirParse(SwapDir * sd, int inde sd->init = storeCossDirInit; sd->newfs = storeCossDirNewfs; sd->dump = storeCossDirDump; - sd->freefs = storeCossDirShutdown; + sd->freefs = storeCossDirFree; sd->dblcheck = NULL; sd->statfs = storeCossDirStats; sd->maintainfs = NULL; @@ -1004,7 +1028,6 @@ storeCossDirDumpBlkSize(StoreEntry * e, storeAppendPrintf(e, " block-size=%d", 1 << cs->blksz_bits); } -#if OLD_UNUSED_CODE SwapDir * storeCossDirPick(void) { @@ -1015,7 +1038,7 @@ storeCossDirPick(void) return NULL; for (i = 0; i < Config.cacheSwap.n_configured; i++) { SD = &Config.cacheSwap.swapDirs[i]; - if (SD->type == SWAPDIR_COSS) { + if (strcmp(SD->type, SWAPDIR_COSS) == 0) { if ((last_coss_pick_index == -1) || (n_coss_dirs == 1)) { last_coss_pick_index = i; return SD; @@ -1029,7 +1052,7 @@ storeCossDirPick(void) } for (i = 0; i < Config.cacheSwap.n_configured; i++) { SD = &Config.cacheSwap.swapDirs[i]; - if (SD->type == SWAPDIR_COSS) { + if (strcmp(SD->type, SWAPDIR_COSS) == 0) { if ((last_coss_pick_index == -1) || (n_coss_dirs == 1)) { last_coss_pick_index = i; return SD; @@ -1043,7 +1066,6 @@ storeCossDirPick(void) } return NULL; } -#endif /* * initial setup/done code @@ -1051,6 +1073,10 @@ storeCossDirPick(void) static void storeCossDirDone(void) { + int i, n_dirs = n_coss_dirs; + + for (i = 0; i < n_dirs; i++) + storeCossDirShutdown(storeCossDirPick()); memPoolDestroy(coss_state_pool); coss_initialised = 0; } @@ -1099,7 +1125,7 @@ storeFsSetup_coss(storefs_entry_t * stor coss_index_pool = memPoolCreate("COSS index data", sizeof(CossIndexNode)); coss_realloc_pool = memPoolCreate("COSS pending realloc", sizeof(CossPendingReloc)); coss_op_pool = memPoolCreate("COSS pending operation", sizeof(CossReadOp)); - cachemgrRegister("coss", "COSS Stats", storeCossStats, 0, 1); + cachemgrRegister(SWAPDIR_COSS, "COSS Stats", storeCossStats, 0, 1); coss_initialised = 1; }