diff options
-rw-r--r-- | api/src/glfs-internal.h | 12 | ||||
-rw-r--r-- | api/src/glfs-master.c | 3 | ||||
-rw-r--r-- | api/src/glfs-resolve.c | 14 |
3 files changed, 23 insertions, 6 deletions
diff --git a/api/src/glfs-internal.h b/api/src/glfs-internal.h index c86071e3122..50f61cb5f71 100644 --- a/api/src/glfs-internal.h +++ b/api/src/glfs-internal.h @@ -187,8 +187,16 @@ struct glfs { int ret; int err; - xlator_t *active_subvol; - xlator_t *next_subvol; + xlator_t *active_subvol; /* active graph */ + xlator_t *mip_subvol; /* graph for which migration is in + * progress */ + xlator_t *next_subvol; /* Any new graph is put to + * next_subvol, the graph in + * next_subvol can either be move to + * mip_subvol (if any IO picks it up + * for migration), or be detroyed (if + * there is a new graph, and this was + * never picked for migration) */ xlator_t *old_subvol; char *oldvolfile; diff --git a/api/src/glfs-master.c b/api/src/glfs-master.c index 9f11a6a0c9c..00a9c929a04 100644 --- a/api/src/glfs-master.c +++ b/api/src/glfs-master.c @@ -40,7 +40,8 @@ graph_setup (struct glfs *fs, glusterfs_graph_t *graph) { if (new_subvol->switched || new_subvol == fs->active_subvol || - new_subvol == fs->next_subvol) { + new_subvol == fs->next_subvol || + new_subvol == fs->mip_subvol) { /* Spurious CHILD_UP event on old graph */ ret = 0; goto unlock; diff --git a/api/src/glfs-resolve.c b/api/src/glfs-resolve.c index 7bfd554fe8e..b84e5d8f58c 100644 --- a/api/src/glfs-resolve.c +++ b/api/src/glfs-resolve.c @@ -820,6 +820,13 @@ __glfs_migrate_openfds (struct glfs *fs, xlator_t *subvol) } +/* Note that though it appears that this function executes under fs->mutex, + * it is not fully executed under fs->mutex. i.e. there are functions like + * __glfs_first_lookup, __glfs_refresh_inode, __glfs_migrate_openfds which + * unlocks fs->mutex before sending any network fop, and reacquire fs->mutex + * once the fop is complete. Hence the variable read from fs at the start of the + * function need not have the same value by the end of the function. + */ xlator_t * __glfs_active_subvol (struct glfs *fs) { @@ -830,7 +837,8 @@ __glfs_active_subvol (struct glfs *fs) if (!fs->next_subvol) return fs->active_subvol; - new_subvol = fs->next_subvol; + new_subvol = fs->mip_subvol = fs->next_subvol; + fs->next_subvol = NULL; ret = __glfs_first_lookup (fs, new_subvol); if (ret) { @@ -864,8 +872,8 @@ __glfs_active_subvol (struct glfs *fs) should be atomic */ fs->old_subvol = fs->active_subvol; - fs->active_subvol = fs->next_subvol; - fs->next_subvol = NULL; + fs->active_subvol = fs->mip_subvol; + fs->mip_subvol = NULL; if (new_cwd) { __glfs_cwd_set (fs, new_cwd); |