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