Remove double write when old and new locations are in the same metadata block
Also add another metadata entry fool-safety check which, ideally, will never fire %)openssl
parent
2c9a10d081
commit
f9fbea25a4
|
@ -536,14 +536,27 @@ resume_1:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// zero out old metadata entry
|
// zero out old metadata entry
|
||||||
|
{
|
||||||
|
clean_disk_entry *old_entry = (clean_disk_entry*)((uint8_t*)meta_old.buf + meta_old.pos*bs->dsk.clean_entry_size);
|
||||||
|
if (old_entry->oid.inode != 0 && old_entry->oid != cur.oid)
|
||||||
|
{
|
||||||
|
printf("Fatal error (metadata corruption or bug): tried to wipe metadata entry %lu (%lx:%lx v%lu) as old location of %lx:%lx\n",
|
||||||
|
old_clean_loc >> bs->dsk.block_order, old_entry->oid.inode, old_entry->oid.stripe,
|
||||||
|
old_entry->version, cur.oid.inode, cur.oid.stripe);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
memset((uint8_t*)meta_old.buf + meta_old.pos*bs->dsk.clean_entry_size, 0, bs->dsk.clean_entry_size);
|
memset((uint8_t*)meta_old.buf + meta_old.pos*bs->dsk.clean_entry_size, 0, bs->dsk.clean_entry_size);
|
||||||
await_sqe(15);
|
if (meta_old.sector != meta_new.sector)
|
||||||
data->iov = (struct iovec){ meta_old.buf, bs->dsk.meta_block_size };
|
{
|
||||||
data->callback = simple_callback_w;
|
await_sqe(15);
|
||||||
my_uring_prep_writev(
|
data->iov = (struct iovec){ meta_old.buf, bs->dsk.meta_block_size };
|
||||||
sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + bs->dsk.meta_block_size + meta_old.sector
|
data->callback = simple_callback_w;
|
||||||
);
|
my_uring_prep_writev(
|
||||||
wait_count++;
|
sqe, bs->dsk.meta_fd, &data->iov, 1, bs->dsk.meta_offset + bs->dsk.meta_block_size + meta_old.sector
|
||||||
|
);
|
||||||
|
wait_count++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (has_delete)
|
if (has_delete)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue