summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/common/dircache.c26
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