This patch is generated from the fsopts-20010210 branch of HEAD-20010210 in squid Thu Sep 11 11:59:43 2003 GMT See http://devel.squid-cache.org/ Index: squid/src/cache_cf.c diff -u squid/src/cache_cf.c:1.17 squid/src/cache_cf.c:1.17.2.2 --- squid/src/cache_cf.c:1.17 Wed Feb 7 11:11:48 2001 +++ squid/src/cache_cf.c Sat Feb 10 07:31:17 2001 @@ -1033,13 +1033,10 @@ SwapDir *sd; int i; int fs; - ssize_t maxobjsize; if ((type_str = strtok(NULL, w_space)) == NULL) self_destruct(); - maxobjsize = (ssize_t) GetInteger(); - if ((path_str = strtok(NULL, w_space)) == NULL) self_destruct(); @@ -1070,7 +1067,6 @@ } sd = swap->swapDirs + i; storefs_list[fs].reconfigurefunc(sd, i, path_str); - sd->max_objsize = maxobjsize; update_maxobjsize(); return; } @@ -1085,15 +1081,88 @@ } allocate_new_swapdir(swap); sd = swap->swapDirs + swap->n_configured; - storefs_list[fs].parsefunc(sd, swap->n_configured, path_str); - /* XXX should we dupe the string here, in case it gets trodden on? */ sd->type = storefs_list[fs].typestr; - sd->max_objsize = maxobjsize; /* defaults in case fs implementation fails to set these */ + sd->max_objsize = -1; sd->fs.blksize = 1024; + /* parse the FS parameters and options */ + storefs_list[fs].parsefunc(sd, swap->n_configured, path_str); swap->n_configured++; /* Update the max object size */ update_maxobjsize(); +} + +static void parse_cachedir_option_readonly(SwapDir *sd, const char *option, const char *value, int reconfiguring) +{ + int read_only = 0; + if (value) + read_only = atoi(value); + else + read_only = 1; + sd->flags.read_only = read_only; +} + +static void parse_cachedir_option_maxsize(SwapDir *sd, const char *option, const char *value, int reconfiguring) +{ + ssize_t size; + + if (!value) + self_destruct(); + + size = atoi(value); + + if (reconfiguring && sd->max_objsize != size) + debug(3, 1) ("Cache dir '%s' max object size now %d\n", size); + + sd->max_objsize = size; +} + +static struct cache_dir_option common_cachedir_options[] = { + {"read-only", parse_cachedir_option_readonly}, + {"max-size", parse_cachedir_option_maxsize}, + {NULL, NULL} +}; + +void parse_cachedir_options(SwapDir *sd, struct cache_dir_option *options, int reconfiguring) +{ + int old_read_only = sd->flags.read_only; + char *name, *value; + struct cache_dir_option *option, *op; + + while((name = strtok(NULL, w_space)) != NULL) { + value = strchr(name, '='); + if (value) + *value++ = '\0'; /* cut on = */ + option = NULL; + if (options) { + for (op = options; !option && op->name; op++) { + if (strcmp(op->name, name) == 0) { + option = op; + break; + } + } + } + for (op = common_cachedir_options; !option && op->name; op++) { + if (strcmp(op->name, name) == 0) { + option = op; + break; + } + } + if (!option || !option->parse) + self_destruct(); + option->parse(sd, name, value, reconfiguring); + } + /* + * Handle notifications about reconfigured single-options with no value + * where the removal of the option cannot be easily detected in the + * parsing... + */ + if (reconfiguring) { + if (old_read_only != sd->flags.read_only) { + debug(3, 1) ("Cache dir '%s' now %s\n", + sd->path, sd->flags.read_only ? "Read-Only" : "Read-Write"); + } + } } static void Index: squid/src/cf.data.pre diff -u squid/src/cf.data.pre:1.20 squid/src/cf.data.pre:1.20.2.3 --- squid/src/cf.data.pre:1.20 Fri Feb 9 11:52:05 2001 +++ squid/src/cf.data.pre Sat Feb 10 07:54:12 2001 @@ -678,16 +678,12 @@ NAME: cache_dir TYPE: cachedir DEFAULT: none -DEFAULT_IF_NONE: ufs -1 @DEFAULT_SWAP_DIR@ 100 16 256 +DEFAULT_IF_NONE: ufs @DEFAULT_SWAP_DIR@ 100 16 256 LOC: Config.cacheSwap DOC_START Usage: - cache_dir Type Maxobjsize Directory-Name Mbytes Level-1 Level2 [...] - - DISKD Usage: - - cache_dir diskd Maxobjsize Directory-Name MB L1 L2 Q1 Q2 + cache_dir Type Directory-Name Fs-specific-data [options] You can specify multiple cache_dir lines to spread the cache among different disk partitions. @@ -698,18 +694,18 @@ want to try "aufs" as the type. Async IO support may be buggy, however, so beware. - Maxobjsize refers to the max object size this storedir supports. - It is used to initially choose the storedir to dump the object. - -1 means 'any size'. - 'Directory' is a top-level directory where cache swap files will be stored. If you want to use an entire disk for caching, then 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. - If no 'cache_dir' lines are specified, the following - default will be used: @DEFAULT_SWAP_DIR@. + The ufs store type: + + "ufs" is the old well-known Squid storage format that has always + been there. + + cache_dir ufs Directory-Name Mbytes L1 L2 [options] 'Mbytes' is the amount of disk space (MB) to use under this directory. The default is 100 MB. Change this to suit your @@ -722,12 +718,43 @@ will be created under each first-level directory. The default is 256. - For the diskd type, Q1 specifies the number of unacknowledged - I/O requests when Squid stops opening new files. If this - many messages are in the queues, Squid won't open new files. + The aufs store type: + + "aufs" uses the same storage format as "ufs", utilizing + POSIX-threads to avoid blocking the main Squid process on + disk-I/O. This was formerly known in Squid as async-io. + + cache_dir aufs Directory-Name Mbytes L1 L2 [options] + + see argument descriptions under ufs above + + The diskd store type: + + "diskd" uses the same storage format as "ufs", utilizing a + separate process to avoid blocking the main Squid process on + disk-I/O. + + cache_dir diskd Directory-Name Mbytes L1 L2 [options] [Q1=n] [Q2=n] + + see argument descriptions under ufs above + + Q1 specifies the number of unacknowledged I/O requests when Squid + stops opening new files. If this many messages are in the queues, + Squid won't open new files. Default is 64 + Q2 specifies the number of unacknowledged messages when Squid starts blocking. If this many messages are in the queues, - Squid blocks until it recevies some replies. + Squid blocks until it recevies some replies. Default is 72 + + Common options: + + read-only, this cache_dir is read only. + + max-size=n, refers to the max object size this storedir supports. + It is used to initially choose the storedir to dump the object. + Note: To make optimal use of the max-size limits you should order + the cache_dir lines with the smallest max-size value first and the + ones with no max-size specification last. DOC_END Index: squid/src/protos.h diff -u squid/src/protos.h:1.17 squid/src/protos.h:1.17.2.1 --- squid/src/protos.h:1.17 Wed Feb 7 11:11:48 2001 +++ squid/src/protos.h Sat Feb 10 06:47:44 2001 @@ -93,6 +93,8 @@ extern void parse_wordlist(wordlist ** list); extern void requirePathnameExists(const char *name, const char *path); extern void parse_time_t(time_t * var); +extern void parse_cachedir_options(SwapDir *sd, struct cache_dir_option *options, int reconfiguring); + /* * cbdata.c Index: squid/src/store_dir.c diff -u squid/src/store_dir.c:1.11 squid/src/store_dir.c:1.11.6.1 --- squid/src/store_dir.c:1.11 Fri Jan 12 00:20:33 2001 +++ squid/src/store_dir.c Sat Feb 10 06:47:44 2001 @@ -124,34 +124,36 @@ /* * This new selection scheme simply does round-robin on all SwapDirs. - * A SwapDir is skipped if it is over the max_size (100%) limit. If - * all SwapDir's are above the limit, then the first dirn that we - * checked is returned. Note that 'dirn' is guaranteed to advance even - * if all SwapDirs are full. - * - * XXX This function does NOT account for the read_only flag! + * A SwapDir is skipped if it is over the max_size (100%) limit, or + * overloaded. */ static int -storeDirSelectSwapDirRoundRobin(const StoreEntry * unused) +storeDirSelectSwapDirRoundRobin(const StoreEntry * e) { static int dirn = 0; int i; + int load; SwapDir *sd; - /* - * yes, the '<=' is intentional. If all dirs are full we want to - * make sure 'dirn' advances every time this gets called, otherwise - * we get stuck on one dir. - */ + ssize_t objsize = (ssize_t) objectLen(e); for (i = 0; i <= Config.cacheSwap.n_configured; i++) { if (++dirn >= Config.cacheSwap.n_configured) dirn = 0; sd = &Config.cacheSwap.swapDirs[dirn]; + if (sd->flags.read_only) + continue; if (sd->cur_size > sd->max_size) continue; - return dirn; + if (!storeDirValidSwapDirSize(i, objsize)) + continue; + /* check for error or overload condition */ + load = sd->checkobj(sd, e); + if (load < 0 || load > 1000) { + continue; } return dirn; } + return -1; +} /* * Spread load across all of the store directories @@ -170,9 +172,9 @@ storeDirSelectSwapDirLeastLoad(const StoreEntry * e) { ssize_t objsize; - ssize_t least_size; - ssize_t least_objsize; - int least_load = 1000; + ssize_t most_free = 0, cur_free; + ssize_t least_objsize = -1; + int least_load = INT_MAX; int load; int dirn = -1; int i; @@ -182,31 +184,33 @@ objsize = (ssize_t) objectLen(e); if (objsize != -1) objsize += e->mem_obj->swap_hdr_sz; - /* Initial defaults */ - least_size = Config.cacheSwap.swapDirs[0].cur_size; - least_objsize = Config.cacheSwap.swapDirs[0].max_objsize; for (i = 0; i < Config.cacheSwap.n_configured; i++) { SD = &Config.cacheSwap.swapDirs[i]; SD->flags.selected = 0; - if (SD->flags.read_only) - continue; - /* Valid for object size check */ - if (!storeDirValidSwapDirSize(i, objsize)) - continue; load = SD->checkobj(SD, e); - if (load < 0) + if (load < 0 || load > 1000) { + continue; + } + if (SD->flags.read_only) continue; if (SD->cur_size > SD->max_size) continue; if (load > least_load) continue; - if ((least_objsize > 0) && (objsize > least_objsize)) + cur_free = SD->max_size - SD->cur_size; + /* If the load is equal, then look in more details */ + if (load == least_load) { + /* closest max_objsize fit */ + if (least_objsize != -1) + if (SD->max_size > least_objsize || SD->max_size == -1) continue; - /* Only use leastsize if the load is equal */ - if ((load == least_load) && (SD->cur_size > least_size)) + /* most free */ + if (cur_free < most_free) continue; + } least_load = load; - least_size = SD->cur_size; + least_objsize = SD->max_objsize; + most_free = cur_free; dirn = i; } Index: squid/src/structs.h diff -u squid/src/structs.h:1.23 squid/src/structs.h:1.23.2.1 --- squid/src/structs.h:1.23 Fri Feb 9 11:52:05 2001 +++ squid/src/structs.h Sat Feb 10 06:47:44 2001 @@ -2100,3 +2100,8 @@ unsigned int fatal:1; } flags; }; + +struct cache_dir_option { + char *name; + void (*parse)(SwapDir *sd, const char *option, const char *value, int reconfiguring); +}; Index: squid/src/fs/aufs/store_dir_aufs.c diff -u squid/src/fs/aufs/store_dir_aufs.c:1.12 squid/src/fs/aufs/store_dir_aufs.c:1.12.2.1 --- squid/src/fs/aufs/store_dir_aufs.c:1.12 Wed Feb 7 11:11:49 2001 +++ squid/src/fs/aufs/store_dir_aufs.c Sat Feb 10 06:47:45 2001 @@ -1491,6 +1491,14 @@ #endif /* OLD_UNUSED_CODE */ } +static struct cache_dir_option options[] = { +#if NOT_YET_DONE + {"L1", storeAufsDirParseL1}, + {"L2", storeAufsDirParseL2}, +#endif + {NULL, NULL} +}; + /* * storeAufsDirReconfigure * @@ -1499,12 +1507,10 @@ static void storeAufsDirReconfigure(SwapDir * sd, int index, char *path) { - char *token; int i; int size; int l1; int l2; - unsigned int read_only = 0; i = GetInteger(); size = i << 10; /* Mbytes to kbytes */ @@ -1518,9 +1524,6 @@ l2 = i; if (l2 <= 0) fatal("storeAufsDirReconfigure: invalid level 2 directories value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; /* just reconfigure it */ if (size == sd->max_size) @@ -1530,10 +1533,9 @@ debug(3, 1) ("Cache dir '%s' size changed to %d KB\n", path, size); sd->max_size = size; - if (sd->flags.read_only != read_only) - debug(3, 1) ("Cache dir '%s' now %s\n", - path, read_only ? "Read-Only" : "Read-Write"); - sd->flags.read_only = read_only; + + parse_cachedir_options(sd, options, 0); + return; } @@ -1621,12 +1623,10 @@ static void storeAufsDirParse(SwapDir * sd, int index, char *path) { - char *token; int i; int size; int l1; int l2; - unsigned int read_only = 0; aioinfo_t *aioinfo; i = GetInteger(); @@ -1641,9 +1641,6 @@ l2 = i; if (l2 <= 0) fatal("storeAufsDirParse: invalid level 2 directories value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; aioinfo = xmalloc(sizeof(aioinfo_t)); if (aioinfo == NULL) @@ -1658,7 +1655,6 @@ aioinfo->swaplog_fd = -1; aioinfo->map = NULL; /* Debugging purposes */ aioinfo->suggest = 0; - sd->flags.read_only = read_only; sd->init = storeAufsDirInit; sd->newfs = storeAufsDirNewfs; sd->dump = storeAufsDirDump; @@ -1683,6 +1679,8 @@ sd->log.clean.start = storeAufsDirWriteCleanStart; sd->log.clean.nextentry = storeAufsDirCleanLogNextEntry; sd->log.clean.done = storeAufsDirWriteCleanDone; + + parse_cachedir_options(sd, options, 0); /* Initialise replacement policy stuff */ sd->repl = createRemovalPolicy(Config.replPolicy); Index: squid/src/fs/coss/store_dir_coss.c diff -u squid/src/fs/coss/store_dir_coss.c:1.9 squid/src/fs/coss/store_dir_coss.c:1.9.2.1 --- squid/src/fs/coss/store_dir_coss.c:1.9 Wed Feb 7 11:11:49 2001 +++ squid/src/fs/coss/store_dir_coss.c Sat Feb 10 06:47:45 2001 @@ -710,19 +710,14 @@ static void storeCossDirParse(SwapDir * sd, int index, char *path) { - char *token; unsigned int i; unsigned int size; - unsigned int read_only = 0; CossInfo *cs; i = GetInteger(); size = i << 10; /* Mbytes to Kbytes */ if (size <= 0) fatal("storeCossDirParse: invalid size value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; cs = xmalloc(sizeof(CossInfo)); if (cs == NULL) @@ -735,7 +730,6 @@ cs->fd = -1; cs->swaplog_fd = -1; - sd->flags.read_only = read_only; sd->init = storeCossDirInit; sd->newfs = storeCossDirNewfs; @@ -773,24 +767,21 @@ cs->current_membuf = cs->membufs; cs->index.head = NULL; cs->index.tail = NULL; + + parse_cachedir_options(sd, NULL, 0); } static void storeCossDirReconfigure(SwapDir * sd, int index, char *path) { - char *token; unsigned int i; unsigned int size; - unsigned int read_only = 0; i = GetInteger(); size = i << 10; /* Mbytes to Kbytes */ if (size <= 0) fatal("storeCossDirParse: invalid size value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; if (size == sd->max_size) debug(3, 1) ("Cache COSS dir '%s' size remains unchanged at %d KB\n", path, size); @@ -798,11 +789,7 @@ debug(3, 1) ("Cache COSS dir '%s' size changed to %d KB\n", path, size); sd->max_size = size; } - - if (read_only != sd->flags.read_only) { - debug(3, 1) ("Cache COSS dir '%s' now %s\n", path, read_only ? "Read-Only" : "Read-Write"); - sd->flags.read_only = read_only; - } + parse_cachedir_options(sd, NULL, 1); } void Index: squid/src/fs/diskd/store_dir_diskd.c diff -u squid/src/fs/diskd/store_dir_diskd.c:1.13 squid/src/fs/diskd/store_dir_diskd.c:1.13.2.2 --- squid/src/fs/diskd/store_dir_diskd.c:1.13 Wed Feb 7 11:11:49 2001 +++ squid/src/fs/diskd/store_dir_diskd.c Sat Feb 10 07:33:49 2001 @@ -1707,6 +1707,34 @@ storeAppendPrintf(sentry, "Pending operations: %d\n", diskdinfo->away); } +static void storeDiskdDirParseQ1(SwapDir *sd, const char * name, const char *value, int reconfiguring) +{ + diskdinfo_t *diskdinfo = sd->fsdata; + int old_magic1 = diskdinfo->magic1; + diskdinfo->magic1 = atoi(value); + if (reconfiguring && old_magic1 != diskdinfo->magic1) + debug(3, 1) ("cache_dir '%s' new Q1 value '%d'\n", diskdinfo->magic1); +} + +static void storeDiskdDirParseQ2(SwapDir *sd, const char * name, const char *value, int reconfiguring) +{ + diskdinfo_t *diskdinfo = sd->fsdata; + int old_magic2 = diskdinfo->magic2; + diskdinfo->magic2 = atoi(value); + if (reconfiguring && old_magic2 != diskdinfo->magic2) + debug(3, 1) ("cache_dir '%s' new Q2 value '%d'\n", diskdinfo->magic2); +} + +struct cache_dir_option options[] = { +#if NOT_YET + {"L1", storeDiskdDirParseL1}, + {"L2", storeDiskdDirParseL2}, +#endif + {"Q1", storeDiskdDirParseQ1}, + {"Q2", storeDiskdDirParseQ2}, + {NULL, NULL} +}; + /* * storeDiskdDirReconfigure * @@ -1715,13 +1743,11 @@ static void storeDiskdDirReconfigure(SwapDir * sd, int index, char *path) { - char *token; int i; int size; int l1; int l2; int magic1, magic2; - unsigned int read_only = 0; diskdinfo_t *diskdinfo; i = GetInteger(); @@ -1744,9 +1770,6 @@ magic2 = i; if (magic2 <= 0) fatal("storeDiskdDirParse: invalid magic2 value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; /* just reconfigure it */ if (size == sd->max_size) @@ -1756,14 +1779,10 @@ debug(3, 1) ("Cache dir '%s' size changed to %d KB\n", path, size); sd->max_size = size; - if (sd->flags.read_only != read_only) - debug(3, 1) ("Cache dir '%s' now %s\n", - path, read_only ? "Read-Only" : "Read-Write"); diskdinfo = sd->fsdata; diskdinfo->magic1 = magic1; diskdinfo->magic2 = magic2; - sd->flags.read_only = read_only; - return; + parse_cachedir_options(sd, options, 1); } void @@ -1852,13 +1871,10 @@ static void storeDiskdDirParse(SwapDir * sd, int index, char *path) { - char *token; int i; int size; int l1; int l2; - int magic1, magic2; - unsigned int read_only = 0; diskdinfo_t *diskdinfo; i = GetInteger(); @@ -1874,18 +1890,6 @@ if (l2 <= 0) fatal("storeDiskdDirParse: invalid level 2 directories value"); i = GetInteger(); - magic1 = i; - if (magic1 <= 0) - fatal("storeDiskdDirParse: invalid magic1 value"); - i = GetInteger(); - magic2 = i; - if (magic2 <= 0) - fatal("storeDiskdDirParse: invalid magic2 value"); - - - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; sd->fsdata = diskdinfo = xcalloc(1, sizeof(*diskdinfo)); sd->index = index; @@ -1896,9 +1900,8 @@ diskdinfo->swaplog_fd = -1; diskdinfo->map = NULL; /* Debugging purposes */ diskdinfo->suggest = 0; - diskdinfo->magic1 = magic1; - diskdinfo->magic2 = magic2; - sd->flags.read_only = read_only; + diskdinfo->magic1 = 64; + diskdinfo->magic2 = 72; sd->init = storeDiskdDirInit; sd->newfs = storeDiskdDirNewfs; sd->dump = storeDiskdDirDump; @@ -1923,6 +1926,8 @@ sd->log.clean.start = storeDiskdDirWriteCleanStart; sd->log.clean.nextentry = storeDiskdDirCleanLogNextEntry; sd->log.clean.done = storeDiskdDirWriteCleanDone; + + parse_cachedir_options(sd, options, 0); /* Initialise replacement policy stuff */ sd->repl = createRemovalPolicy(Config.replPolicy); Index: squid/src/fs/null/store_null.c diff -u squid/src/fs/null/store_null.c:1.1 squid/src/fs/null/store_null.c:1.1.4.2 --- squid/src/fs/null/store_null.c:1.1 Wed Feb 7 11:11:50 2001 +++ squid/src/fs/null/store_null.c Sat Feb 10 07:28:21 2001 @@ -113,6 +113,7 @@ sd->checkobj = storeNullDirCheckObj; sd->log.clean.start = storeNullDirWriteCleanStart; sd->log.clean.done = storeNullDirWriteCleanDone; + parse_cachedir_options(sd, NULL, 0); } /* Setup and register the store module */ Index: squid/src/fs/ufs/store_dir_ufs.c diff -u squid/src/fs/ufs/store_dir_ufs.c:1.11 squid/src/fs/ufs/store_dir_ufs.c:1.11.2.1 --- squid/src/fs/ufs/store_dir_ufs.c:1.11 Wed Feb 7 11:11:50 2001 +++ squid/src/fs/ufs/store_dir_ufs.c Sat Feb 10 06:47:46 2001 @@ -1483,6 +1483,14 @@ #endif /* OLD_UNUSED_CODE */ } +static struct cache_dir_option options[] = { +#if NOT_YET_DONE + {"L1", storeAufsDirParseL1}, + {"L2", storeAufsDirParseL2}, +#endif + {NULL, NULL} +}; + /* * storeUfsDirReconfigure * @@ -1491,12 +1499,10 @@ static void storeUfsDirReconfigure(SwapDir * sd, int index, char *path) { - char *token; int i; int size; int l1; int l2; - unsigned int read_only = 0; i = GetInteger(); size = i << 10; /* Mbytes to kbytes */ @@ -1510,9 +1516,6 @@ l2 = i; if (l2 <= 0) fatal("storeUfsDirReconfigure: invalid level 2 directories value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; /* just reconfigure it */ if (size == sd->max_size) @@ -1522,11 +1525,8 @@ debug(3, 1) ("Cache dir '%s' size changed to %d KB\n", path, size); sd->max_size = size; - if (sd->flags.read_only != read_only) - debug(3, 1) ("Cache dir '%s' now %s\n", - path, read_only ? "Read-Only" : "Read-Write"); - sd->flags.read_only = read_only; - return; + + parse_cachedir_options(sd, options, 1); } void @@ -1615,12 +1615,10 @@ static void storeUfsDirParse(SwapDir * sd, int index, char *path) { - char *token; int i; int size; int l1; int l2; - unsigned int read_only = 0; ufsinfo_t *ufsinfo; i = GetInteger(); @@ -1635,9 +1633,6 @@ l2 = i; if (l2 <= 0) fatal("storeUfsDirParse: invalid level 2 directories value"); - if ((token = strtok(NULL, w_space))) - if (!strcasecmp(token, "read-only")) - read_only = 1; ufsinfo = xmalloc(sizeof(ufsinfo_t)); if (ufsinfo == NULL) @@ -1652,7 +1647,6 @@ ufsinfo->swaplog_fd = -1; ufsinfo->map = NULL; /* Debugging purposes */ ufsinfo->suggest = 0; - sd->flags.read_only = read_only; sd->init = storeUfsDirInit; sd->newfs = storeUfsDirNewfs; sd->dump = storeUfsDirDump; @@ -1677,6 +1671,8 @@ sd->log.clean.start = storeUfsDirWriteCleanStart; sd->log.clean.nextentry = storeUfsDirCleanLogNextEntry; sd->log.clean.done = storeUfsDirWriteCleanDone; + + parse_cachedir_options(sd, options, 1); /* Initialise replacement policy stuff */ sd->repl = createRemovalPolicy(Config.replPolicy); squid-fsopts-20010210-HEAD-20010210.new squid-fsopts-20010210-HEAD-20010210 differ: char 84, line 2