file.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * file.c - operations for regular (text) files.
  4. *
  5. * Based on sysfs:
  6. * sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
  7. *
  8. * configfs Copyright (C) 2005 Oracle. All rights reserved.
  9. */
  10. #include <linux/fs.h>
  11. #include <linux/module.h>
  12. #include <linux/slab.h>
  13. #include <linux/mutex.h>
  14. #include <linux/vmalloc.h>
  15. #include <linux/uaccess.h>
  16. #include <linux/uio.h>
  17. #include <linux/configfs.h>
  18. #include "configfs_internal.h"
  19. /*
  20. * A simple attribute can only be 4096 characters. Why 4k? Because the
  21. * original code limited it to PAGE_SIZE. That's a bad idea, though,
  22. * because an attribute of 16k on ia64 won't work on x86. So we limit to
  23. * 4k, our minimum common page size.
  24. */
  25. #define SIMPLE_ATTR_SIZE 4096
  26. struct configfs_buffer {
  27. size_t count;
  28. loff_t pos;
  29. char * page;
  30. struct configfs_item_operations * ops;
  31. struct mutex mutex;
  32. int needs_read_fill;
  33. bool read_in_progress;
  34. bool write_in_progress;
  35. char *bin_buffer;
  36. int bin_buffer_size;
  37. int cb_max_size;
  38. struct config_item *item;
  39. struct module *owner;
  40. union {
  41. struct configfs_attribute *attr;
  42. struct configfs_bin_attribute *bin_attr;
  43. };
  44. };
  45. static inline struct configfs_fragment *to_frag(struct file *file)
  46. {
  47. struct configfs_dirent *sd = file->f_path.dentry->d_fsdata;
  48. return sd->s_frag;
  49. }
  50. static int fill_read_buffer(struct file *file, struct configfs_buffer *buffer)
  51. {
  52. struct configfs_fragment *frag = to_frag(file);
  53. ssize_t count = -ENOENT;
  54. if (!buffer->page)
  55. buffer->page = (char *) get_zeroed_page(GFP_KERNEL);
  56. if (!buffer->page)
  57. return -ENOMEM;
  58. down_read(&frag->frag_sem);
  59. if (!frag->frag_dead)
  60. count = buffer->attr->show(buffer->item, buffer->page);
  61. up_read(&frag->frag_sem);
  62. if (count < 0)
  63. return count;
  64. if (WARN_ON_ONCE(count > (ssize_t)SIMPLE_ATTR_SIZE))
  65. return -EIO;
  66. buffer->needs_read_fill = 0;
  67. buffer->count = count;
  68. return 0;
  69. }
  70. static ssize_t configfs_read_iter(struct kiocb *iocb, struct iov_iter *to)
  71. {
  72. struct file *file = iocb->ki_filp;
  73. struct configfs_buffer *buffer = file->private_data;
  74. ssize_t retval = 0;
  75. mutex_lock(&buffer->mutex);
  76. if (buffer->needs_read_fill) {
  77. retval = fill_read_buffer(file, buffer);
  78. if (retval)
  79. goto out;
  80. }
  81. pr_debug("%s: count = %zd, pos = %lld, buf = %s\n",
  82. __func__, iov_iter_count(to), iocb->ki_pos, buffer->page);
  83. if (iocb->ki_pos >= buffer->count)
  84. goto out;
  85. retval = copy_to_iter(buffer->page + iocb->ki_pos,
  86. buffer->count - iocb->ki_pos, to);
  87. iocb->ki_pos += retval;
  88. if (retval == 0)
  89. retval = -EFAULT;
  90. out:
  91. mutex_unlock(&buffer->mutex);
  92. return retval;
  93. }
  94. static ssize_t configfs_bin_read_iter(struct kiocb *iocb, struct iov_iter *to)
  95. {
  96. struct file *file = iocb->ki_filp;
  97. struct configfs_fragment *frag = to_frag(file);
  98. struct configfs_buffer *buffer = file->private_data;
  99. ssize_t retval = 0;
  100. ssize_t len;
  101. mutex_lock(&buffer->mutex);
  102. /* we don't support switching read/write modes */
  103. if (buffer->write_in_progress) {
  104. retval = -ETXTBSY;
  105. goto out;
  106. }
  107. buffer->read_in_progress = true;
  108. if (buffer->needs_read_fill) {
  109. /* perform first read with buf == NULL to get extent */
  110. down_read(&frag->frag_sem);
  111. if (!frag->frag_dead)
  112. len = buffer->bin_attr->read(buffer->item, NULL, 0);
  113. else
  114. len = -ENOENT;
  115. up_read(&frag->frag_sem);
  116. if (len <= 0) {
  117. retval = len;
  118. goto out;
  119. }
  120. /* do not exceed the maximum value */
  121. if (buffer->cb_max_size && len > buffer->cb_max_size) {
  122. retval = -EFBIG;
  123. goto out;
  124. }
  125. buffer->bin_buffer = vmalloc(len);
  126. if (buffer->bin_buffer == NULL) {
  127. retval = -ENOMEM;
  128. goto out;
  129. }
  130. buffer->bin_buffer_size = len;
  131. /* perform second read to fill buffer */
  132. down_read(&frag->frag_sem);
  133. if (!frag->frag_dead)
  134. len = buffer->bin_attr->read(buffer->item,
  135. buffer->bin_buffer, len);
  136. else
  137. len = -ENOENT;
  138. up_read(&frag->frag_sem);
  139. if (len < 0) {
  140. retval = len;
  141. vfree(buffer->bin_buffer);
  142. buffer->bin_buffer_size = 0;
  143. buffer->bin_buffer = NULL;
  144. goto out;
  145. }
  146. buffer->needs_read_fill = 0;
  147. }
  148. if (iocb->ki_pos >= buffer->bin_buffer_size)
  149. goto out;
  150. retval = copy_to_iter(buffer->bin_buffer + iocb->ki_pos,
  151. buffer->bin_buffer_size - iocb->ki_pos, to);
  152. iocb->ki_pos += retval;
  153. if (retval == 0)
  154. retval = -EFAULT;
  155. out:
  156. mutex_unlock(&buffer->mutex);
  157. return retval;
  158. }
  159. /* Fill @buffer with data coming from @from. */
  160. static int fill_write_buffer(struct configfs_buffer *buffer,
  161. struct iov_iter *from)
  162. {
  163. int copied;
  164. if (!buffer->page)
  165. buffer->page = (char *)__get_free_pages(GFP_KERNEL, 0);
  166. if (!buffer->page)
  167. return -ENOMEM;
  168. copied = copy_from_iter(buffer->page, SIMPLE_ATTR_SIZE - 1, from);
  169. buffer->needs_read_fill = 1;
  170. /* if buf is assumed to contain a string, terminate it by \0,
  171. * so e.g. sscanf() can scan the string easily */
  172. buffer->page[copied] = 0;
  173. return copied ? : -EFAULT;
  174. }
  175. static int
  176. flush_write_buffer(struct file *file, struct configfs_buffer *buffer, size_t count)
  177. {
  178. struct configfs_fragment *frag = to_frag(file);
  179. int res = -ENOENT;
  180. down_read(&frag->frag_sem);
  181. if (!frag->frag_dead)
  182. res = buffer->attr->store(buffer->item, buffer->page, count);
  183. up_read(&frag->frag_sem);
  184. return res;
  185. }
  186. /*
  187. * There is no easy way for us to know if userspace is only doing a partial
  188. * write, so we don't support them. We expect the entire buffer to come on the
  189. * first write.
  190. * Hint: if you're writing a value, first read the file, modify only the value
  191. * you're changing, then write entire buffer back.
  192. */
  193. static ssize_t configfs_write_iter(struct kiocb *iocb, struct iov_iter *from)
  194. {
  195. struct file *file = iocb->ki_filp;
  196. struct configfs_buffer *buffer = file->private_data;
  197. int len;
  198. mutex_lock(&buffer->mutex);
  199. len = fill_write_buffer(buffer, from);
  200. if (len > 0)
  201. len = flush_write_buffer(file, buffer, len);
  202. if (len > 0)
  203. iocb->ki_pos += len;
  204. mutex_unlock(&buffer->mutex);
  205. return len;
  206. }
  207. static ssize_t configfs_bin_write_iter(struct kiocb *iocb,
  208. struct iov_iter *from)
  209. {
  210. struct file *file = iocb->ki_filp;
  211. struct configfs_buffer *buffer = file->private_data;
  212. void *tbuf = NULL;
  213. size_t end_offset;
  214. ssize_t len;
  215. mutex_lock(&buffer->mutex);
  216. /* we don't support switching read/write modes */
  217. if (buffer->read_in_progress) {
  218. len = -ETXTBSY;
  219. goto out;
  220. }
  221. buffer->write_in_progress = true;
  222. /* buffer grows? */
  223. end_offset = iocb->ki_pos + iov_iter_count(from);
  224. if (end_offset > buffer->bin_buffer_size) {
  225. if (buffer->cb_max_size && end_offset > buffer->cb_max_size) {
  226. len = -EFBIG;
  227. goto out;
  228. }
  229. tbuf = vmalloc(end_offset);
  230. if (tbuf == NULL) {
  231. len = -ENOMEM;
  232. goto out;
  233. }
  234. /* copy old contents */
  235. if (buffer->bin_buffer) {
  236. memcpy(tbuf, buffer->bin_buffer,
  237. buffer->bin_buffer_size);
  238. vfree(buffer->bin_buffer);
  239. }
  240. /* clear the new area */
  241. memset(tbuf + buffer->bin_buffer_size, 0,
  242. end_offset - buffer->bin_buffer_size);
  243. buffer->bin_buffer = tbuf;
  244. buffer->bin_buffer_size = end_offset;
  245. }
  246. len = copy_from_iter(buffer->bin_buffer + iocb->ki_pos,
  247. buffer->bin_buffer_size - iocb->ki_pos, from);
  248. iocb->ki_pos += len;
  249. out:
  250. mutex_unlock(&buffer->mutex);
  251. return len ? : -EFAULT;
  252. }
  253. static int __configfs_open_file(struct inode *inode, struct file *file, int type)
  254. {
  255. struct dentry *dentry = file->f_path.dentry;
  256. struct configfs_fragment *frag = to_frag(file);
  257. struct configfs_attribute *attr;
  258. struct configfs_buffer *buffer;
  259. int error;
  260. error = -ENOMEM;
  261. buffer = kzalloc(sizeof(struct configfs_buffer), GFP_KERNEL);
  262. if (!buffer)
  263. goto out;
  264. error = -ENOENT;
  265. down_read(&frag->frag_sem);
  266. if (unlikely(frag->frag_dead))
  267. goto out_free_buffer;
  268. error = -EINVAL;
  269. buffer->item = to_item(dentry->d_parent);
  270. if (!buffer->item)
  271. goto out_free_buffer;
  272. attr = to_attr(dentry);
  273. if (!attr)
  274. goto out_free_buffer;
  275. if (type & CONFIGFS_ITEM_BIN_ATTR) {
  276. buffer->bin_attr = to_bin_attr(dentry);
  277. buffer->cb_max_size = buffer->bin_attr->cb_max_size;
  278. } else {
  279. buffer->attr = attr;
  280. }
  281. buffer->owner = attr->ca_owner;
  282. /* Grab the module reference for this attribute if we have one */
  283. error = -ENODEV;
  284. if (!try_module_get(buffer->owner))
  285. goto out_free_buffer;
  286. error = -EACCES;
  287. if (!buffer->item->ci_type)
  288. goto out_put_module;
  289. buffer->ops = buffer->item->ci_type->ct_item_ops;
  290. /* File needs write support.
  291. * The inode's perms must say it's ok,
  292. * and we must have a store method.
  293. */
  294. if (file->f_mode & FMODE_WRITE) {
  295. if (!(inode->i_mode & S_IWUGO))
  296. goto out_put_module;
  297. if ((type & CONFIGFS_ITEM_ATTR) && !attr->store)
  298. goto out_put_module;
  299. if ((type & CONFIGFS_ITEM_BIN_ATTR) && !buffer->bin_attr->write)
  300. goto out_put_module;
  301. }
  302. /* File needs read support.
  303. * The inode's perms must say it's ok, and we there
  304. * must be a show method for it.
  305. */
  306. if (file->f_mode & FMODE_READ) {
  307. if (!(inode->i_mode & S_IRUGO))
  308. goto out_put_module;
  309. if ((type & CONFIGFS_ITEM_ATTR) && !attr->show)
  310. goto out_put_module;
  311. if ((type & CONFIGFS_ITEM_BIN_ATTR) && !buffer->bin_attr->read)
  312. goto out_put_module;
  313. }
  314. mutex_init(&buffer->mutex);
  315. buffer->needs_read_fill = 1;
  316. buffer->read_in_progress = false;
  317. buffer->write_in_progress = false;
  318. file->private_data = buffer;
  319. up_read(&frag->frag_sem);
  320. return 0;
  321. out_put_module:
  322. module_put(buffer->owner);
  323. out_free_buffer:
  324. up_read(&frag->frag_sem);
  325. kfree(buffer);
  326. out:
  327. return error;
  328. }
  329. static int configfs_release(struct inode *inode, struct file *filp)
  330. {
  331. struct configfs_buffer *buffer = filp->private_data;
  332. module_put(buffer->owner);
  333. if (buffer->page)
  334. free_page((unsigned long)buffer->page);
  335. mutex_destroy(&buffer->mutex);
  336. kfree(buffer);
  337. return 0;
  338. }
  339. static int configfs_open_file(struct inode *inode, struct file *filp)
  340. {
  341. return __configfs_open_file(inode, filp, CONFIGFS_ITEM_ATTR);
  342. }
  343. static int configfs_open_bin_file(struct inode *inode, struct file *filp)
  344. {
  345. return __configfs_open_file(inode, filp, CONFIGFS_ITEM_BIN_ATTR);
  346. }
  347. static int configfs_release_bin_file(struct inode *inode, struct file *file)
  348. {
  349. struct configfs_buffer *buffer = file->private_data;
  350. if (buffer->write_in_progress) {
  351. struct configfs_fragment *frag = to_frag(file);
  352. down_read(&frag->frag_sem);
  353. if (!frag->frag_dead) {
  354. /* result of ->release() is ignored */
  355. buffer->bin_attr->write(buffer->item,
  356. buffer->bin_buffer,
  357. buffer->bin_buffer_size);
  358. }
  359. up_read(&frag->frag_sem);
  360. }
  361. vfree(buffer->bin_buffer);
  362. configfs_release(inode, file);
  363. return 0;
  364. }
  365. const struct file_operations configfs_file_operations = {
  366. .read_iter = configfs_read_iter,
  367. .write_iter = configfs_write_iter,
  368. .llseek = generic_file_llseek,
  369. .open = configfs_open_file,
  370. .release = configfs_release,
  371. };
  372. const struct file_operations configfs_bin_file_operations = {
  373. .read_iter = configfs_bin_read_iter,
  374. .write_iter = configfs_bin_write_iter,
  375. .llseek = NULL, /* bin file is not seekable */
  376. .open = configfs_open_bin_file,
  377. .release = configfs_release_bin_file,
  378. };
  379. /**
  380. * configfs_create_file - create an attribute file for an item.
  381. * @item: item we're creating for.
  382. * @attr: atrribute descriptor.
  383. */
  384. int configfs_create_file(struct config_item * item, const struct configfs_attribute * attr)
  385. {
  386. struct dentry *dir = item->ci_dentry;
  387. struct configfs_dirent *parent_sd = dir->d_fsdata;
  388. umode_t mode = (attr->ca_mode & S_IALLUGO) | S_IFREG;
  389. int error = 0;
  390. inode_lock_nested(d_inode(dir), I_MUTEX_NORMAL);
  391. error = configfs_make_dirent(parent_sd, NULL, (void *) attr, mode,
  392. CONFIGFS_ITEM_ATTR, parent_sd->s_frag);
  393. inode_unlock(d_inode(dir));
  394. return error;
  395. }
  396. /**
  397. * configfs_create_bin_file - create a binary attribute file for an item.
  398. * @item: item we're creating for.
  399. * @bin_attr: atrribute descriptor.
  400. */
  401. int configfs_create_bin_file(struct config_item *item,
  402. const struct configfs_bin_attribute *bin_attr)
  403. {
  404. struct dentry *dir = item->ci_dentry;
  405. struct configfs_dirent *parent_sd = dir->d_fsdata;
  406. umode_t mode = (bin_attr->cb_attr.ca_mode & S_IALLUGO) | S_IFREG;
  407. int error = 0;
  408. inode_lock_nested(dir->d_inode, I_MUTEX_NORMAL);
  409. error = configfs_make_dirent(parent_sd, NULL, (void *) bin_attr, mode,
  410. CONFIGFS_ITEM_BIN_ATTR, parent_sd->s_frag);
  411. inode_unlock(dir->d_inode);
  412. return error;
  413. }