Lines Matching refs:buffer

56 static int fill_read_buffer(struct file *file, struct configfs_buffer *buffer)
61 if (!buffer->page)
62 buffer->page = (char *) get_zeroed_page(GFP_KERNEL);
63 if (!buffer->page)
68 count = buffer->attr->show(buffer->item, buffer->page);
75 buffer->needs_read_fill = 0;
76 buffer->count = count;
83 struct configfs_buffer *buffer = file->private_data;
86 mutex_lock(&buffer->mutex);
87 if (buffer->needs_read_fill) {
88 retval = fill_read_buffer(file, buffer);
93 __func__, iov_iter_count(to), iocb->ki_pos, buffer->page);
94 if (iocb->ki_pos >= buffer->count)
96 retval = copy_to_iter(buffer->page + iocb->ki_pos,
97 buffer->count - iocb->ki_pos, to);
102 mutex_unlock(&buffer->mutex);
110 struct configfs_buffer *buffer = file->private_data;
114 mutex_lock(&buffer->mutex);
117 if (buffer->write_in_progress) {
121 buffer->read_in_progress = true;
123 if (buffer->needs_read_fill) {
127 len = buffer->bin_attr->read(buffer->item, NULL, 0);
137 if (buffer->cb_max_size && len > buffer->cb_max_size) {
142 buffer->bin_buffer = vmalloc(len);
143 if (buffer->bin_buffer == NULL) {
147 buffer->bin_buffer_size = len;
149 /* perform second read to fill buffer */
152 len = buffer->bin_attr->read(buffer->item,
153 buffer->bin_buffer, len);
159 vfree(buffer->bin_buffer);
160 buffer->bin_buffer_size = 0;
161 buffer->bin_buffer = NULL;
165 buffer->needs_read_fill = 0;
168 if (iocb->ki_pos >= buffer->bin_buffer_size)
170 retval = copy_to_iter(buffer->bin_buffer + iocb->ki_pos,
171 buffer->bin_buffer_size - iocb->ki_pos, to);
176 mutex_unlock(&buffer->mutex);
180 /* Fill @buffer with data coming from @from. */
181 static int fill_write_buffer(struct configfs_buffer *buffer,
186 if (!buffer->page)
187 buffer->page = (char *)__get_free_pages(GFP_KERNEL, 0);
188 if (!buffer->page)
191 copied = copy_from_iter(buffer->page, SIMPLE_ATTR_SIZE - 1, from);
192 buffer->needs_read_fill = 1;
195 buffer->page[copied] = 0;
200 flush_write_buffer(struct file *file, struct configfs_buffer *buffer, size_t count)
207 res = buffer->attr->store(buffer->item, buffer->page, count);
215 * write, so we don't support them. We expect the entire buffer to come on the
218 * you're changing, then write entire buffer back.
223 struct configfs_buffer *buffer = file->private_data;
226 mutex_lock(&buffer->mutex);
227 len = fill_write_buffer(buffer, from);
229 len = flush_write_buffer(file, buffer, len);
232 mutex_unlock(&buffer->mutex);
240 struct configfs_buffer *buffer = file->private_data;
245 mutex_lock(&buffer->mutex);
248 if (buffer->read_in_progress) {
252 buffer->write_in_progress = true;
254 /* buffer grows? */
256 if (end_offset > buffer->bin_buffer_size) {
257 if (buffer->cb_max_size && end_offset > buffer->cb_max_size) {
269 if (buffer->bin_buffer) {
270 memcpy(tbuf, buffer->bin_buffer,
271 buffer->bin_buffer_size);
272 vfree(buffer->bin_buffer);
276 memset(tbuf + buffer->bin_buffer_size, 0,
277 end_offset - buffer->bin_buffer_size);
278 buffer->bin_buffer = tbuf;
279 buffer->bin_buffer_size = end_offset;
282 len = copy_from_iter(buffer->bin_buffer + iocb->ki_pos,
283 buffer->bin_buffer_size - iocb->ki_pos, from);
286 mutex_unlock(&buffer->mutex);
295 struct configfs_buffer *buffer;
299 buffer = kzalloc(sizeof(struct configfs_buffer), GFP_KERNEL);
300 if (!buffer)
309 buffer->item = to_item(dentry->d_parent);
310 if (!buffer->item)
318 buffer->bin_attr = to_bin_attr(dentry);
319 buffer->cb_max_size = buffer->bin_attr->cb_max_size;
321 buffer->attr = attr;
324 buffer->owner = attr->ca_owner;
327 if (!try_module_get(buffer->owner))
331 if (!buffer->item->ci_type)
334 buffer->ops = buffer->item->ci_type->ct_item_ops;
345 if ((type & CONFIGFS_ITEM_BIN_ATTR) && !buffer->bin_attr->write)
358 if ((type & CONFIGFS_ITEM_BIN_ATTR) && !buffer->bin_attr->read)
362 mutex_init(&buffer->mutex);
363 buffer->needs_read_fill = 1;
364 buffer->read_in_progress = false;
365 buffer->write_in_progress = false;
366 file->private_data = buffer;
371 module_put(buffer->owner);
374 kfree(buffer);
381 struct configfs_buffer *buffer = filp->private_data;
383 module_put(buffer->owner);
384 if (buffer->page)
385 free_page((unsigned long)buffer->page);
386 mutex_destroy(&buffer->mutex);
387 kfree(buffer);
403 struct configfs_buffer *buffer = file->private_data;
405 if (buffer->write_in_progress) {
411 buffer->bin_attr->write(buffer->item,
412 buffer->bin_buffer,
413 buffer->bin_buffer_size);
418 vfree(buffer->bin_buffer);