[sheepdog] [PATCH] sheep: write vid back if found vdi_id in hyper volume
Liu Yuan
namei.unix at gmail.com
Sat Jan 4 06:30:58 CET 2014
On Fri, Jan 03, 2014 at 02:05:05PM +0800, Robin Dong wrote:
> From: Robin Dong <sanbai at taobao.com>
>
> We forgot to write vid back if it has been found in second level leaf-node
> previously, this will cause data lost when doing overwrite for large file.
>
> Signed-off-by: Robin Dong <sanbai at taobao.com>
> ---
> lib/sd_inode.c | 13 +++++++++++++
> 1 file changed, 13 insertions(+)
>
> diff --git a/lib/sd_inode.c b/lib/sd_inode.c
> index 0043981..da3182e 100644
> --- a/lib/sd_inode.c
> +++ b/lib/sd_inode.c
> @@ -568,6 +568,7 @@ void sd_inode_set_vid(write_node_fn writer, read_node_fn reader,
> {
> struct sd_extent_header *header;
> struct find_path path;
> + uint64_t offset;
> int ret;
>
> path.p_ext_header = NULL;
> @@ -585,6 +586,18 @@ void sd_inode_set_vid(write_node_fn writer, read_node_fn reader,
> ret = search_whole_btree(reader, inode, idx, &path);
> if (ret == SD_RES_BTREE_FOUND) {
> path.p_ext->vdi_id = vdi_id;
> + /*
> + * Only write the vdi_id in sd_extent for
> + * second level leaf-node.
> + */
> + if (!path.p_ext_header)
> + goto out;
> + offset = (unsigned char *)(path.p_ext) -
> + (unsigned char *)(path.p_ext_header) +
> + offsetof(struct sd_extent, vdi_id);
> + writer(path.p_idx->oid, &vdi_id, sizeof(vdi_id),
> + offset, 0, inode->nr_copies,
> + inode->copy_policy, false, false);
> goto out;
> } else {
> ret = insert_new_node(writer, reader, inode,
Applied thanks
Yuan
More information about the sheepdog
mailing list