5bdb55abec
The main intention here was to make the tracking of opened mdirs, mostly opened lfsr_dir_t structs, simpler and more resilient to weird corner cases. I'm not entirely sure this was successful. The main changes: - lfsr_dir_t now contains a full mdir for the dstart entry. This makes it so that dstarts are not a special case when it comes to mdir updates, though the fact that directories have 2 mdirs is still an awkward case on its own. I considered using two entries in the opened linked-list for this, but it wouldn't have worked out that well. Both entries need to update the directory position, so it would have required a third file type. We would also have needed to make sure removed mdirs mark both mdirs as removed, otherwise the position mdir would move around arbitrary into possibly erronous values. Instead the current solution treats the directory mdirs as a small array of 2 mdirs, which is as hacky as it is hacky, but does get the job done with little code duplication. - Directory positions are updated a bit more intellegently. Instead of checking if in range before updating, which requires access to both mdirs and duplicate mid/rid comparison logic, position is updated without regard for the beginning of the directory, and un-updated if it was actually out of range of the directory. This means we only need to compare the mids/rids for each mdir once. This changes make it so that lfsr_dir_rewind is much cheaper, and doesn't even need to go to disk. Though I'm not sure it's worth the RAM increase... Expanding the lfsr_dir_t dstart entry to a full mdir does a lot for making mdir updates more consistent, but increases the lfsr_dir_t size from 52 bytes to 76 bytes (+46.2%).