aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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/*