summaryrefslogtreecommitdiffstats
path: root/api/src
diff options
context:
space:
mode:
authorJeff Darcy <jdarcy@redhat.com>2014-02-11 00:19:57 +0000
committerJeff Darcy <jdarcy@redhat.com>2014-03-11 17:50:53 +0000
commit6eaa28f976dce3d5dc9d7fbe08a14579bb021ef4 (patch)
tree5e60702b4dd90ae9f021adc95bd6c1323df444b6 /api/src
parent93882c439af4badfc2f1b5a9edc99eeb4a7aa93c (diff)
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 flag it as an error in the log. Change-Id: I7f37c9247ee35536f8136c7aea758e6fe04616c4 Signed-off-by: Jeff Darcy <jdarcy@redhat.com>
Diffstat (limited to 'api/src')
-rw-r--r--api/src/glfs-fops.c23
-rw-r--r--api/src/glfs.h2
2 files changed, 25 insertions, 0 deletions
diff --git a/api/src/glfs-fops.c b/api/src/glfs-fops.c
index 326530578..37e8d22d8 100644
--- a/api/src/glfs-fops.c
+++ b/api/src/glfs-fops.c
@@ -3166,6 +3166,29 @@ out:
}
int
+glfs_ipc (struct glfs *fs, int32_t op)
+{
+ int ret = -1;
+ xlator_t *subvol = NULL;
+
+ __glfs_entry_fs (fs);
+
+ subvol = glfs_active_subvol (fs);
+ if (!subvol) {
+ ret = -1;
+ errno = EIO;
+ goto out;
+ }
+
+ ret = syncop_ipc (subvol, op);
+ DECODE_SYNCOP_ERR (ret);
+
+out:
+ glfs_subvol_done (fs, subvol);
+ return ret;
+}
+
+int
glfs_chdir (struct glfs *fs, const char *path)
{
int ret = -1;
diff --git a/api/src/glfs.h b/api/src/glfs.h
index d79385792..9feaa8015 100644
--- a/api/src/glfs.h
+++ b/api/src/glfs.h
@@ -639,6 +639,8 @@ glfs_setattr (struct glfs *fs, const char *path, struct iatt *iatt,
int
glfs_fsetattr (struct glfs_fd *glfd, struct iatt *iatt, int valid);
+int glfs_ipc (struct glfs *fs, int32_t op) __THROW;
+