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