diff options
Diffstat (limited to 'api/src/glfs.c')
| -rw-r--r-- | api/src/glfs.c | 48 | 
1 files changed, 44 insertions, 4 deletions
diff --git a/api/src/glfs.c b/api/src/glfs.c index 2200358c651..4a41db937b1 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -20,7 +20,6 @@    - handle SEEK_END failure in _lseek()    - handle umask (per filesystem?)    - make itables LRU based -  - implement glfs_fini()    - 0-copy for readv/writev    - reconcile the open/creat mess  */ @@ -51,6 +50,7 @@  #include "glfs.h"  #include "glfs-internal.h"  #include "hashfn.h" +#include "rpc-clnt.h"  static gf_boolean_t @@ -595,7 +595,47 @@ glfs_init (struct glfs *fs)  int  glfs_fini (struct glfs *fs)  { -	int  ret = -1; - -	return ret; +        int  ret = -1; +        xlator_t *subvol = NULL; +        glusterfs_ctx_t *ctx = NULL; +        call_pool_t *call_pool = NULL; +        int countdown = 100; + +        ctx = fs->ctx; + +        if (ctx->mgmt) { +                rpc_clnt_disable (ctx->mgmt); +                ctx->mgmt = NULL; +        } + +        __glfs_entry_fs (fs); + +        call_pool = fs->ctx->pool; + +        while (countdown--) { +                /* give some time for background frames to finish */ +                if (!call_pool->cnt) +                        break; +                usleep (100000); +        } +        /* leaked frames may exist, we ignore */ + +        subvol = glfs_active_subvol (fs); +        if (subvol) { +                /* PARENT_DOWN within glfs_subvol_done() is issued only +                   on graph switch (new graph should activiate and +                   decrement the extra @winds count taken in glfs_graph_setup() + +                   Since we are explicitly destroying, PARENT_DOWN is necessary +                */ +                xlator_notify (subvol, GF_EVENT_PARENT_DOWN, subvol, 0); +                /* TBD: wait for CHILD_DOWN before exiting, in case of +                   asynchronous cleanup like graceful socket disconnection +                   in the future. +                */ +        } + +        glfs_subvol_done (fs, subvol); + +        return ret;  }  | 
