1 /* 2 * fs/sysfs/dir.c - sysfs core and dir operation 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 #undef DEBUG 14 15 #include <linux/fs.h> 16 #include <linux/mount.h> 17 #include <linux/module.h> 18 #include <linux/kobject.h> 19 #include <linux/namei.h> 20 #include <linux/idr.h> 21 #include <linux/completion.h> 22 #include <linux/mutex.h> 23 #include <linux/slab.h> 24 #include <linux/security.h> 25 #include "sysfs.h" 26 27 DEFINE_MUTEX(sysfs_mutex); 28 DEFINE_MUTEX(sysfs_rename_mutex); 29 DEFINE_SPINLOCK(sysfs_assoc_lock); 30 31 static DEFINE_SPINLOCK(sysfs_ino_lock); 32 static DEFINE_IDA(sysfs_ino_ida); 33 34 /** 35 * sysfs_link_sibling - link sysfs_dirent into sibling list 36 * @sd: sysfs_dirent of interest 37 * 38 * Link @sd into its sibling list which starts from 39 * sd->s_parent->s_dir.children. 40 * 41 * Locking: 42 * mutex_lock(sysfs_mutex) 43 */ 44 static void sysfs_link_sibling(struct sysfs_dirent *sd) 45 { 46 struct sysfs_dirent *parent_sd = sd->s_parent; 47 struct sysfs_dirent **pos; 48 49 BUG_ON(sd->s_sibling); 50 51 /* Store directory entries in order by ino. This allows 52 * readdir to properly restart without having to add a 53 * cursor into the s_dir.children list. 54 */ 55 for (pos = &parent_sd->s_dir.children; *pos; pos = &(*pos)->s_sibling) { 56 if (sd->s_ino < (*pos)->s_ino) 57 break; 58 } 59 sd->s_sibling = *pos; 60 *pos = sd; 61 } 62 63 /** 64 * sysfs_unlink_sibling - unlink sysfs_dirent from sibling list 65 * @sd: sysfs_dirent of interest 66 * 67 * Unlink @sd from its sibling list which starts from 68 * sd->s_parent->s_dir.children. 69 * 70 * Locking: 71 * mutex_lock(sysfs_mutex) 72 */ 73 static void sysfs_unlink_sibling(struct sysfs_dirent *sd) 74 { 75 struct sysfs_dirent **pos; 76 77 for (pos = &sd->s_parent->s_dir.children; *pos; 78 pos = &(*pos)->s_sibling) { 79 if (*pos == sd) { 80 *pos = sd->s_sibling; 81 sd->s_sibling = NULL; 82 break; 83 } 84 } 85 } 86 87 /** 88 * sysfs_get_dentry - get dentry for the given sysfs_dirent 89 * @sd: sysfs_dirent of interest 90 * 91 * Get dentry for @sd. Dentry is looked up if currently not 92 * present. This function descends from the root looking up 93 * dentry for each step. 94 * 95 * LOCKING: 96 * mutex_lock(sysfs_rename_mutex) 97 * 98 * RETURNS: 99 * Pointer to found dentry on success, ERR_PTR() value on error. 100 */ 101 struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd) 102 { 103 struct dentry *dentry = dget(sysfs_sb->s_root); 104 105 while (dentry->d_fsdata != sd) { 106 struct sysfs_dirent *cur; 107 struct dentry *parent; 108 109 /* find the first ancestor which hasn't been looked up */ 110 cur = sd; 111 while (cur->s_parent != dentry->d_fsdata) 112 cur = cur->s_parent; 113 114 /* look it up */ 115 parent = dentry; 116 mutex_lock(&parent->d_inode->i_mutex); 117 dentry = lookup_one_noperm(cur->s_name, parent); 118 mutex_unlock(&parent->d_inode->i_mutex); 119 dput(parent); 120 121 if (IS_ERR(dentry)) 122 break; 123 } 124 return dentry; 125 } 126 127 /** 128 * sysfs_get_active - get an active reference to sysfs_dirent 129 * @sd: sysfs_dirent to get an active reference to 130 * 131 * Get an active reference of @sd. This function is noop if @sd 132 * is NULL. 133 * 134 * RETURNS: 135 * Pointer to @sd on success, NULL on failure. 136 */ 137 static struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd) 138 { 139 if (unlikely(!sd)) 140 return NULL; 141 142 while (1) { 143 int v, t; 144 145 v = atomic_read(&sd->s_active); 146 if (unlikely(v < 0)) 147 return NULL; 148 149 t = atomic_cmpxchg(&sd->s_active, v, v + 1); 150 if (likely(t == v)) 151 return sd; 152 if (t < 0) 153 return NULL; 154 155 cpu_relax(); 156 } 157 } 158 159 /** 160 * sysfs_put_active - put an active reference to sysfs_dirent 161 * @sd: sysfs_dirent to put an active reference to 162 * 163 * Put an active reference to @sd. This function is noop if @sd 164 * is NULL. 165 */ 166 static void sysfs_put_active(struct sysfs_dirent *sd) 167 { 168 struct completion *cmpl; 169 int v; 170 171 if (unlikely(!sd)) 172 return; 173 174 v = atomic_dec_return(&sd->s_active); 175 if (likely(v != SD_DEACTIVATED_BIAS)) 176 return; 177 178 /* atomic_dec_return() is a mb(), we'll always see the updated 179 * sd->s_sibling. 180 */ 181 cmpl = (void *)sd->s_sibling; 182 complete(cmpl); 183 } 184 185 /** 186 * sysfs_get_active_two - get active references to sysfs_dirent and parent 187 * @sd: sysfs_dirent of interest 188 * 189 * Get active reference to @sd and its parent. Parent's active 190 * reference is grabbed first. This function is noop if @sd is 191 * NULL. 192 * 193 * RETURNS: 194 * Pointer to @sd on success, NULL on failure. 195 */ 196 struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd) 197 { 198 if (sd) { 199 if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent))) 200 return NULL; 201 if (unlikely(!sysfs_get_active(sd))) { 202 sysfs_put_active(sd->s_parent); 203 return NULL; 204 } 205 } 206 return sd; 207 } 208 209 /** 210 * sysfs_put_active_two - put active references to sysfs_dirent and parent 211 * @sd: sysfs_dirent of interest 212 * 213 * Put active references to @sd and its parent. This function is 214 * noop if @sd is NULL. 215 */ 216 void sysfs_put_active_two(struct sysfs_dirent *sd) 217 { 218 if (sd) { 219 sysfs_put_active(sd); 220 sysfs_put_active(sd->s_parent); 221 } 222 } 223 224 /** 225 * sysfs_deactivate - deactivate sysfs_dirent 226 * @sd: sysfs_dirent to deactivate 227 * 228 * Deny new active references and drain existing ones. 229 */ 230 static void sysfs_deactivate(struct sysfs_dirent *sd) 231 { 232 DECLARE_COMPLETION_ONSTACK(wait); 233 int v; 234 235 BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED)); 236 sd->s_sibling = (void *)&wait; 237 238 /* atomic_add_return() is a mb(), put_active() will always see 239 * the updated sd->s_sibling. 240 */ 241 v = atomic_add_return(SD_DEACTIVATED_BIAS, &sd->s_active); 242 243 if (v != SD_DEACTIVATED_BIAS) 244 wait_for_completion(&wait); 245 246 sd->s_sibling = NULL; 247 } 248 249 static int sysfs_alloc_ino(ino_t *pino) 250 { 251 int ino, rc; 252 253 retry: 254 spin_lock(&sysfs_ino_lock); 255 rc = ida_get_new_above(&sysfs_ino_ida, 2, &ino); 256 spin_unlock(&sysfs_ino_lock); 257 258 if (rc == -EAGAIN) { 259 if (ida_pre_get(&sysfs_ino_ida, GFP_KERNEL)) 260 goto retry; 261 rc = -ENOMEM; 262 } 263 264 *pino = ino; 265 return rc; 266 } 267 268 static void sysfs_free_ino(ino_t ino) 269 { 270 spin_lock(&sysfs_ino_lock); 271 ida_remove(&sysfs_ino_ida, ino); 272 spin_unlock(&sysfs_ino_lock); 273 } 274 275 void release_sysfs_dirent(struct sysfs_dirent * sd) 276 { 277 struct sysfs_dirent *parent_sd; 278 279 repeat: 280 /* Moving/renaming is always done while holding reference. 281 * sd->s_parent won't change beneath us. 282 */ 283 parent_sd = sd->s_parent; 284 285 if (sysfs_type(sd) == SYSFS_KOBJ_LINK) 286 sysfs_put(sd->s_symlink.target_sd); 287 if (sysfs_type(sd) & SYSFS_COPY_NAME) 288 kfree(sd->s_name); 289 if (sd->s_iattr && sd->s_iattr->ia_secdata) 290 security_release_secctx(sd->s_iattr->ia_secdata, 291 sd->s_iattr->ia_secdata_len); 292 kfree(sd->s_iattr); 293 sysfs_free_ino(sd->s_ino); 294 kmem_cache_free(sysfs_dir_cachep, sd); 295 296 sd = parent_sd; 297 if (sd && atomic_dec_and_test(&sd->s_count)) 298 goto repeat; 299 } 300 301 static void sysfs_d_iput(struct dentry * dentry, struct inode * inode) 302 { 303 struct sysfs_dirent * sd = dentry->d_fsdata; 304 305 sysfs_put(sd); 306 iput(inode); 307 } 308 309 static const struct dentry_operations sysfs_dentry_ops = { 310 .d_iput = sysfs_d_iput, 311 }; 312 313 struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type) 314 { 315 char *dup_name = NULL; 316 struct sysfs_dirent *sd; 317 318 if (type & SYSFS_COPY_NAME) { 319 name = dup_name = kstrdup(name, GFP_KERNEL); 320 if (!name) 321 return NULL; 322 } 323 324 sd = kmem_cache_zalloc(sysfs_dir_cachep, GFP_KERNEL); 325 if (!sd) 326 goto err_out1; 327 328 if (sysfs_alloc_ino(&sd->s_ino)) 329 goto err_out2; 330 331 atomic_set(&sd->s_count, 1); 332 atomic_set(&sd->s_active, 0); 333 334 sd->s_name = name; 335 sd->s_mode = mode; 336 sd->s_flags = type; 337 338 return sd; 339 340 err_out2: 341 kmem_cache_free(sysfs_dir_cachep, sd); 342 err_out1: 343 kfree(dup_name); 344 return NULL; 345 } 346 347 static int sysfs_ilookup_test(struct inode *inode, void *arg) 348 { 349 struct sysfs_dirent *sd = arg; 350 return inode->i_ino == sd->s_ino; 351 } 352 353 /** 354 * sysfs_addrm_start - prepare for sysfs_dirent add/remove 355 * @acxt: pointer to sysfs_addrm_cxt to be used 356 * @parent_sd: parent sysfs_dirent 357 * 358 * This function is called when the caller is about to add or 359 * remove sysfs_dirent under @parent_sd. This function acquires 360 * sysfs_mutex, grabs inode for @parent_sd if available and lock 361 * i_mutex of it. @acxt is used to keep and pass context to 362 * other addrm functions. 363 * 364 * LOCKING: 365 * Kernel thread context (may sleep). sysfs_mutex is locked on 366 * return. i_mutex of parent inode is locked on return if 367 * available. 368 */ 369 void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt, 370 struct sysfs_dirent *parent_sd) 371 { 372 struct inode *inode; 373 374 memset(acxt, 0, sizeof(*acxt)); 375 acxt->parent_sd = parent_sd; 376 377 /* Lookup parent inode. inode initialization is protected by 378 * sysfs_mutex, so inode existence can be determined by 379 * looking up inode while holding sysfs_mutex. 380 */ 381 mutex_lock(&sysfs_mutex); 382 383 inode = ilookup5(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test, 384 parent_sd); 385 if (inode) { 386 WARN_ON(inode->i_state & I_NEW); 387 388 /* parent inode available */ 389 acxt->parent_inode = inode; 390 391 /* sysfs_mutex is below i_mutex in lock hierarchy. 392 * First, trylock i_mutex. If fails, unlock 393 * sysfs_mutex and lock them in order. 394 */ 395 if (!mutex_trylock(&inode->i_mutex)) { 396 mutex_unlock(&sysfs_mutex); 397 mutex_lock(&inode->i_mutex); 398 mutex_lock(&sysfs_mutex); 399 } 400 } 401 } 402 403 /** 404 * __sysfs_add_one - add sysfs_dirent to parent without warning 405 * @acxt: addrm context to use 406 * @sd: sysfs_dirent to be added 407 * 408 * Get @acxt->parent_sd and set sd->s_parent to it and increment 409 * nlink of parent inode if @sd is a directory and link into the 410 * children list of the parent. 411 * 412 * This function should be called between calls to 413 * sysfs_addrm_start() and sysfs_addrm_finish() and should be 414 * passed the same @acxt as passed to sysfs_addrm_start(). 415 * 416 * LOCKING: 417 * Determined by sysfs_addrm_start(). 418 * 419 * RETURNS: 420 * 0 on success, -EEXIST if entry with the given name already 421 * exists. 422 */ 423 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) 424 { 425 if (sysfs_find_dirent(acxt->parent_sd, sd->s_name)) 426 return -EEXIST; 427 428 sd->s_parent = sysfs_get(acxt->parent_sd); 429 430 if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode) 431 inc_nlink(acxt->parent_inode); 432 433 acxt->cnt++; 434 435 sysfs_link_sibling(sd); 436 437 return 0; 438 } 439 440 /** 441 * sysfs_pathname - return full path to sysfs dirent 442 * @sd: sysfs_dirent whose path we want 443 * @path: caller allocated buffer 444 * 445 * Gives the name "/" to the sysfs_root entry; any path returned 446 * is relative to wherever sysfs is mounted. 447 * 448 * XXX: does no error checking on @path size 449 */ 450 static char *sysfs_pathname(struct sysfs_dirent *sd, char *path) 451 { 452 if (sd->s_parent) { 453 sysfs_pathname(sd->s_parent, path); 454 strcat(path, "/"); 455 } 456 strcat(path, sd->s_name); 457 return path; 458 } 459 460 /** 461 * sysfs_add_one - add sysfs_dirent to parent 462 * @acxt: addrm context to use 463 * @sd: sysfs_dirent to be added 464 * 465 * Get @acxt->parent_sd and set sd->s_parent to it and increment 466 * nlink of parent inode if @sd is a directory and link into the 467 * children list of the parent. 468 * 469 * This function should be called between calls to 470 * sysfs_addrm_start() and sysfs_addrm_finish() and should be 471 * passed the same @acxt as passed to sysfs_addrm_start(). 472 * 473 * LOCKING: 474 * Determined by sysfs_addrm_start(). 475 * 476 * RETURNS: 477 * 0 on success, -EEXIST if entry with the given name already 478 * exists. 479 */ 480 int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) 481 { 482 int ret; 483 484 ret = __sysfs_add_one(acxt, sd); 485 if (ret == -EEXIST) { 486 char *path = kzalloc(PATH_MAX, GFP_KERNEL); 487 WARN(1, KERN_WARNING 488 "sysfs: cannot create duplicate filename '%s'\n", 489 (path == NULL) ? sd->s_name : 490 strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"), 491 sd->s_name)); 492 kfree(path); 493 } 494 495 return ret; 496 } 497 498 /** 499 * sysfs_remove_one - remove sysfs_dirent from parent 500 * @acxt: addrm context to use 501 * @sd: sysfs_dirent to be removed 502 * 503 * Mark @sd removed and drop nlink of parent inode if @sd is a 504 * directory. @sd is unlinked from the children list. 505 * 506 * This function should be called between calls to 507 * sysfs_addrm_start() and sysfs_addrm_finish() and should be 508 * passed the same @acxt as passed to sysfs_addrm_start(). 509 * 510 * LOCKING: 511 * Determined by sysfs_addrm_start(). 512 */ 513 void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd) 514 { 515 BUG_ON(sd->s_flags & SYSFS_FLAG_REMOVED); 516 517 sysfs_unlink_sibling(sd); 518 519 sd->s_flags |= SYSFS_FLAG_REMOVED; 520 sd->s_sibling = acxt->removed; 521 acxt->removed = sd; 522 523 if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode) 524 drop_nlink(acxt->parent_inode); 525 526 acxt->cnt++; 527 } 528 529 /** 530 * sysfs_drop_dentry - drop dentry for the specified sysfs_dirent 531 * @sd: target sysfs_dirent 532 * 533 * Drop dentry for @sd. @sd must have been unlinked from its 534 * parent on entry to this function such that it can't be looked 535 * up anymore. 536 */ 537 static void sysfs_drop_dentry(struct sysfs_dirent *sd) 538 { 539 struct inode *inode; 540 struct dentry *dentry; 541 542 inode = ilookup(sysfs_sb, sd->s_ino); 543 if (!inode) 544 return; 545 546 /* Drop any existing dentries associated with sd. 547 * 548 * For the dentry to be properly freed we need to grab a 549 * reference to the dentry under the dcache lock, unhash it, 550 * and then put it. The playing with the dentry count allows 551 * dput to immediately free the dentry if it is not in use. 552 */ 553 repeat: 554 spin_lock(&dcache_lock); 555 list_for_each_entry(dentry, &inode->i_dentry, d_alias) { 556 if (d_unhashed(dentry)) 557 continue; 558 dget_locked(dentry); 559 spin_lock(&dentry->d_lock); 560 __d_drop(dentry); 561 spin_unlock(&dentry->d_lock); 562 spin_unlock(&dcache_lock); 563 dput(dentry); 564 goto repeat; 565 } 566 spin_unlock(&dcache_lock); 567 568 /* adjust nlink and update timestamp */ 569 mutex_lock(&inode->i_mutex); 570 571 inode->i_ctime = CURRENT_TIME; 572 drop_nlink(inode); 573 if (sysfs_type(sd) == SYSFS_DIR) 574 drop_nlink(inode); 575 576 mutex_unlock(&inode->i_mutex); 577 578 iput(inode); 579 } 580 581 /** 582 * sysfs_addrm_finish - finish up sysfs_dirent add/remove 583 * @acxt: addrm context to finish up 584 * 585 * Finish up sysfs_dirent add/remove. Resources acquired by 586 * sysfs_addrm_start() are released and removed sysfs_dirents are 587 * cleaned up. Timestamps on the parent inode are updated. 588 * 589 * LOCKING: 590 * All mutexes acquired by sysfs_addrm_start() are released. 591 */ 592 void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt) 593 { 594 /* release resources acquired by sysfs_addrm_start() */ 595 mutex_unlock(&sysfs_mutex); 596 if (acxt->parent_inode) { 597 struct inode *inode = acxt->parent_inode; 598 599 /* if added/removed, update timestamps on the parent */ 600 if (acxt->cnt) 601 inode->i_ctime = inode->i_mtime = CURRENT_TIME; 602 603 mutex_unlock(&inode->i_mutex); 604 iput(inode); 605 } 606 607 /* kill removed sysfs_dirents */ 608 while (acxt->removed) { 609 struct sysfs_dirent *sd = acxt->removed; 610 611 acxt->removed = sd->s_sibling; 612 sd->s_sibling = NULL; 613 614 sysfs_drop_dentry(sd); 615 sysfs_deactivate(sd); 616 unmap_bin_file(sd); 617 sysfs_put(sd); 618 } 619 } 620 621 /** 622 * sysfs_find_dirent - find sysfs_dirent with the given name 623 * @parent_sd: sysfs_dirent to search under 624 * @name: name to look for 625 * 626 * Look for sysfs_dirent with name @name under @parent_sd. 627 * 628 * LOCKING: 629 * mutex_lock(sysfs_mutex) 630 * 631 * RETURNS: 632 * Pointer to sysfs_dirent if found, NULL if not. 633 */ 634 struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd, 635 const unsigned char *name) 636 { 637 struct sysfs_dirent *sd; 638 639 for (sd = parent_sd->s_dir.children; sd; sd = sd->s_sibling) 640 if (!strcmp(sd->s_name, name)) 641 return sd; 642 return NULL; 643 } 644 645 /** 646 * sysfs_get_dirent - find and get sysfs_dirent with the given name 647 * @parent_sd: sysfs_dirent to search under 648 * @name: name to look for 649 * 650 * Look for sysfs_dirent with name @name under @parent_sd and get 651 * it if found. 652 * 653 * LOCKING: 654 * Kernel thread context (may sleep). Grabs sysfs_mutex. 655 * 656 * RETURNS: 657 * Pointer to sysfs_dirent if found, NULL if not. 658 */ 659 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd, 660 const unsigned char *name) 661 { 662 struct sysfs_dirent *sd; 663 664 mutex_lock(&sysfs_mutex); 665 sd = sysfs_find_dirent(parent_sd, name); 666 sysfs_get(sd); 667 mutex_unlock(&sysfs_mutex); 668 669 return sd; 670 } 671 EXPORT_SYMBOL_GPL(sysfs_get_dirent); 672 673 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd, 674 const char *name, struct sysfs_dirent **p_sd) 675 { 676 umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO; 677 struct sysfs_addrm_cxt acxt; 678 struct sysfs_dirent *sd; 679 int rc; 680 681 /* allocate */ 682 sd = sysfs_new_dirent(name, mode, SYSFS_DIR); 683 if (!sd) 684 return -ENOMEM; 685 sd->s_dir.kobj = kobj; 686 687 /* link in */ 688 sysfs_addrm_start(&acxt, parent_sd); 689 rc = sysfs_add_one(&acxt, sd); 690 sysfs_addrm_finish(&acxt); 691 692 if (rc == 0) 693 *p_sd = sd; 694 else 695 sysfs_put(sd); 696 697 return rc; 698 } 699 700 int sysfs_create_subdir(struct kobject *kobj, const char *name, 701 struct sysfs_dirent **p_sd) 702 { 703 return create_dir(kobj, kobj->sd, name, p_sd); 704 } 705 706 /** 707 * sysfs_create_dir - create a directory for an object. 708 * @kobj: object we're creating directory for. 709 */ 710 int sysfs_create_dir(struct kobject * kobj) 711 { 712 struct sysfs_dirent *parent_sd, *sd; 713 int error = 0; 714 715 BUG_ON(!kobj); 716 717 if (kobj->parent) 718 parent_sd = kobj->parent->sd; 719 else 720 parent_sd = &sysfs_root; 721 722 error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd); 723 if (!error) 724 kobj->sd = sd; 725 return error; 726 } 727 728 static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, 729 struct nameidata *nd) 730 { 731 struct dentry *ret = NULL; 732 struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata; 733 struct sysfs_dirent *sd; 734 struct inode *inode; 735 736 mutex_lock(&sysfs_mutex); 737 738 sd = sysfs_find_dirent(parent_sd, dentry->d_name.name); 739 740 /* no such entry */ 741 if (!sd) { 742 ret = ERR_PTR(-ENOENT); 743 goto out_unlock; 744 } 745 746 /* attach dentry and inode */ 747 inode = sysfs_get_inode(sd); 748 if (!inode) { 749 ret = ERR_PTR(-ENOMEM); 750 goto out_unlock; 751 } 752 753 /* instantiate and hash dentry */ 754 dentry->d_op = &sysfs_dentry_ops; 755 dentry->d_fsdata = sysfs_get(sd); 756 d_instantiate(dentry, inode); 757 d_rehash(dentry); 758 759 out_unlock: 760 mutex_unlock(&sysfs_mutex); 761 return ret; 762 } 763 764 const struct inode_operations sysfs_dir_inode_operations = { 765 .lookup = sysfs_lookup, 766 .setattr = sysfs_setattr, 767 .setxattr = sysfs_setxattr, 768 }; 769 770 static void remove_dir(struct sysfs_dirent *sd) 771 { 772 struct sysfs_addrm_cxt acxt; 773 774 sysfs_addrm_start(&acxt, sd->s_parent); 775 sysfs_remove_one(&acxt, sd); 776 sysfs_addrm_finish(&acxt); 777 } 778 779 void sysfs_remove_subdir(struct sysfs_dirent *sd) 780 { 781 remove_dir(sd); 782 } 783 784 785 static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd) 786 { 787 struct sysfs_addrm_cxt acxt; 788 struct sysfs_dirent **pos; 789 790 if (!dir_sd) 791 return; 792 793 pr_debug("sysfs %s: removing dir\n", dir_sd->s_name); 794 sysfs_addrm_start(&acxt, dir_sd); 795 pos = &dir_sd->s_dir.children; 796 while (*pos) { 797 struct sysfs_dirent *sd = *pos; 798 799 if (sysfs_type(sd) != SYSFS_DIR) 800 sysfs_remove_one(&acxt, sd); 801 else 802 pos = &(*pos)->s_sibling; 803 } 804 sysfs_addrm_finish(&acxt); 805 806 remove_dir(dir_sd); 807 } 808 809 /** 810 * sysfs_remove_dir - remove an object's directory. 811 * @kobj: object. 812 * 813 * The only thing special about this is that we remove any files in 814 * the directory before we remove the directory, and we've inlined 815 * what used to be sysfs_rmdir() below, instead of calling separately. 816 */ 817 818 void sysfs_remove_dir(struct kobject * kobj) 819 { 820 struct sysfs_dirent *sd = kobj->sd; 821 822 spin_lock(&sysfs_assoc_lock); 823 kobj->sd = NULL; 824 spin_unlock(&sysfs_assoc_lock); 825 826 __sysfs_remove_dir(sd); 827 } 828 829 int sysfs_rename_dir(struct kobject * kobj, const char *new_name) 830 { 831 struct sysfs_dirent *sd = kobj->sd; 832 struct dentry *parent = NULL; 833 struct dentry *old_dentry = NULL, *new_dentry = NULL; 834 const char *dup_name = NULL; 835 int error; 836 837 mutex_lock(&sysfs_rename_mutex); 838 839 error = 0; 840 if (strcmp(sd->s_name, new_name) == 0) 841 goto out; /* nothing to rename */ 842 843 /* get the original dentry */ 844 old_dentry = sysfs_get_dentry(sd); 845 if (IS_ERR(old_dentry)) { 846 error = PTR_ERR(old_dentry); 847 old_dentry = NULL; 848 goto out; 849 } 850 851 parent = old_dentry->d_parent; 852 853 /* lock parent and get dentry for new name */ 854 mutex_lock(&parent->d_inode->i_mutex); 855 mutex_lock(&sysfs_mutex); 856 857 error = -EEXIST; 858 if (sysfs_find_dirent(sd->s_parent, new_name)) 859 goto out_unlock; 860 861 error = -ENOMEM; 862 new_dentry = d_alloc_name(parent, new_name); 863 if (!new_dentry) 864 goto out_unlock; 865 866 /* rename sysfs_dirent */ 867 error = -ENOMEM; 868 new_name = dup_name = kstrdup(new_name, GFP_KERNEL); 869 if (!new_name) 870 goto out_unlock; 871 872 dup_name = sd->s_name; 873 sd->s_name = new_name; 874 875 /* rename */ 876 d_add(new_dentry, NULL); 877 d_move(old_dentry, new_dentry); 878 879 error = 0; 880 out_unlock: 881 mutex_unlock(&sysfs_mutex); 882 mutex_unlock(&parent->d_inode->i_mutex); 883 kfree(dup_name); 884 dput(old_dentry); 885 dput(new_dentry); 886 out: 887 mutex_unlock(&sysfs_rename_mutex); 888 return error; 889 } 890 891 int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj) 892 { 893 struct sysfs_dirent *sd = kobj->sd; 894 struct sysfs_dirent *new_parent_sd; 895 struct dentry *old_parent, *new_parent = NULL; 896 struct dentry *old_dentry = NULL, *new_dentry = NULL; 897 int error; 898 899 mutex_lock(&sysfs_rename_mutex); 900 BUG_ON(!sd->s_parent); 901 new_parent_sd = (new_parent_kobj && new_parent_kobj->sd) ? 902 new_parent_kobj->sd : &sysfs_root; 903 904 error = 0; 905 if (sd->s_parent == new_parent_sd) 906 goto out; /* nothing to move */ 907 908 /* get dentries */ 909 old_dentry = sysfs_get_dentry(sd); 910 if (IS_ERR(old_dentry)) { 911 error = PTR_ERR(old_dentry); 912 old_dentry = NULL; 913 goto out; 914 } 915 old_parent = old_dentry->d_parent; 916 917 new_parent = sysfs_get_dentry(new_parent_sd); 918 if (IS_ERR(new_parent)) { 919 error = PTR_ERR(new_parent); 920 new_parent = NULL; 921 goto out; 922 } 923 924 again: 925 mutex_lock(&old_parent->d_inode->i_mutex); 926 if (!mutex_trylock(&new_parent->d_inode->i_mutex)) { 927 mutex_unlock(&old_parent->d_inode->i_mutex); 928 goto again; 929 } 930 mutex_lock(&sysfs_mutex); 931 932 error = -EEXIST; 933 if (sysfs_find_dirent(new_parent_sd, sd->s_name)) 934 goto out_unlock; 935 936 error = -ENOMEM; 937 new_dentry = d_alloc_name(new_parent, sd->s_name); 938 if (!new_dentry) 939 goto out_unlock; 940 941 error = 0; 942 d_add(new_dentry, NULL); 943 d_move(old_dentry, new_dentry); 944 945 /* Remove from old parent's list and insert into new parent's list. */ 946 sysfs_unlink_sibling(sd); 947 sysfs_get(new_parent_sd); 948 drop_nlink(old_parent->d_inode); 949 sysfs_put(sd->s_parent); 950 sd->s_parent = new_parent_sd; 951 inc_nlink(new_parent->d_inode); 952 sysfs_link_sibling(sd); 953 954 out_unlock: 955 mutex_unlock(&sysfs_mutex); 956 mutex_unlock(&new_parent->d_inode->i_mutex); 957 mutex_unlock(&old_parent->d_inode->i_mutex); 958 out: 959 dput(new_parent); 960 dput(old_dentry); 961 dput(new_dentry); 962 mutex_unlock(&sysfs_rename_mutex); 963 return error; 964 } 965 966 /* Relationship between s_mode and the DT_xxx types */ 967 static inline unsigned char dt_type(struct sysfs_dirent *sd) 968 { 969 return (sd->s_mode >> 12) & 15; 970 } 971 972 static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) 973 { 974 struct dentry *dentry = filp->f_path.dentry; 975 struct sysfs_dirent * parent_sd = dentry->d_fsdata; 976 struct sysfs_dirent *pos; 977 ino_t ino; 978 979 if (filp->f_pos == 0) { 980 ino = parent_sd->s_ino; 981 if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) == 0) 982 filp->f_pos++; 983 } 984 if (filp->f_pos == 1) { 985 if (parent_sd->s_parent) 986 ino = parent_sd->s_parent->s_ino; 987 else 988 ino = parent_sd->s_ino; 989 if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) == 0) 990 filp->f_pos++; 991 } 992 if ((filp->f_pos > 1) && (filp->f_pos < INT_MAX)) { 993 mutex_lock(&sysfs_mutex); 994 995 /* Skip the dentries we have already reported */ 996 pos = parent_sd->s_dir.children; 997 while (pos && (filp->f_pos > pos->s_ino)) 998 pos = pos->s_sibling; 999 1000 for ( ; pos; pos = pos->s_sibling) { 1001 const char * name; 1002 int len; 1003 1004 name = pos->s_name; 1005 len = strlen(name); 1006 filp->f_pos = ino = pos->s_ino; 1007 1008 if (filldir(dirent, name, len, filp->f_pos, ino, 1009 dt_type(pos)) < 0) 1010 break; 1011 } 1012 if (!pos) 1013 filp->f_pos = INT_MAX; 1014 mutex_unlock(&sysfs_mutex); 1015 } 1016 return 0; 1017 } 1018 1019 1020 const struct file_operations sysfs_dir_operations = { 1021 .read = generic_read_dir, 1022 .readdir = sysfs_readdir, 1023 .llseek = generic_file_llseek, 1024 }; 1025