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