Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
file.c
Go to the documentation of this file.
1 /*
2  * fs/sysfs/file.c - sysfs regular (text) file implementation
3  *
4  * Copyright (c) 2001-3 Patrick Mochel
5  * Copyright (c) 2007 SUSE Linux Products GmbH
6  * Copyright (c) 2007 Tejun Heo <[email protected]>
7  *
8  * This file is released under the GPLv2.
9  *
10  * Please see Documentation/filesystems/sysfs.txt for more information.
11  */
12 
13 #include <linux/module.h>
14 #include <linux/kobject.h>
15 #include <linux/kallsyms.h>
16 #include <linux/slab.h>
17 #include <linux/fsnotify.h>
18 #include <linux/namei.h>
19 #include <linux/poll.h>
20 #include <linux/list.h>
21 #include <linux/mutex.h>
22 #include <linux/limits.h>
23 #include <asm/uaccess.h>
24 
25 #include "sysfs.h"
26 
27 /*
28  * There's one sysfs_buffer for each open file and one
29  * sysfs_open_dirent for each sysfs_dirent with one or more open
30  * files.
31  *
32  * filp->private_data points to sysfs_buffer and
33  * sysfs_dirent->s_attr.open points to sysfs_open_dirent. s_attr.open
34  * is protected by sysfs_open_dirent_lock.
35  */
36 static DEFINE_SPINLOCK(sysfs_open_dirent_lock);
37 
42  struct list_head buffers; /* goes through sysfs_buffer.list */
43 };
44 
45 struct sysfs_buffer {
46  size_t count;
47  loff_t pos;
48  char * page;
49  const struct sysfs_ops * ops;
50  struct mutex mutex;
52  int event;
53  struct list_head list;
54 };
55 
67 static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer)
68 {
69  struct sysfs_dirent *attr_sd = dentry->d_fsdata;
70  struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
71  const struct sysfs_ops * ops = buffer->ops;
72  int ret = 0;
73  ssize_t count;
74 
75  if (!buffer->page)
76  buffer->page = (char *) get_zeroed_page(GFP_KERNEL);
77  if (!buffer->page)
78  return -ENOMEM;
79 
80  /* need attr_sd for attr and ops, its parent for kobj */
81  if (!sysfs_get_active(attr_sd))
82  return -ENODEV;
83 
84  buffer->event = atomic_read(&attr_sd->s_attr.open->event);
85  count = ops->show(kobj, attr_sd->s_attr.attr, buffer->page);
86 
87  sysfs_put_active(attr_sd);
88 
89  /*
90  * The code works fine with PAGE_SIZE return but it's likely to
91  * indicate truncated result or overflow in normal use cases.
92  */
93  if (count >= (ssize_t)PAGE_SIZE) {
94  print_symbol("fill_read_buffer: %s returned bad count\n",
95  (unsigned long)ops->show);
96  /* Try to struggle along */
97  count = PAGE_SIZE - 1;
98  }
99  if (count >= 0) {
100  buffer->needs_read_fill = 0;
101  buffer->count = count;
102  } else {
103  ret = count;
104  }
105  return ret;
106 }
107 
127 static ssize_t
128 sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos)
129 {
130  struct sysfs_buffer * buffer = file->private_data;
131  ssize_t retval = 0;
132 
133  mutex_lock(&buffer->mutex);
134  if (buffer->needs_read_fill || *ppos == 0) {
135  retval = fill_read_buffer(file->f_path.dentry,buffer);
136  if (retval)
137  goto out;
138  }
139  pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n",
140  __func__, count, *ppos, buffer->page);
141  retval = simple_read_from_buffer(buf, count, ppos, buffer->page,
142  buffer->count);
143 out:
144  mutex_unlock(&buffer->mutex);
145  return retval;
146 }
147 
158 static int
159 fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t count)
160 {
161  int error;
162 
163  if (!buffer->page)
164  buffer->page = (char *)get_zeroed_page(GFP_KERNEL);
165  if (!buffer->page)
166  return -ENOMEM;
167 
168  if (count >= PAGE_SIZE)
169  count = PAGE_SIZE - 1;
170  error = copy_from_user(buffer->page,buf,count);
171  buffer->needs_read_fill = 1;
172  /* if buf is assumed to contain a string, terminate it by \0,
173  so e.g. sscanf() can scan the string easily */
174  buffer->page[count] = 0;
175  return error ? -EFAULT : count;
176 }
177 
178 
190 static int
191 flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t count)
192 {
193  struct sysfs_dirent *attr_sd = dentry->d_fsdata;
194  struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
195  const struct sysfs_ops * ops = buffer->ops;
196  int rc;
197 
198  /* need attr_sd for attr and ops, its parent for kobj */
199  if (!sysfs_get_active(attr_sd))
200  return -ENODEV;
201 
202  rc = ops->store(kobj, attr_sd->s_attr.attr, buffer->page, count);
203 
204  sysfs_put_active(attr_sd);
205 
206  return rc;
207 }
208 
209 
227 static ssize_t
228 sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
229 {
230  struct sysfs_buffer * buffer = file->private_data;
231  ssize_t len;
232 
233  mutex_lock(&buffer->mutex);
234  len = fill_write_buffer(buffer, buf, count);
235  if (len > 0)
236  len = flush_write_buffer(file->f_path.dentry, buffer, len);
237  if (len > 0)
238  *ppos += len;
239  mutex_unlock(&buffer->mutex);
240  return len;
241 }
242 
258 static int sysfs_get_open_dirent(struct sysfs_dirent *sd,
259  struct sysfs_buffer *buffer)
260 {
261  struct sysfs_open_dirent *od, *new_od = NULL;
262 
263  retry:
264  spin_lock_irq(&sysfs_open_dirent_lock);
265 
266  if (!sd->s_attr.open && new_od) {
267  sd->s_attr.open = new_od;
268  new_od = NULL;
269  }
270 
271  od = sd->s_attr.open;
272  if (od) {
273  atomic_inc(&od->refcnt);
274  list_add_tail(&buffer->list, &od->buffers);
275  }
276 
277  spin_unlock_irq(&sysfs_open_dirent_lock);
278 
279  if (od) {
280  kfree(new_od);
281  return 0;
282  }
283 
284  /* not there, initialize a new one and retry */
285  new_od = kmalloc(sizeof(*new_od), GFP_KERNEL);
286  if (!new_od)
287  return -ENOMEM;
288 
289  atomic_set(&new_od->refcnt, 0);
290  atomic_set(&new_od->event, 1);
291  init_waitqueue_head(&new_od->poll);
292  INIT_LIST_HEAD(&new_od->buffers);
293  goto retry;
294 }
295 
307 static void sysfs_put_open_dirent(struct sysfs_dirent *sd,
308  struct sysfs_buffer *buffer)
309 {
310  struct sysfs_open_dirent *od = sd->s_attr.open;
311  unsigned long flags;
312 
313  spin_lock_irqsave(&sysfs_open_dirent_lock, flags);
314 
315  list_del(&buffer->list);
316  if (atomic_dec_and_test(&od->refcnt))
317  sd->s_attr.open = NULL;
318  else
319  od = NULL;
320 
321  spin_unlock_irqrestore(&sysfs_open_dirent_lock, flags);
322 
323  kfree(od);
324 }
325 
326 static int sysfs_open_file(struct inode *inode, struct file *file)
327 {
328  struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata;
329  struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
330  struct sysfs_buffer *buffer;
331  const struct sysfs_ops *ops;
332  int error = -EACCES;
333 
334  /* need attr_sd for attr and ops, its parent for kobj */
335  if (!sysfs_get_active(attr_sd))
336  return -ENODEV;
337 
338  /* every kobject with an attribute needs a ktype assigned */
339  if (kobj->ktype && kobj->ktype->sysfs_ops)
340  ops = kobj->ktype->sysfs_ops;
341  else {
342  WARN(1, KERN_ERR "missing sysfs attribute operations for "
343  "kobject: %s\n", kobject_name(kobj));
344  goto err_out;
345  }
346 
347  /* File needs write support.
348  * The inode's perms must say it's ok,
349  * and we must have a store method.
350  */
351  if (file->f_mode & FMODE_WRITE) {
352  if (!(inode->i_mode & S_IWUGO) || !ops->store)
353  goto err_out;
354  }
355 
356  /* File needs read support.
357  * The inode's perms must say it's ok, and we there
358  * must be a show method for it.
359  */
360  if (file->f_mode & FMODE_READ) {
361  if (!(inode->i_mode & S_IRUGO) || !ops->show)
362  goto err_out;
363  }
364 
365  /* No error? Great, allocate a buffer for the file, and store it
366  * it in file->private_data for easy access.
367  */
368  error = -ENOMEM;
369  buffer = kzalloc(sizeof(struct sysfs_buffer), GFP_KERNEL);
370  if (!buffer)
371  goto err_out;
372 
373  mutex_init(&buffer->mutex);
374  buffer->needs_read_fill = 1;
375  buffer->ops = ops;
376  file->private_data = buffer;
377 
378  /* make sure we have open dirent struct */
379  error = sysfs_get_open_dirent(attr_sd, buffer);
380  if (error)
381  goto err_free;
382 
383  /* open succeeded, put active references */
384  sysfs_put_active(attr_sd);
385  return 0;
386 
387  err_free:
388  kfree(buffer);
389  err_out:
390  sysfs_put_active(attr_sd);
391  return error;
392 }
393 
394 static int sysfs_release(struct inode *inode, struct file *filp)
395 {
396  struct sysfs_dirent *sd = filp->f_path.dentry->d_fsdata;
397  struct sysfs_buffer *buffer = filp->private_data;
398 
399  sysfs_put_open_dirent(sd, buffer);
400 
401  if (buffer->page)
402  free_page((unsigned long)buffer->page);
403  kfree(buffer);
404 
405  return 0;
406 }
407 
408 /* Sysfs attribute files are pollable. The idea is that you read
409  * the content and then you use 'poll' or 'select' to wait for
410  * the content to change. When the content changes (assuming the
411  * manager for the kobject supports notification), poll will
412  * return POLLERR|POLLPRI, and select will return the fd whether
413  * it is waiting for read, write, or exceptions.
414  * Once poll/select indicates that the value has changed, you
415  * need to close and re-open the file, or seek to 0 and read again.
416  * Reminder: this only works for attributes which actively support
417  * it, and it is not possible to test an attribute from userspace
418  * to see if it supports poll (Neither 'poll' nor 'select' return
419  * an appropriate error code). When in doubt, set a suitable timeout value.
420  */
421 static unsigned int sysfs_poll(struct file *filp, poll_table *wait)
422 {
423  struct sysfs_buffer * buffer = filp->private_data;
424  struct sysfs_dirent *attr_sd = filp->f_path.dentry->d_fsdata;
425  struct sysfs_open_dirent *od = attr_sd->s_attr.open;
426 
427  /* need parent for the kobj, grab both */
428  if (!sysfs_get_active(attr_sd))
429  goto trigger;
430 
431  poll_wait(filp, &od->poll, wait);
432 
433  sysfs_put_active(attr_sd);
434 
435  if (buffer->event != atomic_read(&od->event))
436  goto trigger;
437 
438  return DEFAULT_POLLMASK;
439 
440  trigger:
441  buffer->needs_read_fill = 1;
443 }
444 
446 {
447  struct sysfs_open_dirent *od;
448  unsigned long flags;
449 
450  spin_lock_irqsave(&sysfs_open_dirent_lock, flags);
451 
452  od = sd->s_attr.open;
453  if (od) {
454  atomic_inc(&od->event);
456  }
457 
458  spin_unlock_irqrestore(&sysfs_open_dirent_lock, flags);
459 }
461 
462 void sysfs_notify(struct kobject *k, const char *dir, const char *attr)
463 {
464  struct sysfs_dirent *sd = k->sd;
465 
467 
468  if (sd && dir)
469  sd = sysfs_find_dirent(sd, NULL, dir);
470  if (sd && attr)
471  sd = sysfs_find_dirent(sd, NULL, attr);
472  if (sd)
474 
476 }
478 
480  .read = sysfs_read_file,
481  .write = sysfs_write_file,
482  .llseek = generic_file_llseek,
483  .open = sysfs_open_file,
484  .release = sysfs_release,
485  .poll = sysfs_poll,
486 };
487 
488 int sysfs_attr_ns(struct kobject *kobj, const struct attribute *attr,
489  const void **pns)
490 {
491  struct sysfs_dirent *dir_sd = kobj->sd;
492  const struct sysfs_ops *ops;
493  const void *ns = NULL;
494  int err;
495 
496  if (!dir_sd) {
497  WARN(1, KERN_ERR "sysfs: kobject %s without dirent\n",
498  kobject_name(kobj));
499  return -ENOENT;
500  }
501 
502  err = 0;
503  if (!sysfs_ns_type(dir_sd))
504  goto out;
505 
506  err = -EINVAL;
507  if (!kobj->ktype)
508  goto out;
509  ops = kobj->ktype->sysfs_ops;
510  if (!ops)
511  goto out;
512  if (!ops->namespace)
513  goto out;
514 
515  err = 0;
516  ns = ops->namespace(kobj, attr);
517 out:
518  if (err) {
519  WARN(1, KERN_ERR "missing sysfs namespace attribute operation for "
520  "kobject: %s\n", kobject_name(kobj));
521  }
522  *pns = ns;
523  return err;
524 }
525 
527  const struct attribute *attr, int type, umode_t amode)
528 {
529  umode_t mode = (amode & S_IALLUGO) | S_IFREG;
530  struct sysfs_addrm_cxt acxt;
531  struct sysfs_dirent *sd;
532  const void *ns;
533  int rc;
534 
535  rc = sysfs_attr_ns(dir_sd->s_dir.kobj, attr, &ns);
536  if (rc)
537  return rc;
538 
539  sd = sysfs_new_dirent(attr->name, mode, type);
540  if (!sd)
541  return -ENOMEM;
542 
543  sd->s_ns = ns;
544  sd->s_attr.attr = (void *)attr;
546 
547  sysfs_addrm_start(&acxt, dir_sd);
548  rc = sysfs_add_one(&acxt, sd);
549  sysfs_addrm_finish(&acxt);
550 
551  if (rc)
552  sysfs_put(sd);
553 
554  return rc;
555 }
556 
557 
558 int sysfs_add_file(struct sysfs_dirent *dir_sd, const struct attribute *attr,
559  int type)
560 {
561  return sysfs_add_file_mode(dir_sd, attr, type, attr->mode);
562 }
563 
564 
571 int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
572 {
573  BUG_ON(!kobj || !kobj->sd || !attr);
574 
575  return sysfs_add_file(kobj->sd, attr, SYSFS_KOBJ_ATTR);
576 
577 }
578 
579 int sysfs_create_files(struct kobject *kobj, const struct attribute **ptr)
580 {
581  int err = 0;
582  int i;
583 
584  for (i = 0; ptr[i] && !err; i++)
585  err = sysfs_create_file(kobj, ptr[i]);
586  if (err)
587  while (--i >= 0)
588  sysfs_remove_file(kobj, ptr[i]);
589  return err;
590 }
591 
599  const struct attribute *attr, const char *group)
600 {
601  struct sysfs_dirent *dir_sd;
602  int error;
603 
604  if (group)
605  dir_sd = sysfs_get_dirent(kobj->sd, NULL, group);
606  else
607  dir_sd = sysfs_get(kobj->sd);
608 
609  if (!dir_sd)
610  return -ENOENT;
611 
612  error = sysfs_add_file(dir_sd, attr, SYSFS_KOBJ_ATTR);
613  sysfs_put(dir_sd);
614 
615  return error;
616 }
618 
626 int sysfs_chmod_file(struct kobject *kobj, const struct attribute *attr,
627  umode_t mode)
628 {
629  struct sysfs_dirent *sd;
630  struct iattr newattrs;
631  const void *ns;
632  int rc;
633 
634  rc = sysfs_attr_ns(kobj, attr, &ns);
635  if (rc)
636  return rc;
637 
639 
640  rc = -ENOENT;
641  sd = sysfs_find_dirent(kobj->sd, ns, attr->name);
642  if (!sd)
643  goto out;
644 
645  newattrs.ia_mode = (mode & S_IALLUGO) | (sd->s_mode & ~S_IALLUGO);
646  newattrs.ia_valid = ATTR_MODE;
647  rc = sysfs_sd_setattr(sd, &newattrs);
648 
649  out:
651  return rc;
652 }
654 
655 
664 void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr)
665 {
666  const void *ns;
667 
668  if (sysfs_attr_ns(kobj, attr, &ns))
669  return;
670 
671  sysfs_hash_and_remove(kobj->sd, ns, attr->name);
672 }
673 
674 void sysfs_remove_files(struct kobject * kobj, const struct attribute **ptr)
675 {
676  int i;
677  for (i = 0; ptr[i]; i++)
678  sysfs_remove_file(kobj, ptr[i]);
679 }
680 
688  const struct attribute *attr, const char *group)
689 {
690  struct sysfs_dirent *dir_sd;
691 
692  if (group)
693  dir_sd = sysfs_get_dirent(kobj->sd, NULL, group);
694  else
695  dir_sd = sysfs_get(kobj->sd);
696  if (dir_sd) {
697  sysfs_hash_and_remove(dir_sd, NULL, attr->name);
698  sysfs_put(dir_sd);
699  }
700 }
702 
705  struct kobject *kobj;
706  void (*func)(void *);
707  void *data;
708  struct module *owner;
710 };
711 
712 static struct workqueue_struct *sysfs_workqueue;
713 static DEFINE_MUTEX(sysfs_workq_mutex);
714 static LIST_HEAD(sysfs_workq);
715 static void sysfs_schedule_callback_work(struct work_struct *work)
716 {
718  struct sysfs_schedule_callback_struct, work);
719 
720  (ss->func)(ss->data);
721  kobject_put(ss->kobj);
722  module_put(ss->owner);
723  mutex_lock(&sysfs_workq_mutex);
724  list_del(&ss->workq_list);
725  mutex_unlock(&sysfs_workq_mutex);
726  kfree(ss);
727 }
728 
750 int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
751  void *data, struct module *owner)
752 {
754 
755  if (!try_module_get(owner))
756  return -ENODEV;
757 
758  mutex_lock(&sysfs_workq_mutex);
759  list_for_each_entry_safe(ss, tmp, &sysfs_workq, workq_list)
760  if (ss->kobj == kobj) {
761  module_put(owner);
762  mutex_unlock(&sysfs_workq_mutex);
763  return -EAGAIN;
764  }
765  mutex_unlock(&sysfs_workq_mutex);
766 
767  if (sysfs_workqueue == NULL) {
768  sysfs_workqueue = create_singlethread_workqueue("sysfsd");
769  if (sysfs_workqueue == NULL) {
770  module_put(owner);
771  return -ENOMEM;
772  }
773  }
774 
775  ss = kmalloc(sizeof(*ss), GFP_KERNEL);
776  if (!ss) {
777  module_put(owner);
778  return -ENOMEM;
779  }
780  kobject_get(kobj);
781  ss->kobj = kobj;
782  ss->func = func;
783  ss->data = data;
784  ss->owner = owner;
785  INIT_WORK(&ss->work, sysfs_schedule_callback_work);
786  INIT_LIST_HEAD(&ss->workq_list);
787  mutex_lock(&sysfs_workq_mutex);
788  list_add_tail(&ss->workq_list, &sysfs_workq);
789  mutex_unlock(&sysfs_workq_mutex);
790  queue_work(sysfs_workqueue, &ss->work);
791  return 0;
792 }
794 
795