aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Zanussi <zanussi@us.ibm.com>2006-01-08 04:02:28 -0500
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-08 23:13:50 -0500
commit08c541a7ade230883c48225f4ea406a0117e7c2f (patch)
tree23288deb876a8bdd07569d1eb8eacd38585c2932
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>
-rw-r--r--fs/relayfs/buffers.c2
-rw-r--r--fs/relayfs/relay.c30
-rw-r--r--include/linux/relayfs_fs.h34
3 files changed, 63 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)
185void relay_remove_buf(struct kref *kref) 185void relay_remove_buf(struct kref *kref)
186{ 186{
187 struct rchan_buf *buf = container_of(kref, struct rchan_buf, kref); 187 struct rchan_buf *buf = container_of(kref, struct rchan_buf, kref);
188 relayfs_remove(buf->dentry); 188 buf->chan->cb->remove_buf_file(buf->dentry);
189 relay_destroy_buf(buf); 189 relay_destroy_buf(buf);
190} 190}
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,
80{ 80{
81} 81}
82 82
83/*
84 * create_buf_file_create() default callback. Creates file to represent buf.
85 */
86static struct dentry *create_buf_file_default_callback(const char *filename,
87 struct dentry *parent,
88 int mode,
89 struct rchan_buf *buf)
90{
91 return relayfs_create_file(filename, parent, mode,
92 &relayfs_file_operations, buf);
93}
94
95/*
96 * remove_buf_file() default callback. Removes file representing relay buffer.
97 */
98static int remove_buf_file_default_callback(struct dentry *dentry)
99{
100 return relayfs_remove(dentry);
101}
102
83/* relay channel default callbacks */ 103/* relay channel default callbacks */
84static struct rchan_callbacks default_channel_callbacks = { 104static struct rchan_callbacks default_channel_callbacks = {
85 .subbuf_start = subbuf_start_default_callback, 105 .subbuf_start = subbuf_start_default_callback,
86 .buf_mapped = buf_mapped_default_callback, 106 .buf_mapped = buf_mapped_default_callback,
87 .buf_unmapped = buf_unmapped_default_callback, 107 .buf_unmapped = buf_unmapped_default_callback,
108 .create_buf_file = create_buf_file_default_callback,
109 .remove_buf_file = remove_buf_file_default_callback,
88}; 110};
89 111
90/** 112/**
@@ -176,8 +198,8 @@ static struct rchan_buf *relay_open_buf(struct rchan *chan,
176 return NULL; 198 return NULL;
177 199
178 /* Create file in fs */ 200 /* Create file in fs */
179 dentry = relayfs_create_file(filename, parent, S_IRUSR, 201 dentry = chan->cb->create_buf_file(filename, parent, S_IRUSR,
180 &relayfs_file_operations, buf); 202 buf);
181 if (!dentry) { 203 if (!dentry) {
182 relay_destroy_buf(buf); 204 relay_destroy_buf(buf);
183 return NULL; 205 return NULL;
@@ -220,6 +242,10 @@ static inline void setup_callbacks(struct rchan *chan,
220 cb->buf_mapped = buf_mapped_default_callback; 242 cb->buf_mapped = buf_mapped_default_callback;
221 if (!cb->buf_unmapped) 243 if (!cb->buf_unmapped)
222 cb->buf_unmapped = buf_unmapped_default_callback; 244 cb->buf_unmapped = buf_unmapped_default_callback;
245 if (!cb->create_buf_file)
246 cb->create_buf_file = create_buf_file_default_callback;
247 if (!cb->remove_buf_file)
248 cb->remove_buf_file = remove_buf_file_default_callback;
223 chan->cb = cb; 249 chan->cb = cb;
224} 250}
225 251
diff --git a/include/linux/relayfs_fs.h b/include/linux/relayfs_fs.h
index 8200ecbe6e0f..8c2177105857 100644
--- a/include/linux/relayfs_fs.h
+++ b/include/linux/relayfs_fs.h
@@ -110,6 +110,40 @@ struct rchan_callbacks
110 */ 110 */
111 void (*buf_unmapped)(struct rchan_buf *buf, 111 void (*buf_unmapped)(struct rchan_buf *buf,
112 struct file *filp); 112 struct file *filp);
113 /*
114 * create_buf_file - create file to represent a relayfs channel buffer
115 * @filename: the name of the file to create
116 * @parent: the parent of the file to create
117 * @mode: the mode of the file to create
118 * @buf: the channel buffer
119 *
120 * Called during relay_open(), once for each per-cpu buffer,
121 * to allow the client to create a file to be used to
122 * represent the corresponding channel buffer. If the file is
123 * created outside of relayfs, the parent must also exist in
124 * that filesystem.
125 *
126 * The callback should return the dentry of the file created
127 * to represent the relay buffer.
128 *
129 * See Documentation/filesystems/relayfs.txt for more info.
130 */
131 struct dentry *(*create_buf_file)(const char *filename,
132 struct dentry *parent,
133 int mode,
134 struct rchan_buf *buf);
135
136 /*
137 * remove_buf_file - remove file representing a relayfs channel buffer
138 * @dentry: the dentry of the file to remove
139 *
140 * Called during relay_close(), once for each per-cpu buffer,
141 * to allow the client to remove a file used to represent a
142 * channel buffer.
143 *
144 * The callback should return 0 if successful, negative if not.
145 */
146 int (*remove_buf_file)(struct dentry *dentry);
113}; 147};
114 148
115/* 149/*