Lines Matching refs:buffer
69 static int fill_read_buffer(struct dentry * dentry, struct configfs_buffer * buffer) in fill_read_buffer() argument
76 if (!buffer->page) in fill_read_buffer()
77 buffer->page = (char *) get_zeroed_page(GFP_KERNEL); in fill_read_buffer()
78 if (!buffer->page) in fill_read_buffer()
81 count = attr->show(item, buffer->page); in fill_read_buffer()
85 buffer->needs_read_fill = 0; in fill_read_buffer()
86 buffer->count = count; in fill_read_buffer()
114 struct configfs_buffer * buffer = file->private_data; in configfs_read_file() local
117 mutex_lock(&buffer->mutex); in configfs_read_file()
118 if (buffer->needs_read_fill) { in configfs_read_file()
119 if ((retval = fill_read_buffer(file->f_path.dentry,buffer))) in configfs_read_file()
123 __func__, count, *ppos, buffer->page); in configfs_read_file()
124 retval = simple_read_from_buffer(buf, count, ppos, buffer->page, in configfs_read_file()
125 buffer->count); in configfs_read_file()
127 mutex_unlock(&buffer->mutex); in configfs_read_file()
155 struct configfs_buffer *buffer = file->private_data; in configfs_read_bin_file() local
162 mutex_lock(&buffer->mutex); in configfs_read_bin_file()
165 if (buffer->write_in_progress) { in configfs_read_bin_file()
169 buffer->read_in_progress = true; in configfs_read_bin_file()
171 if (buffer->needs_read_fill) { in configfs_read_bin_file()
185 buffer->bin_buffer = vmalloc(len); in configfs_read_bin_file()
186 if (buffer->bin_buffer == NULL) { in configfs_read_bin_file()
190 buffer->bin_buffer_size = len; in configfs_read_bin_file()
193 len = bin_attr->read(item, buffer->bin_buffer, len); in configfs_read_bin_file()
196 vfree(buffer->bin_buffer); in configfs_read_bin_file()
197 buffer->bin_buffer_size = 0; in configfs_read_bin_file()
198 buffer->bin_buffer = NULL; in configfs_read_bin_file()
202 buffer->needs_read_fill = 0; in configfs_read_bin_file()
205 retval = simple_read_from_buffer(buf, count, ppos, buffer->bin_buffer, in configfs_read_bin_file()
206 buffer->bin_buffer_size); in configfs_read_bin_file()
208 mutex_unlock(&buffer->mutex); in configfs_read_bin_file()
224 fill_write_buffer(struct configfs_buffer * buffer, const char __user * buf, size_t count) in fill_write_buffer() argument
228 if (!buffer->page) in fill_write_buffer()
229 buffer->page = (char *)__get_free_pages(GFP_KERNEL, 0); in fill_write_buffer()
230 if (!buffer->page) in fill_write_buffer()
235 error = copy_from_user(buffer->page,buf,count); in fill_write_buffer()
236 buffer->needs_read_fill = 1; in fill_write_buffer()
239 buffer->page[count] = 0; in fill_write_buffer()
256 flush_write_buffer(struct dentry * dentry, struct configfs_buffer * buffer, size_t count) in flush_write_buffer() argument
261 return attr->store(item, buffer->page, count); in flush_write_buffer()
285 struct configfs_buffer * buffer = file->private_data; in configfs_write_file() local
288 mutex_lock(&buffer->mutex); in configfs_write_file()
289 len = fill_write_buffer(buffer, buf, count); in configfs_write_file()
291 len = flush_write_buffer(file->f_path.dentry, buffer, len); in configfs_write_file()
294 mutex_unlock(&buffer->mutex); in configfs_write_file()
315 struct configfs_buffer *buffer = file->private_data; in configfs_write_bin_file() local
321 mutex_lock(&buffer->mutex); in configfs_write_bin_file()
324 if (buffer->read_in_progress) { in configfs_write_bin_file()
328 buffer->write_in_progress = true; in configfs_write_bin_file()
331 if (*ppos + count > buffer->bin_buffer_size) { in configfs_write_bin_file()
346 if (buffer->bin_buffer) { in configfs_write_bin_file()
347 memcpy(tbuf, buffer->bin_buffer, in configfs_write_bin_file()
348 buffer->bin_buffer_size); in configfs_write_bin_file()
349 vfree(buffer->bin_buffer); in configfs_write_bin_file()
353 memset(tbuf + buffer->bin_buffer_size, 0, in configfs_write_bin_file()
354 *ppos + count - buffer->bin_buffer_size); in configfs_write_bin_file()
355 buffer->bin_buffer = tbuf; in configfs_write_bin_file()
356 buffer->bin_buffer_size = *ppos + count; in configfs_write_bin_file()
359 len = simple_write_to_buffer(buffer->bin_buffer, in configfs_write_bin_file()
360 buffer->bin_buffer_size, ppos, buf, count); in configfs_write_bin_file()
362 mutex_unlock(&buffer->mutex); in configfs_write_bin_file()
371 struct configfs_buffer * buffer; in check_perm() local
425 buffer = kzalloc(sizeof(struct configfs_buffer),GFP_KERNEL); in check_perm()
426 if (!buffer) { in check_perm()
430 mutex_init(&buffer->mutex); in check_perm()
431 buffer->needs_read_fill = 1; in check_perm()
432 buffer->read_in_progress = false; in check_perm()
433 buffer->write_in_progress = false; in check_perm()
434 buffer->ops = ops; in check_perm()
435 file->private_data = buffer; in check_perm()
456 struct configfs_buffer * buffer = filp->private_data; in configfs_release() local
463 if (buffer) { in configfs_release()
464 if (buffer->page) in configfs_release()
465 free_page((unsigned long)buffer->page); in configfs_release()
466 mutex_destroy(&buffer->mutex); in configfs_release()
467 kfree(buffer); in configfs_release()
484 struct configfs_buffer *buffer = filp->private_data; in configfs_release_bin_file() local
491 buffer->read_in_progress = false; in configfs_release_bin_file()
493 if (buffer->write_in_progress) { in configfs_release_bin_file()
494 buffer->write_in_progress = false; in configfs_release_bin_file()
496 len = bin_attr->write(item, buffer->bin_buffer, in configfs_release_bin_file()
497 buffer->bin_buffer_size); in configfs_release_bin_file()
500 vfree(buffer->bin_buffer); in configfs_release_bin_file()
501 buffer->bin_buffer = NULL; in configfs_release_bin_file()
502 buffer->bin_buffer_size = 0; in configfs_release_bin_file()
503 buffer->needs_read_fill = 1; in configfs_release_bin_file()