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_subsys(k) container_of(k,struct subsystem,kset.kobj) 17 #define to_sattr(a) container_of(a,struct subsys_attribute,attr) 18 19 /* 20 * Subsystem file operations. 21 * These operations allow subsystems to have files that can be 22 * read/written. 23 */ 24 static ssize_t 25 subsys_attr_show(struct kobject * kobj, struct attribute * attr, char * page) 26 { 27 struct subsystem * s = to_subsys(kobj); 28 struct subsys_attribute * sattr = to_sattr(attr); 29 ssize_t ret = -EIO; 30 31 if (sattr->show) 32 ret = sattr->show(s,page); 33 return ret; 34 } 35 36 static ssize_t 37 subsys_attr_store(struct kobject * kobj, struct attribute * attr, 38 const char * page, size_t count) 39 { 40 struct subsystem * s = to_subsys(kobj); 41 struct subsys_attribute * sattr = to_sattr(attr); 42 ssize_t ret = -EIO; 43 44 if (sattr->store) 45 ret = sattr->store(s,page,count); 46 return ret; 47 } 48 49 static struct sysfs_ops subsys_sysfs_ops = { 50 .show = subsys_attr_show, 51 .store = subsys_attr_store, 52 }; 53 54 /** 55 * add_to_collection - add buffer to a collection 56 * @buffer: buffer to be added 57 * @node inode of set to add to 58 */ 59 60 static inline void 61 add_to_collection(struct sysfs_buffer *buffer, struct inode *node) 62 { 63 struct sysfs_buffer_collection *set = node->i_private; 64 65 mutex_lock(&node->i_mutex); 66 list_add(&buffer->associates, &set->associates); 67 mutex_unlock(&node->i_mutex); 68 } 69 70 static inline void 71 remove_from_collection(struct sysfs_buffer *buffer, struct inode *node) 72 { 73 mutex_lock(&node->i_mutex); 74 list_del(&buffer->associates); 75 mutex_unlock(&node->i_mutex); 76 } 77 78 /** 79 * fill_read_buffer - allocate and fill buffer from object. 80 * @dentry: dentry pointer. 81 * @buffer: data buffer for file. 82 * 83 * Allocate @buffer->page, if it hasn't been already, then call the 84 * kobject's show() method to fill the buffer with this attribute's 85 * data. 86 * This is called only once, on the file's first read unless an error 87 * is returned. 88 */ 89 static int fill_read_buffer(struct dentry * dentry, struct sysfs_buffer * buffer) 90 { 91 struct sysfs_dirent * sd = dentry->d_fsdata; 92 struct attribute * attr = to_attr(dentry); 93 struct kobject * kobj = to_kobj(dentry->d_parent); 94 struct sysfs_ops * ops = buffer->ops; 95 int ret = 0; 96 ssize_t count; 97 98 if (!buffer->page) 99 buffer->page = (char *) get_zeroed_page(GFP_KERNEL); 100 if (!buffer->page) 101 return -ENOMEM; 102 103 buffer->event = atomic_read(&sd->s_event); 104 count = ops->show(kobj,attr,buffer->page); 105 BUG_ON(count > (ssize_t)PAGE_SIZE); 106 if (count >= 0) { 107 buffer->needs_read_fill = 0; 108 buffer->count = count; 109 } else { 110 ret = count; 111 } 112 return ret; 113 } 114 115 116 /** 117 * flush_read_buffer - push buffer to userspace. 118 * @buffer: data buffer for file. 119 * @buf: user-passed buffer. 120 * @count: number of bytes requested. 121 * @ppos: file position. 122 * 123 * Copy the buffer we filled in fill_read_buffer() to userspace. 124 * This is done at the reader's leisure, copying and advancing 125 * the amount they specify each time. 126 * This may be called continuously until the buffer is empty. 127 */ 128 static int flush_read_buffer(struct sysfs_buffer * buffer, char __user * buf, 129 size_t count, loff_t * ppos) 130 { 131 int error; 132 133 if (*ppos > buffer->count) 134 return 0; 135 136 if (count > (buffer->count - *ppos)) 137 count = buffer->count - *ppos; 138 139 error = copy_to_user(buf,buffer->page + *ppos,count); 140 if (!error) 141 *ppos += count; 142 return error ? -EFAULT : count; 143 } 144 145 /** 146 * sysfs_read_file - read an attribute. 147 * @file: file pointer. 148 * @buf: buffer to fill. 149 * @count: number of bytes to read. 150 * @ppos: starting offset in file. 151 * 152 * Userspace wants to read an attribute file. The attribute descriptor 153 * is in the file's ->d_fsdata. The target object is in the directory's 154 * ->d_fsdata. 155 * 156 * We call fill_read_buffer() to allocate and fill the buffer from the 157 * object's show() method exactly once (if the read is happening from 158 * the beginning of the file). That should fill the entire buffer with 159 * all the data the object has to offer for that attribute. 160 * We then call flush_read_buffer() to copy the buffer to userspace 161 * in the increments specified. 162 */ 163 164 static ssize_t 165 sysfs_read_file(struct file *file, char __user *buf, size_t count, loff_t *ppos) 166 { 167 struct sysfs_buffer * buffer = file->private_data; 168 ssize_t retval = 0; 169 170 down(&buffer->sem); 171 if (buffer->orphaned) { 172 retval = -ENODEV; 173 goto out; 174 } 175 if (buffer->needs_read_fill) { 176 if ((retval = fill_read_buffer(file->f_path.dentry,buffer))) 177 goto out; 178 } 179 pr_debug("%s: count = %zd, ppos = %lld, buf = %s\n", 180 __FUNCTION__, count, *ppos, buffer->page); 181 retval = flush_read_buffer(buffer,buf,count,ppos); 182 out: 183 up(&buffer->sem); 184 return retval; 185 } 186 187 /** 188 * fill_write_buffer - copy buffer from userspace. 189 * @buffer: data buffer for file. 190 * @buf: data from user. 191 * @count: number of bytes in @userbuf. 192 * 193 * Allocate @buffer->page if it hasn't been already, then 194 * copy the user-supplied buffer into it. 195 */ 196 197 static int 198 fill_write_buffer(struct sysfs_buffer * buffer, const char __user * buf, size_t count) 199 { 200 int error; 201 202 if (!buffer->page) 203 buffer->page = (char *)get_zeroed_page(GFP_KERNEL); 204 if (!buffer->page) 205 return -ENOMEM; 206 207 if (count >= PAGE_SIZE) 208 count = PAGE_SIZE - 1; 209 error = copy_from_user(buffer->page,buf,count); 210 buffer->needs_read_fill = 1; 211 /* if buf is assumed to contain a string, terminate it by \0, 212 so e.g. sscanf() can scan the string easily */ 213 buffer->page[count] = 0; 214 return error ? -EFAULT : count; 215 } 216 217 218 /** 219 * flush_write_buffer - push buffer to kobject. 220 * @dentry: dentry to the attribute 221 * @buffer: data buffer for file. 222 * @count: number of bytes 223 * 224 * Get the correct pointers for the kobject and the attribute we're 225 * dealing with, then call the store() method for the attribute, 226 * passing the buffer that we acquired in fill_write_buffer(). 227 */ 228 229 static int 230 flush_write_buffer(struct dentry * dentry, struct sysfs_buffer * buffer, size_t count) 231 { 232 struct attribute * attr = to_attr(dentry); 233 struct kobject * kobj = to_kobj(dentry->d_parent); 234 struct sysfs_ops * ops = buffer->ops; 235 236 return ops->store(kobj,attr,buffer->page,count); 237 } 238 239 240 /** 241 * sysfs_write_file - write an attribute. 242 * @file: file pointer 243 * @buf: data to write 244 * @count: number of bytes 245 * @ppos: starting offset 246 * 247 * Similar to sysfs_read_file(), though working in the opposite direction. 248 * We allocate and fill the data from the user in fill_write_buffer(), 249 * then push it to the kobject in flush_write_buffer(). 250 * There is no easy way for us to know if userspace is only doing a partial 251 * write, so we don't support them. We expect the entire buffer to come 252 * on the first write. 253 * Hint: if you're writing a value, first read the file, modify only the 254 * the value you're changing, then write entire buffer back. 255 */ 256 257 static ssize_t 258 sysfs_write_file(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 259 { 260 struct sysfs_buffer * buffer = file->private_data; 261 ssize_t len; 262 263 down(&buffer->sem); 264 if (buffer->orphaned) { 265 len = -ENODEV; 266 goto out; 267 } 268 len = fill_write_buffer(buffer, buf, count); 269 if (len > 0) 270 len = flush_write_buffer(file->f_path.dentry, buffer, len); 271 if (len > 0) 272 *ppos += len; 273 out: 274 up(&buffer->sem); 275 return len; 276 } 277 278 static int sysfs_open_file(struct inode *inode, struct file *file) 279 { 280 struct kobject *kobj = sysfs_get_kobject(file->f_path.dentry->d_parent); 281 struct attribute * attr = to_attr(file->f_path.dentry); 282 struct sysfs_buffer_collection *set; 283 struct sysfs_buffer * buffer; 284 struct sysfs_ops * ops = NULL; 285 int error = 0; 286 287 if (!kobj || !attr) 288 goto Einval; 289 290 /* Grab the module reference for this attribute if we have one */ 291 if (!try_module_get(attr->owner)) { 292 error = -ENODEV; 293 goto Done; 294 } 295 296 /* if the kobject has no ktype, then we assume that it is a subsystem 297 * itself, and use ops for it. 298 */ 299 if (kobj->kset && kobj->kset->ktype) 300 ops = kobj->kset->ktype->sysfs_ops; 301 else if (kobj->ktype) 302 ops = kobj->ktype->sysfs_ops; 303 else 304 ops = &subsys_sysfs_ops; 305 306 /* No sysfs operations, either from having no subsystem, 307 * or the subsystem have no operations. 308 */ 309 if (!ops) 310 goto Eaccess; 311 312 /* make sure we have a collection to add our buffers to */ 313 mutex_lock(&inode->i_mutex); 314 if (!(set = inode->i_private)) { 315 if (!(set = inode->i_private = kmalloc(sizeof(struct sysfs_buffer_collection), GFP_KERNEL))) { 316 error = -ENOMEM; 317 goto Done; 318 } else { 319 INIT_LIST_HEAD(&set->associates); 320 } 321 } 322 mutex_unlock(&inode->i_mutex); 323 324 /* File needs write support. 325 * The inode's perms must say it's ok, 326 * and we must have a store method. 327 */ 328 if (file->f_mode & FMODE_WRITE) { 329 330 if (!(inode->i_mode & S_IWUGO) || !ops->store) 331 goto Eaccess; 332 333 } 334 335 /* File needs read support. 336 * The inode's perms must say it's ok, and we there 337 * must be a show method for it. 338 */ 339 if (file->f_mode & FMODE_READ) { 340 if (!(inode->i_mode & S_IRUGO) || !ops->show) 341 goto Eaccess; 342 } 343 344 /* No error? Great, allocate a buffer for the file, and store it 345 * it in file->private_data for easy access. 346 */ 347 buffer = kzalloc(sizeof(struct sysfs_buffer), GFP_KERNEL); 348 if (buffer) { 349 INIT_LIST_HEAD(&buffer->associates); 350 init_MUTEX(&buffer->sem); 351 buffer->needs_read_fill = 1; 352 buffer->ops = ops; 353 add_to_collection(buffer, inode); 354 file->private_data = buffer; 355 } else 356 error = -ENOMEM; 357 goto Done; 358 359 Einval: 360 error = -EINVAL; 361 goto Done; 362 Eaccess: 363 error = -EACCES; 364 module_put(attr->owner); 365 Done: 366 if (error) 367 kobject_put(kobj); 368 return error; 369 } 370 371 static int sysfs_release(struct inode * inode, struct file * filp) 372 { 373 struct kobject * kobj = to_kobj(filp->f_path.dentry->d_parent); 374 struct attribute * attr = to_attr(filp->f_path.dentry); 375 struct module * owner = attr->owner; 376 struct sysfs_buffer * buffer = filp->private_data; 377 378 if (buffer) 379 remove_from_collection(buffer, inode); 380 kobject_put(kobj); 381 /* After this point, attr should not be accessed. */ 382 module_put(owner); 383 384 if (buffer) { 385 if (buffer->page) 386 free_page((unsigned long)buffer->page); 387 kfree(buffer); 388 } 389 return 0; 390 } 391 392 /* Sysfs attribute files are pollable. The idea is that you read 393 * the content and then you use 'poll' or 'select' to wait for 394 * the content to change. When the content changes (assuming the 395 * manager for the kobject supports notification), poll will 396 * return POLLERR|POLLPRI, and select will return the fd whether 397 * it is waiting for read, write, or exceptions. 398 * Once poll/select indicates that the value has changed, you 399 * need to close and re-open the file, as simply seeking and reading 400 * again will not get new data, or reset the state of 'poll'. 401 * Reminder: this only works for attributes which actively support 402 * it, and it is not possible to test an attribute from userspace 403 * to see if it supports poll (Nether 'poll' or 'select' return 404 * an appropriate error code). When in doubt, set a suitable timeout value. 405 */ 406 static unsigned int sysfs_poll(struct file *filp, poll_table *wait) 407 { 408 struct sysfs_buffer * buffer = filp->private_data; 409 struct kobject * kobj = to_kobj(filp->f_path.dentry->d_parent); 410 struct sysfs_dirent * sd = filp->f_path.dentry->d_fsdata; 411 int res = 0; 412 413 poll_wait(filp, &kobj->poll, wait); 414 415 if (buffer->event != atomic_read(&sd->s_event)) { 416 res = POLLERR|POLLPRI; 417 buffer->needs_read_fill = 1; 418 } 419 420 return res; 421 } 422 423 424 static struct dentry *step_down(struct dentry *dir, const char * name) 425 { 426 struct dentry * de; 427 428 if (dir == NULL || dir->d_inode == NULL) 429 return NULL; 430 431 mutex_lock(&dir->d_inode->i_mutex); 432 de = lookup_one_len(name, dir, strlen(name)); 433 mutex_unlock(&dir->d_inode->i_mutex); 434 dput(dir); 435 if (IS_ERR(de)) 436 return NULL; 437 if (de->d_inode == NULL) { 438 dput(de); 439 return NULL; 440 } 441 return de; 442 } 443 444 void sysfs_notify(struct kobject * k, char *dir, char *attr) 445 { 446 struct dentry *de = k->dentry; 447 if (de) 448 dget(de); 449 if (de && dir) 450 de = step_down(de, dir); 451 if (de && attr) 452 de = step_down(de, attr); 453 if (de) { 454 struct sysfs_dirent * sd = de->d_fsdata; 455 if (sd) 456 atomic_inc(&sd->s_event); 457 wake_up_interruptible(&k->poll); 458 dput(de); 459 } 460 } 461 EXPORT_SYMBOL_GPL(sysfs_notify); 462 463 const struct file_operations sysfs_file_operations = { 464 .read = sysfs_read_file, 465 .write = sysfs_write_file, 466 .llseek = generic_file_llseek, 467 .open = sysfs_open_file, 468 .release = sysfs_release, 469 .poll = sysfs_poll, 470 }; 471 472 473 int sysfs_add_file(struct dentry * dir, const struct attribute * attr, int type) 474 { 475 struct sysfs_dirent * parent_sd = dir->d_fsdata; 476 umode_t mode = (attr->mode & S_IALLUGO) | S_IFREG; 477 int error = -EEXIST; 478 479 mutex_lock(&dir->d_inode->i_mutex); 480 if (!sysfs_dirent_exist(parent_sd, attr->name)) 481 error = sysfs_make_dirent(parent_sd, NULL, (void *)attr, 482 mode, type); 483 mutex_unlock(&dir->d_inode->i_mutex); 484 485 return error; 486 } 487 488 489 /** 490 * sysfs_create_file - create an attribute file for an object. 491 * @kobj: object we're creating for. 492 * @attr: atrribute descriptor. 493 */ 494 495 int sysfs_create_file(struct kobject * kobj, const struct attribute * attr) 496 { 497 BUG_ON(!kobj || !kobj->dentry || !attr); 498 499 return sysfs_add_file(kobj->dentry, attr, SYSFS_KOBJ_ATTR); 500 501 } 502 503 504 /** 505 * sysfs_update_file - update the modified timestamp on an object attribute. 506 * @kobj: object we're acting for. 507 * @attr: attribute descriptor. 508 */ 509 int sysfs_update_file(struct kobject * kobj, const struct attribute * attr) 510 { 511 struct dentry * dir = kobj->dentry; 512 struct dentry * victim; 513 int res = -ENOENT; 514 515 mutex_lock(&dir->d_inode->i_mutex); 516 victim = lookup_one_len(attr->name, dir, strlen(attr->name)); 517 if (!IS_ERR(victim)) { 518 /* make sure dentry is really there */ 519 if (victim->d_inode && 520 (victim->d_parent->d_inode == dir->d_inode)) { 521 victim->d_inode->i_mtime = CURRENT_TIME; 522 fsnotify_modify(victim); 523 res = 0; 524 } else 525 d_drop(victim); 526 527 /** 528 * Drop the reference acquired from lookup_one_len() above. 529 */ 530 dput(victim); 531 } 532 mutex_unlock(&dir->d_inode->i_mutex); 533 534 return res; 535 } 536 537 538 /** 539 * sysfs_chmod_file - update the modified mode value on an object attribute. 540 * @kobj: object we're acting for. 541 * @attr: attribute descriptor. 542 * @mode: file permissions. 543 * 544 */ 545 int sysfs_chmod_file(struct kobject *kobj, struct attribute *attr, mode_t mode) 546 { 547 struct dentry *dir = kobj->dentry; 548 struct dentry *victim; 549 struct inode * inode; 550 struct iattr newattrs; 551 int res = -ENOENT; 552 553 mutex_lock(&dir->d_inode->i_mutex); 554 victim = lookup_one_len(attr->name, dir, strlen(attr->name)); 555 if (!IS_ERR(victim)) { 556 if (victim->d_inode && 557 (victim->d_parent->d_inode == dir->d_inode)) { 558 inode = victim->d_inode; 559 mutex_lock(&inode->i_mutex); 560 newattrs.ia_mode = (mode & S_IALLUGO) | 561 (inode->i_mode & ~S_IALLUGO); 562 newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; 563 res = notify_change(victim, &newattrs); 564 mutex_unlock(&inode->i_mutex); 565 } 566 dput(victim); 567 } 568 mutex_unlock(&dir->d_inode->i_mutex); 569 570 return res; 571 } 572 EXPORT_SYMBOL_GPL(sysfs_chmod_file); 573 574 575 /** 576 * sysfs_remove_file - remove an object attribute. 577 * @kobj: object we're acting for. 578 * @attr: attribute descriptor. 579 * 580 * Hash the attribute name and kill the victim. 581 */ 582 583 void sysfs_remove_file(struct kobject * kobj, const struct attribute * attr) 584 { 585 sysfs_hash_and_remove(kobj->dentry, attr->name); 586 } 587 588 589 EXPORT_SYMBOL_GPL(sysfs_create_file); 590 EXPORT_SYMBOL_GPL(sysfs_remove_file); 591 EXPORT_SYMBOL_GPL(sysfs_update_file); 592