summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/tagcache.c73
1 files changed, 42 insertions, 31 deletions
diff --git a/apps/tagcache.c b/apps/tagcache.c
index 6b6e4839d5..e1b99bd3a7 100644
--- a/apps/tagcache.c
+++ b/apps/tagcache.c
@@ -209,10 +209,10 @@ static struct master_header current_tcmh;
209 209
210#ifdef HAVE_TC_RAMCACHE 210#ifdef HAVE_TC_RAMCACHE
211 211
212#define TC_ALIGN_PTR(p, gap_out_p) \ 212#define TC_ALIGN_PTR(p, type, gap_out_p) \
213 ({ typeof (p) __p = (p); \ 213 ({ typeof (p) __p = (p); \
214 typeof (p) __palgn = ALIGN_UP(__p, sizeof (intptr_t)); \ 214 typeof (p) __palgn = ALIGN_UP(__p, __alignof__(type)); \
215 *(gap_out_p) = __palgn - __p; \ 215 *(gap_out_p) = (char *)__palgn - (char *)__p; \
216 __palgn; }) 216 __palgn; })
217 217
218#define IF_TCRCDC(...) IF_DIRCACHE(__VA_ARGS__) 218#define IF_TCRCDC(...) IF_DIRCACHE(__VA_ARGS__)
@@ -3872,14 +3872,15 @@ static struct buflib_callbacks ops = {
3872 3872
3873static bool allocate_tagcache(void) 3873static bool allocate_tagcache(void)
3874{ 3874{
3875 tc_stat.ramcache_allocated = 0;
3876 tcramcache.handle = 0;
3877 tcramcache.hdr = NULL;
3878
3875 /* Load the header. */ 3879 /* Load the header. */
3876 struct master_header tcmh; 3880 struct master_header tcmh;
3877 int fd = open_master_fd(&tcmh, false); 3881 int fd = open_master_fd(&tcmh, false);
3878 if (fd < 0) 3882 if (fd < 0)
3879 {
3880 tcramcache.hdr = NULL;
3881 return false; 3883 return false;
3882 }
3883 3884
3884 close(fd); 3885 close(fd);
3885 3886
@@ -3887,8 +3888,6 @@ static bool allocate_tagcache(void)
3887 * Now calculate the required cache size plus 3888 * Now calculate the required cache size plus
3888 * some extra space for alignment fixes. 3889 * some extra space for alignment fixes.
3889 */ 3890 */
3890 tc_stat.ramcache_allocated = 0;
3891
3892 size_t alloc_size = tcmh.tch.datasize + 256 + TAGCACHE_RESERVE + 3891 size_t alloc_size = tcmh.tch.datasize + 256 + TAGCACHE_RESERVE +
3893 sizeof(struct ramcache_header) + TAG_COUNT*sizeof(void *); 3892 sizeof(struct ramcache_header) + TAG_COUNT*sizeof(void *);
3894#ifdef HAVE_DIRCACHE 3893#ifdef HAVE_DIRCACHE
@@ -3899,14 +3898,13 @@ static bool allocate_tagcache(void)
3899 if (handle <= 0) 3898 if (handle <= 0)
3900 return false; 3899 return false;
3901 3900
3902 void *data = core_get_data(handle); 3901 tcramcache.handle = handle;
3903 3902 tcramcache.hdr = core_get_data(handle);
3904 tcramcache.hdr = data;
3905 tc_stat.ramcache_allocated = alloc_size; 3903 tc_stat.ramcache_allocated = alloc_size;
3906 3904
3907 memset(tcramcache.hdr, 0, sizeof(struct ramcache_header)); 3905 memset(tcramcache.hdr, 0, sizeof(struct ramcache_header));
3908 memcpy(&current_tcmh, &tcmh, sizeof current_tcmh); 3906 memcpy(&current_tcmh, &tcmh, sizeof current_tcmh);
3909 logf("tagcache: %lu bytes allocated.", tc_stat.ramcache_allocated); 3907 logf("tagcache: %d bytes allocated.", tc_stat.ramcache_allocated);
3910 3908
3911 return true; 3909 return true;
3912} 3910}
@@ -3917,6 +3915,7 @@ static bool tagcache_dumpload(void)
3917 struct statefile_header shdr; 3915 struct statefile_header shdr;
3918 int fd, rc, handle; 3916 int fd, rc, handle;
3919 3917
3918 tcramcache.handle = 0;
3920 tcramcache.hdr = NULL; 3919 tcramcache.hdr = NULL;
3921 3920
3922 fd = open(TAGCACHE_STATEFILE, O_RDONLY); 3921 fd = open(TAGCACHE_STATEFILE, O_RDONLY);
@@ -3946,6 +3945,7 @@ static bool tagcache_dumpload(void)
3946 } 3945 }
3947 3946
3948 tcrc_buffer_lock(); 3947 tcrc_buffer_lock();
3948 tcramcache.handle = handle;
3949 tcramcache.hdr = core_get_data(handle); 3949 tcramcache.hdr = core_get_data(handle);
3950 rc = read(fd, tcramcache.hdr, shdr.tc_stat.ramcache_allocated); 3950 rc = read(fd, tcramcache.hdr, shdr.tc_stat.ramcache_allocated);
3951 tcrc_buffer_unlock(); 3951 tcrc_buffer_unlock();
@@ -4019,6 +4019,8 @@ static bool load_tagcache(void)
4019#endif /* HAVE_DIRCACHE */ 4019#endif /* HAVE_DIRCACHE */
4020 4020
4021 logf("loading tagcache to ram..."); 4021 logf("loading tagcache to ram...");
4022
4023 tcrc_buffer_lock(); /* lock for the rest of the scan, simpler to handle */
4022 4024
4023 fd = open(TAGCACHE_FILE_MASTER, O_RDONLY); 4025 fd = open(TAGCACHE_FILE_MASTER, O_RDONLY);
4024 if (fd < 0) 4026 if (fd < 0)
@@ -4027,8 +4029,6 @@ static bool load_tagcache(void)
4027 goto failure; 4029 goto failure;
4028 } 4030 }
4029 4031
4030 tcrc_buffer_lock(); /* lock for the rest of the scan, simpler to handle */
4031
4032 struct master_header tcmh; 4032 struct master_header tcmh;
4033 if (ecread(fd, &tcmh, 1, master_header_ec, tc_stat.econ) 4033 if (ecread(fd, &tcmh, 1, master_header_ec, tc_stat.econ)
4034 != sizeof(struct master_header) 4034 != sizeof(struct master_header)
@@ -4072,7 +4072,7 @@ static bool load_tagcache(void)
4072 if (TAGCACHE_IS_NUMERIC(tag)) 4072 if (TAGCACHE_IS_NUMERIC(tag))
4073 continue; 4073 continue;
4074 4074
4075 p = TC_ALIGN_PTR(p, &rc); 4075 p = TC_ALIGN_PTR(p, struct tagcache_header, &rc);
4076 bytesleft -= rc; 4076 bytesleft -= rc;
4077 if (bytesleft < (ssize_t)sizeof(struct tagcache_header)) 4077 if (bytesleft < (ssize_t)sizeof(struct tagcache_header))
4078 { 4078 {
@@ -4100,7 +4100,7 @@ static bool load_tagcache(void)
4100 if (do_timed_yield() && check_event_queue()) 4100 if (do_timed_yield() && check_event_queue())
4101 goto failure; 4101 goto failure;
4102 4102
4103 p = TC_ALIGN_PTR(p, &rc); 4103 p = TC_ALIGN_PTR(p, struct tagfile_entry, &rc);
4104 bytesleft -= rc; 4104 bytesleft -= rc;
4105 if (bytesleft < (ssize_t)sizeof(struct tagfile_entry)) 4105 if (bytesleft < (ssize_t)sizeof(struct tagfile_entry))
4106 { 4106 {
@@ -4119,20 +4119,31 @@ static bool load_tagcache(void)
4119 goto failure; 4119 goto failure;
4120 } 4120 }
4121 4121
4122 /* We have a special handling for the filename tags; neither the 4122 int idx_id = fe->idx_id; /* dircache reference clobbers *fe */
4123 paths nor the entry headers are stored; only the tagcache header 4123 struct index_entry *idx = &tcramcache.hdr->indices[idx_id];
4124 and dircache references are. */ 4124
4125 if (tag == tag_filename) 4125 if (idx_id != -1 || tag == tag_filename) /* filename NOT optional */
4126 { 4126 {
4127 int idx_id = fe->idx_id; /* gonna clobber tagfile entry */
4128 if (idx_id < 0 || idx_id >= tcmh.tch.entry_count) 4127 if (idx_id < 0 || idx_id >= tcmh.tch.entry_count)
4129 { 4128 {
4130 logf("corrupt tagfile entry (tag: %d)", tag); 4129 logf("corrupt tagfile entry:tag=%d:idxid=%d", tag, idx_id);
4131 goto failure; 4130 goto failure;
4132 } 4131 }
4133 4132
4134 struct index_entry *idx = &tcramcache.hdr->indices[idx_id]; 4133 if (idx->tag_seek[tag] != pos)
4134 {
4135 logf("corrupt data structures!:");
4136 logf(" tag_seek[%d]=%ld:pos=%ld", tag,
4137 idx->tag_seek[tag], pos);
4138 goto failure;
4139 }
4140 }
4135 4141
4142 /* We have a special handling for the filename tags; neither the
4143 paths nor the entry headers are stored; only the tagcache header
4144 and dircache references are. */
4145 if (tag == tag_filename)
4146 {
4136 #ifdef HAVE_DIRCACHE 4147 #ifdef HAVE_DIRCACHE
4137 if (idx->flag & FLAG_DIRCACHE) 4148 if (idx->flag & FLAG_DIRCACHE)
4138 { 4149 {
@@ -4145,12 +4156,6 @@ static bool load_tagcache(void)
4145 bytesleft -= sizeof (struct dircache_fileref); 4156 bytesleft -= sizeof (struct dircache_fileref);
4146 #endif /* HAVE_DIRCACHE */ 4157 #endif /* HAVE_DIRCACHE */
4147 4158
4148 if (idx->tag_seek[tag] != pos)
4149 {
4150 logf("corrupt data structures!");
4151 goto failure;
4152 }
4153
4154 char filename[TAG_MAXLEN+32]; 4159 char filename[TAG_MAXLEN+32];
4155 if (fe->tag_length >= (long)sizeof(filename)-1) 4160 if (fe->tag_length >= (long)sizeof(filename)-1)
4156 { 4161 {
@@ -4163,11 +4168,14 @@ static bool load_tagcache(void)
4163 4168
4164 if ((idx->flag & FLAG_DELETED) IFN_DIRCACHE( || !auto_update )) 4169 if ((idx->flag & FLAG_DELETED) IFN_DIRCACHE( || !auto_update ))
4165 { 4170 {
4171 /* seek over tag data instead of reading */
4166 if (lseek(fd, fe->tag_length, SEEK_CUR) < 0) 4172 if (lseek(fd, fe->tag_length, SEEK_CUR) < 0)
4167 { 4173 {
4168 logf("read error #11.5"); 4174 logf("read error #11.5");
4169 goto failure; 4175 goto failure;
4170 } 4176 }
4177
4178 continue;
4171 } 4179 }
4172 4180
4173 if (read(fd, filename, fe->tag_length) != fe->tag_length) 4181 if (read(fd, filename, fe->tag_length) != fe->tag_length)
@@ -4191,7 +4199,7 @@ static bool load_tagcache(void)
4191 else if (auto_update) 4199 else if (auto_update)
4192 #else /* ndef HAVE_DIRCACHE */ 4200 #else /* ndef HAVE_DIRCACHE */
4193 /* Check if path is no longer valid */ 4201 /* Check if path is no longer valid */
4194 if (auto_update && !file_exists(filename)) 4202 if (!file_exists(filename))
4195 #endif /* HAVE_DIRCACHE */ 4203 #endif /* HAVE_DIRCACHE */
4196 { 4204 {
4197 logf("Entry no longer valid."); 4205 logf("Entry no longer valid.");
@@ -4218,7 +4226,7 @@ static bool load_tagcache(void)
4218 if (rc != fe->tag_length) 4226 if (rc != fe->tag_length)
4219 { 4227 {
4220 logf("read error #13"); 4228 logf("read error #13");
4221 logf("rc=0x%04x", rc); // 0x431 4229 logf("rc=0x%04x", (unsigned int)rc); // 0x431
4222 logf("len=0x%04lx", fe->tag_length); // 0x4000 4230 logf("len=0x%04lx", fe->tag_length); // 0x4000
4223 logf("pos=0x%04lx", lseek(fd, 0, SEEK_CUR)); // 0x433 4231 logf("pos=0x%04lx", lseek(fd, 0, SEEK_CUR)); // 0x433
4224 logf("tag=0x%02x", tag); // 0x00 4232 logf("tag=0x%02x", tag); // 0x00
@@ -4661,6 +4669,9 @@ static void load_ramcache(void)
4661 * so disable it entirely to prevent further issues. */ 4669 * so disable it entirely to prevent further issues. */
4662 tc_stat.ready = false; 4670 tc_stat.ready = false;
4663 tcramcache.hdr = NULL; 4671 tcramcache.hdr = NULL;
4672 int handle = tcramcache.handle;
4673 tcramcache.handle = 0;
4674 core_free(handle);
4664 } 4675 }
4665 4676
4666 cpu_boost(false); 4677 cpu_boost(false);