diff options
-rw-r--r-- | firmware/common/dircache.c | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/firmware/common/dircache.c b/firmware/common/dircache.c index 8d264a3e7c..21ae71fd5d 100644 --- a/firmware/common/dircache.c +++ b/firmware/common/dircache.c | |||
@@ -150,26 +150,28 @@ static int move_callback(int handle, void* current, void* new) | |||
150 | if (dont_move) | 150 | if (dont_move) |
151 | return BUFLIB_CB_CANNOT_MOVE; | 151 | return BUFLIB_CB_CANNOT_MOVE; |
152 | 152 | ||
153 | #define UPDATE(x) if (x) { x = PTR_ADD(x, diff); } | ||
153 | /* relocate the cache */ | 154 | /* relocate the cache */ |
154 | ptrdiff_t diff = new - current; | 155 | ptrdiff_t diff = new - current; |
155 | for(unsigned i = 0; i < entry_count; i++) | 156 | for(unsigned i = 0; i < entry_count; i++) |
156 | { | 157 | { |
157 | if (dircache_root[i].d_name) | 158 | UPDATE(dircache_root[i].d_name); |
158 | dircache_root[i].d_name += diff; | 159 | UPDATE(dircache_root[i].next_char); |
159 | if (dircache_root[i].next_char) | 160 | UPDATE(dircache_root[i].up_char); |
160 | dircache_root[i].next_char += diff; | 161 | UPDATE(dircache_root[i].down_char); |
161 | if (dircache_root[i].up_char) | ||
162 | dircache_root[i].up_char += diff; | ||
163 | if (dircache_root[i].down_char) | ||
164 | dircache_root[i].down_char += diff; | ||
165 | } | 162 | } |
166 | dircache_root = new; | 163 | dircache_root = new; |
164 | UPDATE(d_names_start); | ||
165 | UPDATE(d_names_end); | ||
166 | UPDATE(dot); | ||
167 | UPDATE(dotdot); | ||
167 | 168 | ||
168 | d_names_start += diff; | 169 | for(unsigned i = 0; i < MAX_OPEN_FILES; i++) |
169 | d_names_end += diff; | 170 | UPDATE(fd_bindings[i]); |
170 | dot += diff; | ||
171 | dotdot += diff; | ||
172 | 171 | ||
172 | #ifdef HAVE_MULTIVOLUME | ||
173 | UPDATE(append_position); | ||
174 | #endif | ||
173 | return BUFLIB_CB_OK; | 175 | return BUFLIB_CB_OK; |
174 | } | 176 | } |
175 | 177 | ||