summaryrefslogtreecommitdiff
path: root/fs/relayfs
diff options
context:
space:
mode:
authorTom Zanussi <zanussi@us.ibm.com>2006-01-08 01:02:28 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-08 20:13:50 -0800
commit08c541a7ade230883c48225f4ea406a0117e7c2f (patch)
tree23288deb876a8bdd07569d1eb8eacd38585c2932 /fs/relayfs
parent925ac8a2b637466ba0ad8dfaf7b49aa9a362502f (diff)
[PATCH] relayfs: add support for relay files in other filesystems
This patch adds a couple of callback functions that allow a client to hook into relay_open()/close() and supply the files that will be used to represent the channel buffers; the default implementation if no callbacks are defined is to create the files in relayfs. This is to support the creation and use of relay files in other filesystems such as debugfs, as implied by the fact that relayfs_file_operations are exported. Signed-off-by: Tom Zanussi <zanussi@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/relayfs')
-rw-r--r--fs/relayfs/buffers.c2
-rw-r--r--fs/relayfs/relay.c30
2 files changed, 29 insertions, 3 deletions
diff --git a/fs/relayfs/buffers.c b/fs/relayfs/buffers.c
index 667b529944c5..10187812771e 100644
--- a/fs/relayfs/buffers.c
+++ b/fs/relayfs/buffers.c
@@ -185,6 +185,6 @@ void relay_destroy_buf(struct rchan_buf *buf)
void relay_remove_buf(struct kref *kref)
{
struct rchan_buf *buf = container_of(kref, struct rchan_buf, kref);
- relayfs_remove(buf->dentry);
+ buf->chan->cb->remove_buf_file(buf->dentry);
relay_destroy_buf(buf);
}
diff --git a/fs/relayfs/relay.c b/fs/relayfs/relay.c
index a9cd5585c45c..b9bb56903272 100644
--- a/fs/relayfs/relay.c
+++ b/fs/relayfs/relay.c
@@ -80,11 +80,33 @@ static void buf_unmapped_default_callback(struct rchan_buf *buf,
{
}
+/*
+ * create_buf_file_create() default callback. Creates file to represent buf.
+ */
+static struct dentry *create_buf_file_default_callback(const char *filename,
+ struct dentry *parent,
+ int mode,
+ struct rchan_buf *buf)
+{
+ return relayfs_create_file(filename, parent, mode,
+ &relayfs_file_operations, buf);
+}
+
+/*
+ * remove_buf_file() default callback. Removes file representing relay buffer.
+ */
+static int remove_buf_file_default_callback(struct dentry *dentry)
+{
+ return relayfs_remove(dentry);
+}
+
/* relay channel default callbacks */
static struct rchan_callbacks default_channel_callbacks = {
.subbuf_start = subbuf_start_default_callback,
.buf_mapped = buf_mapped_default_callback,
.buf_unmapped = buf_unmapped_default_callback,
+ .create_buf_file = create_buf_file_default_callback,
+ .remove_buf_file = remove_buf_file_default_callback,
};
/**
@@ -176,8 +198,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan,
return NULL;
/* Create file in fs */
- dentry = relayfs_create_file(filename, parent, S_IRUSR,
- &relayfs_file_operations, buf);
+ dentry = chan->cb->create_buf_file(filename, parent, S_IRUSR,
+ buf);
if (!dentry) {
relay_destroy_buf(buf);
return NULL;
@@ -220,6 +242,10 @@ static inline void setup_callbacks(struct rchan *chan,
cb->buf_mapped = buf_mapped_default_callback;
if (!cb->buf_unmapped)
cb->buf_unmapped = buf_unmapped_default_callback;
+ if (!cb->create_buf_file)
+ cb->create_buf_file = create_buf_file_default_callback;
+ if (!cb->remove_buf_file)
+ cb->remove_buf_file = remove_buf_file_default_callback;
chan->cb = cb;
}