[sheepdog] [PATCH] sheep: avoid calling delete_inode() in main thread
levin li
levin108 at gmail.com
Sun Jun 24 14:13:28 CEST 2012
From: levin li <xingke.lwp at taobao.com>
When deleting vdi, delete_one_done() calls delete_inode() which
do IO request (read and write), while delete_one_done() is called
in main thread, so we should not call delete_inode() in
delete_one_done().
Signed-off-by: levin li <xingke.lwp at taobao.com>
---
sheep/vdi.c | 26 +++++++++++---------------
1 file changed, 11 insertions(+), 15 deletions(-)
diff --git a/sheep/vdi.c b/sheep/vdi.c
index e334f71..76a7128 100644
--- a/sheep/vdi.c
+++ b/sheep/vdi.c
@@ -392,7 +392,7 @@ struct deletion_work {
static LIST_HEAD(deletion_work_list);
-static int delete_inode(struct deletion_work *dw, int objs_deleted)
+static int delete_inode(struct deletion_work *dw)
{
struct sheepdog_inode *inode = NULL;
int ret = SD_RES_SUCCESS;
@@ -413,13 +413,7 @@ static int delete_inode(struct deletion_work *dw, int objs_deleted)
goto out;
}
- if (dw->delete_error)
- inode->vdi_size = 0;
- else {
- memset(inode->name, 0, sizeof(inode->name));
- if (objs_deleted)
- inode->vdi_size = 0;
- }
+ memset(inode->name, 0, sizeof(inode->name));
ret = write_object(dw->vnodes, dw->epoch, vid_to_vdi_oid(dw->vid),
(char *)inode, SD_INODE_HEADER_SIZE, 0, 0,
@@ -485,11 +479,15 @@ static void delete_one(struct work *work)
inode->data_vdi_id[i] = 0;
}
- if (dw->delete_error) {
- write_object(dw->vnodes, dw->epoch, vid_to_vdi_oid(vdi_id),
- (void *)inode, sizeof(*inode), 0, 0, nr_copies, 0);
- }
+ if (!dw->delete_error && *(inode->name) == '\0')
+ goto out;
+
+ inode->vdi_size = 0;
+ if (!dw->delete_error)
+ memset(inode->name, 0, sizeof(inode->name));
+ write_object(dw->vnodes, dw->epoch, vid_to_vdi_oid(vdi_id),
+ (void *)inode, sizeof(*inode), 0, 0, nr_copies, 0);
out:
free(inode);
}
@@ -504,8 +502,6 @@ static void delete_one_done(struct work *work)
return;
}
- delete_inode(dw, 1);
-
list_del(&dw->dw_siblings);
put_vnode_info(dw->vnodes);
@@ -655,7 +651,7 @@ static int start_deletion(struct vnode_info *vnode_info, uint32_t vid,
dprintf("snapshot chain has valid vdi, "
"just mark vdi %" PRIx32 " as deleted.\n",
dw->vid);
- delete_inode(dw, 0);
+ delete_inode(dw);
return SD_RES_SUCCESS;
}
}
--
1.7.10
More information about the sheepdog
mailing list