diff options
author | Jeff Darcy <jdarcy@redhat.com> | 2015-03-10 20:14:47 -0400 |
---|---|---|
committer | Vijay Bellur <vbellur@redhat.com> | 2015-03-17 07:02:15 -0700 |
commit | 0d2bed70faed3c63f25ed9269dc55562973ef9b7 (patch) | |
tree | fee1995e88b7ae19d1cb27cf437ab76583d111e6 /api | |
parent | 6b3704990257643da54100d8581856a7d2c72f86 (diff) |
every/where: add GF_FOP_IPC for inter-translator communication
Several features - e.g. encryption, erasure codes, or NSR - involve
multiple cooperating translators which sometimes need a "private" means
of communication amongst themselves. Historically we've used virtual or
synthetic xattrs, but that's not very elegant and clutters up the
getxattr/setxattr path which must also handle real xattr requests. This
new fop should address that.
The only argument is an int32_t "op" which should be recognized by the
target translator. It is recommended that translators using these
feature follow some convention regarding the ops that they define, to
avoid conflicts. Using a hash of the target translator's type string as
a base for a series of ops would probably be a good start. Any other
information can be passed in both directions using xdata.
The default behavior for this fop, as with any other, is to pass through
to FIRST_CHILD. That makes use of this fop "transparent" to other
translators that were written before it existed, but it also means that
it only really works with pass-through translators. If a routing
translator (such as DHT) or a fan-out translator (such as AFR) is
involved, the IPC might not reach its intended destination unless those
translators are modified to forward IPC fops along all paths.
If an IPC gets all the way to storage/posix it is considered an error,
much like an uncaught exception. We don't actually *do* anything in
that case, but we do log it send back an EOPNOTSUPP error. This makes
the "unrecognized opcode" condition distinguishable from the "no IPC
support" condition (which would yield an RPC error instead) so clients
can probe for the presence of a handler for their own favorite opcode
and either use that or use old-school xattrs depending on the result.
BUG: 1158628
Signed-off-by: Venky Shankar <vshankar@redhat.com>
Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Change-Id: I84af1b17babe5b30ec03ecf027ae37d09b873968
Reviewed-on: http://review.gluster.org/8812
Reviewed-by: Vijay Bellur <vbellur@redhat.com>
Diffstat (limited to 'api')
-rw-r--r-- | api/src/gfapi.aliases | 2 | ||||
-rw-r--r-- | api/src/gfapi.map | 7 | ||||
-rw-r--r-- | api/src/glfs.c | 24 | ||||
-rw-r--r-- | api/src/glfs.h | 8 |
4 files changed, 40 insertions, 1 deletions
diff --git a/api/src/gfapi.aliases b/api/src/gfapi.aliases index 6c0a6413098..2ab7d443eb5 100644 --- a/api/src/gfapi.aliases +++ b/api/src/gfapi.aliases @@ -125,6 +125,8 @@ _pub_glfs_h_removexattrs _glfs_h_removexattrs$GFAPI_3.5.1 _pub_glfs_get_volfile _glfs_get_volfile$GFAPI_3.6.0 _pub_glfs_h_access _glfs_h_access$GFAPI_3.6.0 +_pub_glfs_ipc _glfs_ipc$GFAPI_3.7.0 + _priv_glfs_free_from_ctx _glfs_free_from_ctx$GFAPI_PRIVATE_3.7.0 _priv_glfs_new_from_ctx _glfs_new_from_ctx$GFAPI_PRIVATE_3.7.0 _priv_glfs_resolve _glfs_resolve$GFAPI_PRIVATE_3.7.0 diff --git a/api/src/gfapi.map b/api/src/gfapi.map index a29f392dc53..39202e1883f 100644 --- a/api/src/gfapi.map +++ b/api/src/gfapi.map @@ -145,10 +145,15 @@ GFAPI_3.6.0 { glfs_h_access; } GFAPI_3.5.1; +GFAPI_3.7.0 { + global: + glfs_ipc; +} GFAPI_3.6.0; + GFAPI_PRIVATE_3.7.0 { global: glfs_free_from_ctx; glfs_new_from_ctx; glfs_resolve; -} GFAPI_3.6.0; +} GFAPI_3.7.0; diff --git a/api/src/glfs.c b/api/src/glfs.c index 421374d9731..f23481bbb4c 100644 --- a/api/src/glfs.c +++ b/api/src/glfs.c @@ -1067,3 +1067,27 @@ pub_glfs_get_volfile (struct glfs *fs, void *buf, size_t len) GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_get_volfile, 3.6.0); +int +pub_glfs_ipc (struct glfs *fs, int opcode) +{ + xlator_t *subvol = NULL; + int ret; + + __glfs_entry_fs (fs); + + subvol = glfs_active_subvol (fs); + if (!subvol) { + ret = -1; + errno = EIO; + goto out; + } + + ret = syncop_ipc (subvol, opcode, NULL, NULL); + DECODE_SYNCOP_ERR (ret); + +out: + glfs_subvol_done (fs, subvol); + return ret; +} + +GFAPI_SYMVER_PUBLIC_DEFAULT(glfs_ipc, 3.7.0); diff --git a/api/src/glfs.h b/api/src/glfs.h index 3ef822ed3f1..9ee772741e6 100644 --- a/api/src/glfs.h +++ b/api/src/glfs.h @@ -760,6 +760,14 @@ int glfs_posix_lock (glfs_fd_t *fd, int cmd, struct flock *flock) __THROW glfs_fd_t *glfs_dup (glfs_fd_t *fd) __THROW GFAPI_PUBLIC(glfs_dup, 3.4.0); +/* + * No xdata support for now. Nobody needs this call at all yet except for the + * test script, and that doesn't need xdata. Adding dict_t support and a new + * header-file requirement doesn't seem worth it until the need is greater. + */ +int glfs_ipc (glfs_fd_t *fd, int cmd) __THROW + GFAPI_PUBLIC(glfs_ipc, 3.7.0); + __END_DECLS #endif /* !_GLFS_H */ |