0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/fs.h>
0012 #include <linux/module.h>
0013 #include <linux/slab.h>
0014 #include <linux/mutex.h>
0015 #include <linux/vmalloc.h>
0016 #include <linux/uaccess.h>
0017 #include <linux/uio.h>
0018 #include <linux/configfs.h>
0019 #include "configfs_internal.h"
0020
0021
0022
0023
0024
0025
0026
0027 #define SIMPLE_ATTR_SIZE 4096
0028
0029 struct configfs_buffer {
0030 size_t count;
0031 loff_t pos;
0032 char * page;
0033 struct configfs_item_operations * ops;
0034 struct mutex mutex;
0035 int needs_read_fill;
0036 bool read_in_progress;
0037 bool write_in_progress;
0038 char *bin_buffer;
0039 int bin_buffer_size;
0040 int cb_max_size;
0041 struct config_item *item;
0042 struct module *owner;
0043 union {
0044 struct configfs_attribute *attr;
0045 struct configfs_bin_attribute *bin_attr;
0046 };
0047 };
0048
0049 static inline struct configfs_fragment *to_frag(struct file *file)
0050 {
0051 struct configfs_dirent *sd = file->f_path.dentry->d_fsdata;
0052
0053 return sd->s_frag;
0054 }
0055
0056 static int fill_read_buffer(struct file *file, struct configfs_buffer *buffer)
0057 {
0058 struct configfs_fragment *frag = to_frag(file);
0059 ssize_t count = -ENOENT;
0060
0061 if (!buffer->page)
0062 buffer->page = (char *) get_zeroed_page(GFP_KERNEL);
0063 if (!buffer->page)
0064 return -ENOMEM;
0065
0066 down_read(&frag->frag_sem);
0067 if (!frag->frag_dead)
0068 count = buffer->attr->show(buffer->item, buffer->page);
0069 up_read(&frag->frag_sem);
0070
0071 if (count < 0)
0072 return count;
0073 if (WARN_ON_ONCE(count > (ssize_t)SIMPLE_ATTR_SIZE))
0074 return -EIO;
0075 buffer->needs_read_fill = 0;
0076 buffer->count = count;
0077 return 0;
0078 }
0079
0080 static ssize_t configfs_read_iter(struct kiocb *iocb, struct iov_iter *to)
0081 {
0082 struct file *file = iocb->ki_filp;
0083 struct configfs_buffer *buffer = file->private_data;
0084 ssize_t retval = 0;
0085
0086 mutex_lock(&buffer->mutex);
0087 if (buffer->needs_read_fill) {
0088 retval = fill_read_buffer(file, buffer);
0089 if (retval)
0090 goto out;
0091 }
0092 pr_debug("%s: count = %zd, pos = %lld, buf = %s\n",
0093 __func__, iov_iter_count(to), iocb->ki_pos, buffer->page);
0094 if (iocb->ki_pos >= buffer->count)
0095 goto out;
0096 retval = copy_to_iter(buffer->page + iocb->ki_pos,
0097 buffer->count - iocb->ki_pos, to);
0098 iocb->ki_pos += retval;
0099 if (retval == 0)
0100 retval = -EFAULT;
0101 out:
0102 mutex_unlock(&buffer->mutex);
0103 return retval;
0104 }
0105
0106 static ssize_t configfs_bin_read_iter(struct kiocb *iocb, struct iov_iter *to)
0107 {
0108 struct file *file = iocb->ki_filp;
0109 struct configfs_fragment *frag = to_frag(file);
0110 struct configfs_buffer *buffer = file->private_data;
0111 ssize_t retval = 0;
0112 ssize_t len;
0113
0114 mutex_lock(&buffer->mutex);
0115
0116
0117 if (buffer->write_in_progress) {
0118 retval = -ETXTBSY;
0119 goto out;
0120 }
0121 buffer->read_in_progress = true;
0122
0123 if (buffer->needs_read_fill) {
0124
0125 down_read(&frag->frag_sem);
0126 if (!frag->frag_dead)
0127 len = buffer->bin_attr->read(buffer->item, NULL, 0);
0128 else
0129 len = -ENOENT;
0130 up_read(&frag->frag_sem);
0131 if (len <= 0) {
0132 retval = len;
0133 goto out;
0134 }
0135
0136
0137 if (buffer->cb_max_size && len > buffer->cb_max_size) {
0138 retval = -EFBIG;
0139 goto out;
0140 }
0141
0142 buffer->bin_buffer = vmalloc(len);
0143 if (buffer->bin_buffer == NULL) {
0144 retval = -ENOMEM;
0145 goto out;
0146 }
0147 buffer->bin_buffer_size = len;
0148
0149
0150 down_read(&frag->frag_sem);
0151 if (!frag->frag_dead)
0152 len = buffer->bin_attr->read(buffer->item,
0153 buffer->bin_buffer, len);
0154 else
0155 len = -ENOENT;
0156 up_read(&frag->frag_sem);
0157 if (len < 0) {
0158 retval = len;
0159 vfree(buffer->bin_buffer);
0160 buffer->bin_buffer_size = 0;
0161 buffer->bin_buffer = NULL;
0162 goto out;
0163 }
0164
0165 buffer->needs_read_fill = 0;
0166 }
0167
0168 if (iocb->ki_pos >= buffer->bin_buffer_size)
0169 goto out;
0170 retval = copy_to_iter(buffer->bin_buffer + iocb->ki_pos,
0171 buffer->bin_buffer_size - iocb->ki_pos, to);
0172 iocb->ki_pos += retval;
0173 if (retval == 0)
0174 retval = -EFAULT;
0175 out:
0176 mutex_unlock(&buffer->mutex);
0177 return retval;
0178 }
0179
0180
0181 static int fill_write_buffer(struct configfs_buffer *buffer,
0182 struct iov_iter *from)
0183 {
0184 int copied;
0185
0186 if (!buffer->page)
0187 buffer->page = (char *)__get_free_pages(GFP_KERNEL, 0);
0188 if (!buffer->page)
0189 return -ENOMEM;
0190
0191 copied = copy_from_iter(buffer->page, SIMPLE_ATTR_SIZE - 1, from);
0192 buffer->needs_read_fill = 1;
0193
0194
0195 buffer->page[copied] = 0;
0196 return copied ? : -EFAULT;
0197 }
0198
0199 static int
0200 flush_write_buffer(struct file *file, struct configfs_buffer *buffer, size_t count)
0201 {
0202 struct configfs_fragment *frag = to_frag(file);
0203 int res = -ENOENT;
0204
0205 down_read(&frag->frag_sem);
0206 if (!frag->frag_dead)
0207 res = buffer->attr->store(buffer->item, buffer->page, count);
0208 up_read(&frag->frag_sem);
0209 return res;
0210 }
0211
0212
0213
0214
0215
0216
0217
0218
0219
0220 static ssize_t configfs_write_iter(struct kiocb *iocb, struct iov_iter *from)
0221 {
0222 struct file *file = iocb->ki_filp;
0223 struct configfs_buffer *buffer = file->private_data;
0224 int len;
0225
0226 mutex_lock(&buffer->mutex);
0227 len = fill_write_buffer(buffer, from);
0228 if (len > 0)
0229 len = flush_write_buffer(file, buffer, len);
0230 if (len > 0)
0231 iocb->ki_pos += len;
0232 mutex_unlock(&buffer->mutex);
0233 return len;
0234 }
0235
0236 static ssize_t configfs_bin_write_iter(struct kiocb *iocb,
0237 struct iov_iter *from)
0238 {
0239 struct file *file = iocb->ki_filp;
0240 struct configfs_buffer *buffer = file->private_data;
0241 void *tbuf = NULL;
0242 size_t end_offset;
0243 ssize_t len;
0244
0245 mutex_lock(&buffer->mutex);
0246
0247
0248 if (buffer->read_in_progress) {
0249 len = -ETXTBSY;
0250 goto out;
0251 }
0252 buffer->write_in_progress = true;
0253
0254
0255 end_offset = iocb->ki_pos + iov_iter_count(from);
0256 if (end_offset > buffer->bin_buffer_size) {
0257 if (buffer->cb_max_size && end_offset > buffer->cb_max_size) {
0258 len = -EFBIG;
0259 goto out;
0260 }
0261
0262 tbuf = vmalloc(end_offset);
0263 if (tbuf == NULL) {
0264 len = -ENOMEM;
0265 goto out;
0266 }
0267
0268
0269 if (buffer->bin_buffer) {
0270 memcpy(tbuf, buffer->bin_buffer,
0271 buffer->bin_buffer_size);
0272 vfree(buffer->bin_buffer);
0273 }
0274
0275
0276 memset(tbuf + buffer->bin_buffer_size, 0,
0277 end_offset - buffer->bin_buffer_size);
0278 buffer->bin_buffer = tbuf;
0279 buffer->bin_buffer_size = end_offset;
0280 }
0281
0282 len = copy_from_iter(buffer->bin_buffer + iocb->ki_pos,
0283 buffer->bin_buffer_size - iocb->ki_pos, from);
0284 iocb->ki_pos += len;
0285 out:
0286 mutex_unlock(&buffer->mutex);
0287 return len ? : -EFAULT;
0288 }
0289
0290 static int __configfs_open_file(struct inode *inode, struct file *file, int type)
0291 {
0292 struct dentry *dentry = file->f_path.dentry;
0293 struct configfs_fragment *frag = to_frag(file);
0294 struct configfs_attribute *attr;
0295 struct configfs_buffer *buffer;
0296 int error;
0297
0298 error = -ENOMEM;
0299 buffer = kzalloc(sizeof(struct configfs_buffer), GFP_KERNEL);
0300 if (!buffer)
0301 goto out;
0302
0303 error = -ENOENT;
0304 down_read(&frag->frag_sem);
0305 if (unlikely(frag->frag_dead))
0306 goto out_free_buffer;
0307
0308 error = -EINVAL;
0309 buffer->item = to_item(dentry->d_parent);
0310 if (!buffer->item)
0311 goto out_free_buffer;
0312
0313 attr = to_attr(dentry);
0314 if (!attr)
0315 goto out_free_buffer;
0316
0317 if (type & CONFIGFS_ITEM_BIN_ATTR) {
0318 buffer->bin_attr = to_bin_attr(dentry);
0319 buffer->cb_max_size = buffer->bin_attr->cb_max_size;
0320 } else {
0321 buffer->attr = attr;
0322 }
0323
0324 buffer->owner = attr->ca_owner;
0325
0326 error = -ENODEV;
0327 if (!try_module_get(buffer->owner))
0328 goto out_free_buffer;
0329
0330 error = -EACCES;
0331 if (!buffer->item->ci_type)
0332 goto out_put_module;
0333
0334 buffer->ops = buffer->item->ci_type->ct_item_ops;
0335
0336
0337
0338
0339
0340 if (file->f_mode & FMODE_WRITE) {
0341 if (!(inode->i_mode & S_IWUGO))
0342 goto out_put_module;
0343 if ((type & CONFIGFS_ITEM_ATTR) && !attr->store)
0344 goto out_put_module;
0345 if ((type & CONFIGFS_ITEM_BIN_ATTR) && !buffer->bin_attr->write)
0346 goto out_put_module;
0347 }
0348
0349
0350
0351
0352
0353 if (file->f_mode & FMODE_READ) {
0354 if (!(inode->i_mode & S_IRUGO))
0355 goto out_put_module;
0356 if ((type & CONFIGFS_ITEM_ATTR) && !attr->show)
0357 goto out_put_module;
0358 if ((type & CONFIGFS_ITEM_BIN_ATTR) && !buffer->bin_attr->read)
0359 goto out_put_module;
0360 }
0361
0362 mutex_init(&buffer->mutex);
0363 buffer->needs_read_fill = 1;
0364 buffer->read_in_progress = false;
0365 buffer->write_in_progress = false;
0366 file->private_data = buffer;
0367 up_read(&frag->frag_sem);
0368 return 0;
0369
0370 out_put_module:
0371 module_put(buffer->owner);
0372 out_free_buffer:
0373 up_read(&frag->frag_sem);
0374 kfree(buffer);
0375 out:
0376 return error;
0377 }
0378
0379 static int configfs_release(struct inode *inode, struct file *filp)
0380 {
0381 struct configfs_buffer *buffer = filp->private_data;
0382
0383 module_put(buffer->owner);
0384 if (buffer->page)
0385 free_page((unsigned long)buffer->page);
0386 mutex_destroy(&buffer->mutex);
0387 kfree(buffer);
0388 return 0;
0389 }
0390
0391 static int configfs_open_file(struct inode *inode, struct file *filp)
0392 {
0393 return __configfs_open_file(inode, filp, CONFIGFS_ITEM_ATTR);
0394 }
0395
0396 static int configfs_open_bin_file(struct inode *inode, struct file *filp)
0397 {
0398 return __configfs_open_file(inode, filp, CONFIGFS_ITEM_BIN_ATTR);
0399 }
0400
0401 static int configfs_release_bin_file(struct inode *inode, struct file *file)
0402 {
0403 struct configfs_buffer *buffer = file->private_data;
0404
0405 if (buffer->write_in_progress) {
0406 struct configfs_fragment *frag = to_frag(file);
0407
0408 down_read(&frag->frag_sem);
0409 if (!frag->frag_dead) {
0410
0411 buffer->bin_attr->write(buffer->item,
0412 buffer->bin_buffer,
0413 buffer->bin_buffer_size);
0414 }
0415 up_read(&frag->frag_sem);
0416 }
0417
0418 vfree(buffer->bin_buffer);
0419
0420 configfs_release(inode, file);
0421 return 0;
0422 }
0423
0424
0425 const struct file_operations configfs_file_operations = {
0426 .read_iter = configfs_read_iter,
0427 .write_iter = configfs_write_iter,
0428 .llseek = generic_file_llseek,
0429 .open = configfs_open_file,
0430 .release = configfs_release,
0431 };
0432
0433 const struct file_operations configfs_bin_file_operations = {
0434 .read_iter = configfs_bin_read_iter,
0435 .write_iter = configfs_bin_write_iter,
0436 .llseek = NULL,
0437 .open = configfs_open_bin_file,
0438 .release = configfs_release_bin_file,
0439 };
0440
0441
0442
0443
0444
0445
0446
0447 int configfs_create_file(struct config_item * item, const struct configfs_attribute * attr)
0448 {
0449 struct dentry *dir = item->ci_dentry;
0450 struct configfs_dirent *parent_sd = dir->d_fsdata;
0451 umode_t mode = (attr->ca_mode & S_IALLUGO) | S_IFREG;
0452 int error = 0;
0453
0454 inode_lock_nested(d_inode(dir), I_MUTEX_NORMAL);
0455 error = configfs_make_dirent(parent_sd, NULL, (void *) attr, mode,
0456 CONFIGFS_ITEM_ATTR, parent_sd->s_frag);
0457 inode_unlock(d_inode(dir));
0458
0459 return error;
0460 }
0461
0462
0463
0464
0465
0466
0467
0468 int configfs_create_bin_file(struct config_item *item,
0469 const struct configfs_bin_attribute *bin_attr)
0470 {
0471 struct dentry *dir = item->ci_dentry;
0472 struct configfs_dirent *parent_sd = dir->d_fsdata;
0473 umode_t mode = (bin_attr->cb_attr.ca_mode & S_IALLUGO) | S_IFREG;
0474 int error = 0;
0475
0476 inode_lock_nested(dir->d_inode, I_MUTEX_NORMAL);
0477 error = configfs_make_dirent(parent_sd, NULL, (void *) bin_attr, mode,
0478 CONFIGFS_ITEM_BIN_ATTR, parent_sd->s_frag);
0479 inode_unlock(dir->d_inode);
0480
0481 return error;
0482 }