+
+ if (EXPECT_FALSE(update == NULL))
+ return DOES_NOT_EXIST;
+
+ // collect some garbage
+ update_rec_t *next = update->next;
+ if (next != NULL) {
+ uint64_t min_active_version = (uint64_t)sl_min_key(active_);
+ if (next->version < min_active_version) {
+ next = SYNC_SWAP(&update->next, NULL);
+ while (next != NULL) {
+ update = next;
+ next = NULL;
+ if (update->next != NULL) {
+ next = SYNC_SWAP(&update->next, NULL);
+ }
+ nbd_free(update);
+ }
+ }
+ }
+
+ return update->value;