[sheepdog] [PATCH 1/2] md: purge directory only when md_add_disk() succeed
Liu Yuan
namei.unix at gmail.com
Fri May 10 08:41:33 CEST 2013
From: Liu Yuan <tailai.ly at taobao.com>
Signed-off-by: Liu Yuan <tailai.ly at taobao.com>
---
sheep/md.c | 23 +++++++++++++----------
sheep/sheep_priv.h | 2 +-
2 files changed, 14 insertions(+), 11 deletions(-)
diff --git a/sheep/md.c b/sheep/md.c
index cd5b243..892e0a2 100644
--- a/sheep/md.c
+++ b/sheep/md.c
@@ -145,16 +145,16 @@ static int path_to_disk_idx(char *path)
return -1;
}
-void md_add_disk(char *path)
+bool md_add_disk(char *path)
{
if (path_to_disk_idx(path) != -1) {
sd_eprintf("duplicate path %s", path);
- return;
+ return false;
}
if (xmkdir(path, sd_def_dmode) < 0) {
sd_eprintf("can't mkdir for %s, %m", path);
- return;
+ return false;
}
md_nr_disks++;
@@ -162,6 +162,7 @@ void md_add_disk(char *path)
pstrcpy(md_disks[md_nr_disks - 1].path, PATH_MAX, path);
sd_iprintf("%s, nr %d", md_disks[md_nr_disks - 1].path,
md_nr_disks);
+ return true;
}
static inline void calculate_vdisks(struct disk *disks, int nr_disks,
@@ -608,13 +609,15 @@ static int do_plug_unplug(char *disks, bool plug)
old_nr = md_nr_disks;
path = strtok(disks, ",");
do {
- if (purge_directory(path) < 0)
- goto out;
-
- if (plug)
- md_add_disk(path);
- else
+ if (plug) {
+ if (md_add_disk(path))
+ if (purge_directory(path) < 0) {
+ md_del_disk(path);
+ goto out;
+ }
+ } else {
md_del_disk(path);
+ }
} while ((path = strtok(NULL, ",")));
/* If no disks change, bail out */
@@ -633,7 +636,7 @@ out:
* that nr of disks are removed during md_init_space() happens to equal
* nr of disks we added.
*/
- if (cur_nr > 0)
+ if (cur_nr > 0 && ret == SD_RES_SUCCESS)
kick_recover();
return ret;
diff --git a/sheep/sheep_priv.h b/sheep/sheep_priv.h
index 8281149..5596215 100644
--- a/sheep/sheep_priv.h
+++ b/sheep/sheep_priv.h
@@ -442,7 +442,7 @@ int journal_write_config(const char *buf, size_t size);
int journal_remove_object(uint64_t oid);
/* md.c */
-void md_add_disk(char *path);
+bool md_add_disk(char *path);
uint64_t md_init_space(void);
char *get_object_path(uint64_t oid);
int md_handle_eio(char *);
--
1.7.9.5
More information about the sheepdog
mailing list