]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - fs/sysfs/file.c
Driver Core: kill subsys_attribute and default sysfs ops
[linux-2.6-omap-h63xx.git] / fs / sysfs / file.c
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 <teheo@suse.de>
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/namei.h>
16 #include <linux/poll.h>
17 #include <linux/list.h>
18 #include <linux/mutex.h>
19 #include <asm/uaccess.h>
20
21 #include "sysfs.h"
22
23 /*
24  * There's one sysfs_buffer for each open file and one
25  * sysfs_open_dirent for each sysfs_dirent with one or more open
26  * files.
27  *
28  * filp->private_data points to sysfs_buffer and
29  * sysfs_dirent->s_attr.open points to sysfs_open_dirent.  s_attr.open
30  * is protected by sysfs_open_dirent_lock.
31  */
32 static DEFINE_SPINLOCK(sysfs_open_dirent_lock);
33
34 struct sysfs_open_dirent {
35         atomic_t                refcnt;
36         atomic_t                event;
37         wait_queue_head_t       poll;
38         struct list_head        buffers; /* goes through sysfs_buffer.list */
39 };
40
41 struct sysfs_buffer {
42         size_t                  count;
43         loff_t                  pos;
44         char                    * page;
45         struct sysfs_ops        * ops;
46         struct mutex            mutex;
47         int                     needs_read_fill;
48         int                     event;
49         struct list_head        list;
50 };
51
52 /**
53  *      fill_read_buffer - allocate and fill buffer from object.
54  *      @dentry:        dentry pointer.
55  *      @buffer:        data buffer for file.
56  *
57  *      Allocate @buffer->page, if it hasn't been already, then call the
58  *      kobject's show() method to fill the buffer with this attribute's 
59  *      data. 
60  *      This is called only once, on the file's first read unless an error
61  *      is returned.
62  */
63 static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer)
64 {
65         struct sysfs_dirent *attr_sd = dentry->d_fsdata;
66         struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
67         struct sysfs_ops * ops = buffer->ops;
68         int ret = 0;
69         ssize_t count;
70
71         if (!buffer->page)
72                 buffer->page = (char *) get_zeroed_page(GFP_KERNEL);
73         if (!buffer->page)
74                 return -ENOMEM;
75
76         /* need attr_sd for attr and ops, its parent for kobj */
77         if (!sysfs_get_active_two(attr_sd))
78                 return -ENODEV;
79
80         buffer->event = atomic_read(&attr_sd->s_attr.open->event);
81         count = ops->show(kobj, attr_sd->s_attr.attr, buffer->page);
82
83         sysfs_put_active_two(attr_sd);
84
85         /*
86          * The code works fine with PAGE_SIZE return but it's likely to
87          * indicate truncated result or overflow in normal use cases.
88          */
89         BUG_ON(count >= (ssize_t)PAGE_SIZE);
90         if (count >= 0) {
91                 buffer->needs_read_fill = 0;
92                 buffer->count = count;
93         } else {
94                 ret = count;
95         }
96         return ret;
97 }
98
99 /**
100  *      sysfs_read_file - read an attribute. 
101  *      @file:  file pointer.
102  *      @buf:   buffer to fill.
103  *      @count: number of bytes to read.
104  *      @ppos:  starting offset in file.
105  *
106  *      Userspace wants to read an attribute file. The attribute descriptor
107  *      is in the file's ->d_fsdata. The target object is in the directory's
108  *      ->d_fsdata.
109  *
110  *      We call fill_read_buffer() to allocate and fill the buffer from the
111  *      object's show() method exactly once (if the read is happening from
112  *      the beginning of the file). That should fill the entire buffer with
113  *      all the data the object has to offer for that attribute.
114  *      We then call flush_read_buffer() to copy the buffer to userspace
115  *      in the increments specified.
116  */
117
118 static ssize_t
119 sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos)
120 {
121         struct sysfs_buffer * buffer = file->private_data;
122         ssize_t retval = 0;
123
124         mutex_lock(&buffer->mutex);
125         if (buffer->needs_read_fill) {
126                 retval = fill_read_buffer(file->f_path.dentry,buffer);
127                 if (retval)
128                         goto out;
129         }
130         pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n",
131                  __FUNCTION__, count, *ppos, buffer->page);
132         retval = simple_read_from_buffer(buf, count, ppos, buffer->page,
133                                          buffer->count);
134 out:
135         mutex_unlock(&buffer->mutex);
136         return retval;
137 }
138
139 /**
140  *      fill_write_buffer - copy buffer from userspace.
141  *      @buffer:        data buffer for file.
142  *      @buf:           data from user.
143  *      @count:         number of bytes in @userbuf.
144  *
145  *      Allocate @buffer->page if it hasn't been already, then
146  *      copy the user-supplied buffer into it.
147  */
148
149 static int 
150 fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t count)
151 {
152         int error;
153
154         if (!buffer->page)
155                 buffer->page = (char *)get_zeroed_page(GFP_KERNEL);
156         if (!buffer->page)
157                 return -ENOMEM;
158
159         if (count >= PAGE_SIZE)
160                 count = PAGE_SIZE - 1;
161         error = copy_from_user(buffer->page,buf,count);
162         buffer->needs_read_fill = 1;
163         /* if buf is assumed to contain a string, terminate it by \0,
164            so e.g. sscanf() can scan the string easily */
165         buffer->page[count] = 0;
166         return error ? -EFAULT : count;
167 }
168
169
170 /**
171  *      flush_write_buffer - push buffer to kobject.
172  *      @dentry:        dentry to the attribute
173  *      @buffer:        data buffer for file.
174  *      @count:         number of bytes
175  *
176  *      Get the correct pointers for the kobject and the attribute we're
177  *      dealing with, then call the store() method for the attribute, 
178  *      passing the buffer that we acquired in fill_write_buffer().
179  */
180
181 static int
182 flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t count)
183 {
184         struct sysfs_dirent *attr_sd = dentry->d_fsdata;
185         struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
186         struct sysfs_ops * ops = buffer->ops;
187         int rc;
188
189         /* need attr_sd for attr and ops, its parent for kobj */
190         if (!sysfs_get_active_two(attr_sd))
191                 return -ENODEV;
192
193         rc = ops->store(kobj, attr_sd->s_attr.attr, buffer->page, count);
194
195         sysfs_put_active_two(attr_sd);
196
197         return rc;
198 }
199
200
201 /**
202  *      sysfs_write_file - write an attribute.
203  *      @file:  file pointer
204  *      @buf:   data to write
205  *      @count: number of bytes
206  *      @ppos:  starting offset
207  *
208  *      Similar to sysfs_read_file(), though working in the opposite direction.
209  *      We allocate and fill the data from the user in fill_write_buffer(),
210  *      then push it to the kobject in flush_write_buffer().
211  *      There is no easy way for us to know if userspace is only doing a partial
212  *      write, so we don't support them. We expect the entire buffer to come
213  *      on the first write. 
214  *      Hint: if you're writing a value, first read the file, modify only the
215  *      the value you're changing, then write entire buffer back. 
216  */
217
218 static ssize_t
219 sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
220 {
221         struct sysfs_buffer * buffer = file->private_data;
222         ssize_t len;
223
224         mutex_lock(&buffer->mutex);
225         len = fill_write_buffer(buffer, buf, count);
226         if (len > 0)
227                 len = flush_write_buffer(file->f_path.dentry, buffer, len);
228         if (len > 0)
229                 *ppos += len;
230         mutex_unlock(&buffer->mutex);
231         return len;
232 }
233
234 /**
235  *      sysfs_get_open_dirent - get or create sysfs_open_dirent
236  *      @sd: target sysfs_dirent
237  *      @buffer: sysfs_buffer for this instance of open
238  *
239  *      If @sd->s_attr.open exists, increment its reference count;
240  *      otherwise, create one.  @buffer is chained to the buffers
241  *      list.
242  *
243  *      LOCKING:
244  *      Kernel thread context (may sleep).
245  *
246  *      RETURNS:
247  *      0 on success, -errno on failure.
248  */
249 static int sysfs_get_open_dirent(struct sysfs_dirent *sd,
250                                  struct sysfs_buffer *buffer)
251 {
252         struct sysfs_open_dirent *od, *new_od = NULL;
253
254  retry:
255         spin_lock(&sysfs_open_dirent_lock);
256
257         if (!sd->s_attr.open && new_od) {
258                 sd->s_attr.open = new_od;
259                 new_od = NULL;
260         }
261
262         od = sd->s_attr.open;
263         if (od) {
264                 atomic_inc(&od->refcnt);
265                 list_add_tail(&buffer->list, &od->buffers);
266         }
267
268         spin_unlock(&sysfs_open_dirent_lock);
269
270         if (od) {
271                 kfree(new_od);
272                 return 0;
273         }
274
275         /* not there, initialize a new one and retry */
276         new_od = kmalloc(sizeof(*new_od), GFP_KERNEL);
277         if (!new_od)
278                 return -ENOMEM;
279
280         atomic_set(&new_od->refcnt, 0);
281         atomic_set(&new_od->event, 1);
282         init_waitqueue_head(&new_od->poll);
283         INIT_LIST_HEAD(&new_od->buffers);
284         goto retry;
285 }
286
287 /**
288  *      sysfs_put_open_dirent - put sysfs_open_dirent
289  *      @sd: target sysfs_dirent
290  *      @buffer: associated sysfs_buffer
291  *
292  *      Put @sd->s_attr.open and unlink @buffer from the buffers list.
293  *      If reference count reaches zero, disassociate and free it.
294  *
295  *      LOCKING:
296  *      None.
297  */
298 static void sysfs_put_open_dirent(struct sysfs_dirent *sd,
299                                   struct sysfs_buffer *buffer)
300 {
301         struct sysfs_open_dirent *od = sd->s_attr.open;
302
303         spin_lock(&sysfs_open_dirent_lock);
304
305         list_del(&buffer->list);
306         if (atomic_dec_and_test(&od->refcnt))
307                 sd->s_attr.open = NULL;
308         else
309                 od = NULL;
310
311         spin_unlock(&sysfs_open_dirent_lock);
312
313         kfree(od);
314 }
315
316 static int sysfs_open_file(struct inode *inode, struct file *file)
317 {
318         struct sysfs_dirent *attr_sd = file->f_path.dentry->d_fsdata;
319         struct kobject *kobj = attr_sd->s_parent->s_dir.kobj;
320         struct sysfs_buffer *buffer;
321         struct sysfs_ops *ops;
322         int error = -EACCES;
323
324         /* need attr_sd for attr and ops, its parent for kobj */
325         if (!sysfs_get_active_two(attr_sd))
326                 return -ENODEV;
327
328         /* every kobject with an attribute needs a ktype assigned */
329         if (kobj->ktype && kobj->ktype->sysfs_ops)
330                 ops = kobj->ktype->sysfs_ops;
331         else {
332                 printk(KERN_ERR "missing sysfs attribute operations for "
333                        "kobject: %s\n", kobject_name(kobj));
334                 WARN_ON(1);
335                 goto err_out;
336         }
337
338         /* File needs write support.
339          * The inode's perms must say it's ok, 
340          * and we must have a store method.
341          */
342         if (file->f_mode & FMODE_WRITE) {
343                 if (!(inode->i_mode & S_IWUGO) || !ops->store)
344                         goto err_out;
345         }
346
347         /* File needs read support.
348          * The inode's perms must say it's ok, and we there
349          * must be a show method for it.
350          */
351         if (file->f_mode & FMODE_READ) {
352                 if (!(inode->i_mode & S_IRUGO) || !ops->show)
353                         goto err_out;
354         }
355
356         /* No error? Great, allocate a buffer for the file, and store it
357          * it in file->private_data for easy access.
358          */
359         error = -ENOMEM;
360         buffer = kzalloc(sizeof(struct sysfs_buffer), GFP_KERNEL);
361         if (!buffer)
362                 goto err_out;
363
364         mutex_init(&buffer->mutex);
365         buffer->needs_read_fill = 1;
366         buffer->ops = ops;
367         file->private_data = buffer;
368
369         /* make sure we have open dirent struct */
370         error = sysfs_get_open_dirent(attr_sd, buffer);
371         if (error)
372                 goto err_free;
373
374         /* open succeeded, put active references */
375         sysfs_put_active_two(attr_sd);
376         return 0;
377
378  err_free:
379         kfree(buffer);
380  err_out:
381         sysfs_put_active_two(attr_sd);
382         return error;
383 }
384
385 static int sysfs_release(struct inode *inode, struct file *filp)
386 {
387         struct sysfs_dirent *sd = filp->f_path.dentry->d_fsdata;
388         struct sysfs_buffer *buffer = filp->private_data;
389
390         sysfs_put_open_dirent(sd, buffer);
391
392         if (buffer->page)
393                 free_page((unsigned long)buffer->page);
394         kfree(buffer);
395
396         return 0;
397 }
398
399 /* Sysfs attribute files are pollable.  The idea is that you read
400  * the content and then you use 'poll' or 'select' to wait for
401  * the content to change.  When the content changes (assuming the
402  * manager for the kobject supports notification), poll will
403  * return POLLERR|POLLPRI, and select will return the fd whether
404  * it is waiting for read, write, or exceptions.
405  * Once poll/select indicates that the value has changed, you
406  * need to close and re-open the file, as simply seeking and reading
407  * again will not get new data, or reset the state of 'poll'.
408  * Reminder: this only works for attributes which actively support
409  * it, and it is not possible to test an attribute from userspace
410  * to see if it supports poll (Neither 'poll' nor 'select' return
411  * an appropriate error code).  When in doubt, set a suitable timeout value.
412  */
413 static unsigned int sysfs_poll(struct file *filp, poll_table *wait)
414 {
415         struct sysfs_buffer * buffer = filp->private_data;
416         struct sysfs_dirent *attr_sd = filp->f_path.dentry->d_fsdata;
417         struct sysfs_open_dirent *od = attr_sd->s_attr.open;
418
419         /* need parent for the kobj, grab both */
420         if (!sysfs_get_active_two(attr_sd))
421                 goto trigger;
422
423         poll_wait(filp, &od->poll, wait);
424
425         sysfs_put_active_two(attr_sd);
426
427         if (buffer->event != atomic_read(&od->event))
428                 goto trigger;
429
430         return 0;
431
432  trigger:
433         buffer->needs_read_fill = 1;
434         return POLLERR|POLLPRI;
435 }
436
437 void sysfs_notify(struct kobject *k, char *dir, char *attr)
438 {
439         struct sysfs_dirent *sd = k->sd;
440
441         mutex_lock(&sysfs_mutex);
442
443         if (sd && dir)
444                 sd = sysfs_find_dirent(sd, dir);
445         if (sd && attr)
446                 sd = sysfs_find_dirent(sd, attr);
447         if (sd) {
448                 struct sysfs_open_dirent *od;
449
450                 spin_lock(&sysfs_open_dirent_lock);
451
452                 od = sd->s_attr.open;
453                 if (od) {
454                         atomic_inc(&od->event);
455                         wake_up_interruptible(&od->poll);
456                 }
457
458                 spin_unlock(&sysfs_open_dirent_lock);
459         }
460
461         mutex_unlock(&sysfs_mutex);
462 }
463 EXPORT_SYMBOL_GPL(sysfs_notify);
464
465 const struct file_operations sysfs_file_operations = {
466         .read           = sysfs_read_file,
467         .write          = sysfs_write_file,
468         .llseek         = generic_file_llseek,
469         .open           = sysfs_open_file,
470         .release        = sysfs_release,
471         .poll           = sysfs_poll,
472 };
473
474
475 int sysfs_add_file(struct sysfs_dirent *dir_sd, const struct attribute *attr,
476                    int type)
477 {
478         umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG;
479         struct sysfs_addrm_cxt acxt;
480         struct sysfs_dirent *sd;
481         int rc;
482
483         sd = sysfs_new_dirent(attr->name, mode, type);
484         if (!sd)
485                 return -ENOMEM;
486         sd->s_attr.attr = (void *)attr;
487
488         sysfs_addrm_start(&acxt, dir_sd);
489         rc = sysfs_add_one(&acxt, sd);
490         sysfs_addrm_finish(&acxt);
491
492         if (rc)
493                 sysfs_put(sd);
494
495         return rc;
496 }
497
498
499 /**
500  *      sysfs_create_file - create an attribute file for an object.
501  *      @kobj:  object we're creating for. 
502  *      @attr:  attribute descriptor.
503  */
504
505 int sysfs_create_file(struct kobject * kobj, const struct attribute * attr)
506 {
507         BUG_ON(!kobj || !kobj->sd || !attr);
508
509         return sysfs_add_file(kobj->sd, attr, SYSFS_KOBJ_ATTR);
510
511 }
512
513
514 /**
515  * sysfs_add_file_to_group - add an attribute file to a pre-existing group.
516  * @kobj: object we're acting for.
517  * @attr: attribute descriptor.
518  * @group: group name.
519  */
520 int sysfs_add_file_to_group(struct kobject *kobj,
521                 const struct attribute *attr, const char *group)
522 {
523         struct sysfs_dirent *dir_sd;
524         int error;
525
526         dir_sd = sysfs_get_dirent(kobj->sd, group);
527         if (!dir_sd)
528                 return -ENOENT;
529
530         error = sysfs_add_file(dir_sd, attr, SYSFS_KOBJ_ATTR);
531         sysfs_put(dir_sd);
532
533         return error;
534 }
535 EXPORT_SYMBOL_GPL(sysfs_add_file_to_group);
536
537 /**
538  * sysfs_chmod_file - update the modified mode value on an object attribute.
539  * @kobj: object we're acting for.
540  * @attr: attribute descriptor.
541  * @mode: file permissions.
542  *
543  */
544 int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode)
545 {
546         struct sysfs_dirent *victim_sd = NULL;
547         struct dentry *victim = NULL;
548         struct inode * inode;
549         struct iattr newattrs;
550         int rc;
551
552         rc = -ENOENT;
553         victim_sd = sysfs_get_dirent(kobj->sd, attr->name);
554         if (!victim_sd)
555                 goto out;
556
557         mutex_lock(&sysfs_rename_mutex);
558         victim = sysfs_get_dentry(victim_sd);
559         mutex_unlock(&sysfs_rename_mutex);
560         if (IS_ERR(victim)) {
561                 rc = PTR_ERR(victim);
562                 victim = NULL;
563                 goto out;
564         }
565
566         inode = victim->d_inode;
567
568         mutex_lock(&inode->i_mutex);
569
570         newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
571         newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
572         rc = notify_change(victim, &newattrs);
573
574         if (rc == 0) {
575                 mutex_lock(&sysfs_mutex);
576                 victim_sd->s_mode = newattrs.ia_mode;
577                 mutex_unlock(&sysfs_mutex);
578         }
579
580         mutex_unlock(&inode->i_mutex);
581  out:
582         dput(victim);
583         sysfs_put(victim_sd);
584         return rc;
585 }
586 EXPORT_SYMBOL_GPL(sysfs_chmod_file);
587
588
589 /**
590  *      sysfs_remove_file - remove an object attribute.
591  *      @kobj:  object we're acting for.
592  *      @attr:  attribute descriptor.
593  *
594  *      Hash the attribute name and kill the victim.
595  */
596
597 void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr)
598 {
599         sysfs_hash_and_remove(kobj->sd, attr->name);
600 }
601
602
603 /**
604  * sysfs_remove_file_from_group - remove an attribute file from a group.
605  * @kobj: object we're acting for.
606  * @attr: attribute descriptor.
607  * @group: group name.
608  */
609 void sysfs_remove_file_from_group(struct kobject *kobj,
610                 const struct attribute *attr, const char *group)
611 {
612         struct sysfs_dirent *dir_sd;
613
614         dir_sd = sysfs_get_dirent(kobj->sd, group);
615         if (dir_sd) {
616                 sysfs_hash_and_remove(dir_sd, attr->name);
617                 sysfs_put(dir_sd);
618         }
619 }
620 EXPORT_SYMBOL_GPL(sysfs_remove_file_from_group);
621
622 struct sysfs_schedule_callback_struct {
623         struct kobject          *kobj;
624         void                    (*func)(void *);
625         void                    *data;
626         struct module           *owner;
627         struct work_struct      work;
628 };
629
630 static void sysfs_schedule_callback_work(struct work_struct *work)
631 {
632         struct sysfs_schedule_callback_struct *ss = container_of(work,
633                         struct sysfs_schedule_callback_struct, work);
634
635         (ss->func)(ss->data);
636         kobject_put(ss->kobj);
637         module_put(ss->owner);
638         kfree(ss);
639 }
640
641 /**
642  * sysfs_schedule_callback - helper to schedule a callback for a kobject
643  * @kobj: object we're acting for.
644  * @func: callback function to invoke later.
645  * @data: argument to pass to @func.
646  * @owner: module owning the callback code
647  *
648  * sysfs attribute methods must not unregister themselves or their parent
649  * kobject (which would amount to the same thing).  Attempts to do so will
650  * deadlock, since unregistration is mutually exclusive with driver
651  * callbacks.
652  *
653  * Instead methods can call this routine, which will attempt to allocate
654  * and schedule a workqueue request to call back @func with @data as its
655  * argument in the workqueue's process context.  @kobj will be pinned
656  * until @func returns.
657  *
658  * Returns 0 if the request was submitted, -ENOMEM if storage could not
659  * be allocated, -ENODEV if a reference to @owner isn't available.
660  */
661 int sysfs_schedule_callback(struct kobject *kobj, void (*func)(void *),
662                 void *data, struct module *owner)
663 {
664         struct sysfs_schedule_callback_struct *ss;
665
666         if (!try_module_get(owner))
667                 return -ENODEV;
668         ss = kmalloc(sizeof(*ss), GFP_KERNEL);
669         if (!ss) {
670                 module_put(owner);
671                 return -ENOMEM;
672         }
673         kobject_get(kobj);
674         ss->kobj = kobj;
675         ss->func = func;
676         ss->data = data;
677         ss->owner = owner;
678         INIT_WORK(&ss->work, sysfs_schedule_callback_work);
679         schedule_work(&ss->work);
680         return 0;
681 }
682 EXPORT_SYMBOL_GPL(sysfs_schedule_callback);
683
684
685 EXPORT_SYMBOL_GPL(sysfs_create_file);
686 EXPORT_SYMBOL_GPL(sysfs_remove_file);