1 /* 2 * dir.c - Operations for sysfs directories. 3 */ 4 5 #undef DEBUG 6 7 #include <linux/fs.h> 8 #include <linux/mount.h> 9 #include <linux/module.h> 10 #include <linux/kobject.h> 11 #include <linux/namei.h> 12 #include <linux/idr.h> 13 #include <asm/semaphore.h> 14 #include "sysfs.h" 15 16 DECLARE_RWSEM(sysfs_rename_sem); 17 spinlock_t sysfs_lock = SPIN_LOCK_UNLOCKED; 18 spinlock_t kobj_sysfs_assoc_lock = SPIN_LOCK_UNLOCKED; 19 20 static spinlock_t sysfs_ino_lock = SPIN_LOCK_UNLOCKED; 21 static DEFINE_IDA(sysfs_ino_ida); 22 23 int sysfs_alloc_ino(ino_t *pino) 24 { 25 int ino, rc; 26 27 retry: 28 spin_lock(&sysfs_ino_lock); 29 rc = ida_get_new_above(&sysfs_ino_ida, 2, &ino); 30 spin_unlock(&sysfs_ino_lock); 31 32 if (rc == -EAGAIN) { 33 if (ida_pre_get(&sysfs_ino_ida, GFP_KERNEL)) 34 goto retry; 35 rc = -ENOMEM; 36 } 37 38 *pino = ino; 39 return rc; 40 } 41 42 static void sysfs_free_ino(ino_t ino) 43 { 44 spin_lock(&sysfs_ino_lock); 45 ida_remove(&sysfs_ino_ida, ino); 46 spin_unlock(&sysfs_ino_lock); 47 } 48 49 void release_sysfs_dirent(struct sysfs_dirent * sd) 50 { 51 struct sysfs_dirent *parent_sd; 52 53 repeat: 54 parent_sd = sd->s_parent; 55 56 /* If @sd is being released after deletion, s_active is write 57 * locked. If @sd is cursor for directory walk or being 58 * released prematurely, s_active has no reader or writer. 59 * 60 * sysfs_deactivate() lies to lockdep that s_active is 61 * unlocked immediately. Lie one more time to cover the 62 * previous lie. 63 */ 64 if (!down_write_trylock(&sd->s_active)) 65 rwsem_acquire(&sd->s_active.dep_map, 66 SYSFS_S_ACTIVE_DEACTIVATE, 0, _RET_IP_); 67 up_write(&sd->s_active); 68 69 if (sd->s_type & SYSFS_KOBJ_LINK) 70 sysfs_put(sd->s_elem.symlink.target_sd); 71 if (sd->s_type & SYSFS_COPY_NAME) 72 kfree(sd->s_name); 73 kfree(sd->s_iattr); 74 sysfs_free_ino(sd->s_ino); 75 kmem_cache_free(sysfs_dir_cachep, sd); 76 77 sd = parent_sd; 78 if (sd && atomic_dec_and_test(&sd->s_count)) 79 goto repeat; 80 } 81 82 static void sysfs_d_iput(struct dentry * dentry, struct inode * inode) 83 { 84 struct sysfs_dirent * sd = dentry->d_fsdata; 85 86 if (sd) { 87 /* sd->s_dentry is protected with sysfs_lock. This 88 * allows sysfs_drop_dentry() to dereference it. 89 */ 90 spin_lock(&sysfs_lock); 91 92 /* The dentry might have been deleted or another 93 * lookup could have happened updating sd->s_dentry to 94 * point the new dentry. Ignore if it isn't pointing 95 * to this dentry. 96 */ 97 if (sd->s_dentry == dentry) 98 sd->s_dentry = NULL; 99 spin_unlock(&sysfs_lock); 100 sysfs_put(sd); 101 } 102 iput(inode); 103 } 104 105 static struct dentry_operations sysfs_dentry_ops = { 106 .d_iput = sysfs_d_iput, 107 }; 108 109 struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type) 110 { 111 char *dup_name = NULL; 112 struct sysfs_dirent *sd = NULL; 113 114 if (type & SYSFS_COPY_NAME) { 115 name = dup_name = kstrdup(name, GFP_KERNEL); 116 if (!name) 117 goto err_out; 118 } 119 120 sd = kmem_cache_zalloc(sysfs_dir_cachep, GFP_KERNEL); 121 if (!sd) 122 goto err_out; 123 124 if (sysfs_alloc_ino(&sd->s_ino)) 125 goto err_out; 126 127 atomic_set(&sd->s_count, 1); 128 atomic_set(&sd->s_event, 1); 129 init_rwsem(&sd->s_active); 130 INIT_LIST_HEAD(&sd->s_children); 131 INIT_LIST_HEAD(&sd->s_sibling); 132 133 sd->s_name = name; 134 sd->s_mode = mode; 135 sd->s_type = type; 136 137 return sd; 138 139 err_out: 140 kfree(dup_name); 141 kmem_cache_free(sysfs_dir_cachep, sd); 142 return NULL; 143 } 144 145 void sysfs_attach_dirent(struct sysfs_dirent *sd, 146 struct sysfs_dirent *parent_sd, struct dentry *dentry) 147 { 148 if (dentry) { 149 sd->s_dentry = dentry; 150 dentry->d_fsdata = sysfs_get(sd); 151 dentry->d_op = &sysfs_dentry_ops; 152 } 153 154 if (parent_sd) { 155 sd->s_parent = sysfs_get(parent_sd); 156 list_add(&sd->s_sibling, &parent_sd->s_children); 157 } 158 } 159 160 /* 161 * 162 * Return -EEXIST if there is already a sysfs element with the same name for 163 * the same parent. 164 * 165 * called with parent inode's i_mutex held 166 */ 167 int sysfs_dirent_exist(struct sysfs_dirent *parent_sd, 168 const unsigned char *new) 169 { 170 struct sysfs_dirent * sd; 171 172 list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { 173 if (sd->s_type) { 174 if (strcmp(sd->s_name, new)) 175 continue; 176 else 177 return -EEXIST; 178 } 179 } 180 181 return 0; 182 } 183 184 static int init_dir(struct inode * inode) 185 { 186 inode->i_op = &sysfs_dir_inode_operations; 187 inode->i_fop = &sysfs_dir_operations; 188 189 /* directory inodes start off with i_nlink == 2 (for "." entry) */ 190 inc_nlink(inode); 191 return 0; 192 } 193 194 static int init_file(struct inode * inode) 195 { 196 inode->i_size = PAGE_SIZE; 197 inode->i_fop = &sysfs_file_operations; 198 return 0; 199 } 200 201 static int init_symlink(struct inode * inode) 202 { 203 inode->i_op = &sysfs_symlink_inode_operations; 204 return 0; 205 } 206 207 static int create_dir(struct kobject *kobj, struct dentry *parent, 208 const char *name, struct dentry **p_dentry) 209 { 210 int error; 211 umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO; 212 struct dentry *dentry; 213 struct sysfs_dirent *sd; 214 215 mutex_lock(&parent->d_inode->i_mutex); 216 217 dentry = lookup_one_len(name, parent, strlen(name)); 218 if (IS_ERR(dentry)) { 219 error = PTR_ERR(dentry); 220 goto out_unlock; 221 } 222 223 error = -EEXIST; 224 if (sysfs_dirent_exist(parent->d_fsdata, name)) 225 goto out_dput; 226 227 error = -ENOMEM; 228 sd = sysfs_new_dirent(name, mode, SYSFS_DIR); 229 if (!sd) 230 goto out_drop; 231 sd->s_elem.dir.kobj = kobj; 232 sysfs_attach_dirent(sd, parent->d_fsdata, dentry); 233 234 error = sysfs_create(dentry, mode, init_dir); 235 if (error) 236 goto out_sput; 237 238 inc_nlink(parent->d_inode); 239 dentry->d_op = &sysfs_dentry_ops; 240 d_rehash(dentry); 241 242 *p_dentry = dentry; 243 error = 0; 244 goto out_dput; 245 246 out_sput: 247 list_del_init(&sd->s_sibling); 248 sysfs_put(sd); 249 out_drop: 250 d_drop(dentry); 251 out_dput: 252 dput(dentry); 253 out_unlock: 254 mutex_unlock(&parent->d_inode->i_mutex); 255 return error; 256 } 257 258 259 int sysfs_create_subdir(struct kobject * k, const char * n, struct dentry ** d) 260 { 261 return create_dir(k,k->dentry,n,d); 262 } 263 264 /** 265 * sysfs_create_dir - create a directory for an object. 266 * @kobj: object we're creating directory for. 267 * @shadow_parent: parent parent object. 268 */ 269 270 int sysfs_create_dir(struct kobject * kobj, struct dentry *shadow_parent) 271 { 272 struct dentry * dentry = NULL; 273 struct dentry * parent; 274 int error = 0; 275 276 BUG_ON(!kobj); 277 278 if (shadow_parent) 279 parent = shadow_parent; 280 else if (kobj->parent) 281 parent = kobj->parent->dentry; 282 else if (sysfs_mount && sysfs_mount->mnt_sb) 283 parent = sysfs_mount->mnt_sb->s_root; 284 else 285 return -EFAULT; 286 287 error = create_dir(kobj,parent,kobject_name(kobj),&dentry); 288 if (!error) 289 kobj->dentry = dentry; 290 return error; 291 } 292 293 /* attaches attribute's sysfs_dirent to the dentry corresponding to the 294 * attribute file 295 */ 296 static int sysfs_attach_attr(struct sysfs_dirent * sd, struct dentry * dentry) 297 { 298 struct attribute * attr = NULL; 299 struct bin_attribute * bin_attr = NULL; 300 int (* init) (struct inode *) = NULL; 301 int error = 0; 302 303 if (sd->s_type & SYSFS_KOBJ_BIN_ATTR) { 304 bin_attr = sd->s_elem.bin_attr.bin_attr; 305 attr = &bin_attr->attr; 306 } else { 307 attr = sd->s_elem.attr.attr; 308 init = init_file; 309 } 310 311 dentry->d_fsdata = sysfs_get(sd); 312 /* protect sd->s_dentry against sysfs_d_iput */ 313 spin_lock(&sysfs_lock); 314 sd->s_dentry = dentry; 315 spin_unlock(&sysfs_lock); 316 error = sysfs_create(dentry, (attr->mode & S_IALLUGO) | S_IFREG, init); 317 if (error) { 318 sysfs_put(sd); 319 return error; 320 } 321 322 if (bin_attr) { 323 dentry->d_inode->i_size = bin_attr->size; 324 dentry->d_inode->i_fop = &bin_fops; 325 } 326 dentry->d_op = &sysfs_dentry_ops; 327 d_rehash(dentry); 328 329 return 0; 330 } 331 332 static int sysfs_attach_link(struct sysfs_dirent * sd, struct dentry * dentry) 333 { 334 int err = 0; 335 336 dentry->d_fsdata = sysfs_get(sd); 337 /* protect sd->s_dentry against sysfs_d_iput */ 338 spin_lock(&sysfs_lock); 339 sd->s_dentry = dentry; 340 spin_unlock(&sysfs_lock); 341 err = sysfs_create(dentry, S_IFLNK|S_IRWXUGO, init_symlink); 342 if (!err) { 343 dentry->d_op = &sysfs_dentry_ops; 344 d_rehash(dentry); 345 } else 346 sysfs_put(sd); 347 348 return err; 349 } 350 351 static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, 352 struct nameidata *nd) 353 { 354 struct sysfs_dirent * parent_sd = dentry->d_parent->d_fsdata; 355 struct sysfs_dirent * sd; 356 int err = 0; 357 358 list_for_each_entry(sd, &parent_sd->s_children, s_sibling) { 359 if (sd->s_type & SYSFS_NOT_PINNED) { 360 if (strcmp(sd->s_name, dentry->d_name.name)) 361 continue; 362 363 if (sd->s_type & SYSFS_KOBJ_LINK) 364 err = sysfs_attach_link(sd, dentry); 365 else 366 err = sysfs_attach_attr(sd, dentry); 367 break; 368 } 369 } 370 371 return ERR_PTR(err); 372 } 373 374 const struct inode_operations sysfs_dir_inode_operations = { 375 .lookup = sysfs_lookup, 376 .setattr = sysfs_setattr, 377 }; 378 379 static void remove_dir(struct dentry * d) 380 { 381 struct dentry * parent = dget(d->d_parent); 382 struct sysfs_dirent * sd; 383 384 mutex_lock(&parent->d_inode->i_mutex); 385 d_delete(d); 386 sd = d->d_fsdata; 387 list_del_init(&sd->s_sibling); 388 if (d->d_inode) 389 simple_rmdir(parent->d_inode,d); 390 391 pr_debug(" o %s removing done (%d)\n",d->d_name.name, 392 atomic_read(&d->d_count)); 393 394 mutex_unlock(&parent->d_inode->i_mutex); 395 dput(parent); 396 397 sysfs_deactivate(sd); 398 sysfs_put(sd); 399 } 400 401 void sysfs_remove_subdir(struct dentry * d) 402 { 403 remove_dir(d); 404 } 405 406 407 static void __sysfs_remove_dir(struct dentry *dentry) 408 { 409 LIST_HEAD(removed); 410 struct sysfs_dirent * parent_sd; 411 struct sysfs_dirent * sd, * tmp; 412 413 dget(dentry); 414 if (!dentry) 415 return; 416 417 pr_debug("sysfs %s: removing dir\n",dentry->d_name.name); 418 mutex_lock(&dentry->d_inode->i_mutex); 419 parent_sd = dentry->d_fsdata; 420 list_for_each_entry_safe(sd, tmp, &parent_sd->s_children, s_sibling) { 421 if (!sd->s_type || !(sd->s_type & SYSFS_NOT_PINNED)) 422 continue; 423 list_move(&sd->s_sibling, &removed); 424 sysfs_drop_dentry(sd, dentry); 425 } 426 mutex_unlock(&dentry->d_inode->i_mutex); 427 428 list_for_each_entry_safe(sd, tmp, &removed, s_sibling) { 429 list_del_init(&sd->s_sibling); 430 sysfs_deactivate(sd); 431 sysfs_put(sd); 432 } 433 434 remove_dir(dentry); 435 /** 436 * Drop reference from dget() on entrance. 437 */ 438 dput(dentry); 439 } 440 441 /** 442 * sysfs_remove_dir - remove an object's directory. 443 * @kobj: object. 444 * 445 * The only thing special about this is that we remove any files in 446 * the directory before we remove the directory, and we've inlined 447 * what used to be sysfs_rmdir() below, instead of calling separately. 448 */ 449 450 void sysfs_remove_dir(struct kobject * kobj) 451 { 452 struct dentry *d = kobj->dentry; 453 454 spin_lock(&kobj_sysfs_assoc_lock); 455 kobj->dentry = NULL; 456 spin_unlock(&kobj_sysfs_assoc_lock); 457 458 __sysfs_remove_dir(d); 459 } 460 461 int sysfs_rename_dir(struct kobject * kobj, struct dentry *new_parent, 462 const char *new_name) 463 { 464 struct sysfs_dirent *sd = kobj->dentry->d_fsdata; 465 struct sysfs_dirent *parent_sd = new_parent->d_fsdata; 466 struct dentry *new_dentry; 467 char *dup_name; 468 int error; 469 470 if (!new_parent) 471 return -EFAULT; 472 473 down_write(&sysfs_rename_sem); 474 mutex_lock(&new_parent->d_inode->i_mutex); 475 476 new_dentry = lookup_one_len(new_name, new_parent, strlen(new_name)); 477 if (IS_ERR(new_dentry)) { 478 error = PTR_ERR(new_dentry); 479 goto out_unlock; 480 } 481 482 /* By allowing two different directories with the same 483 * d_parent we allow this routine to move between different 484 * shadows of the same directory 485 */ 486 error = -EINVAL; 487 if (kobj->dentry->d_parent->d_inode != new_parent->d_inode || 488 new_dentry->d_parent->d_inode != new_parent->d_inode || 489 new_dentry == kobj->dentry) 490 goto out_dput; 491 492 error = -EEXIST; 493 if (new_dentry->d_inode) 494 goto out_dput; 495 496 /* rename kobject and sysfs_dirent */ 497 error = -ENOMEM; 498 new_name = dup_name = kstrdup(new_name, GFP_KERNEL); 499 if (!new_name) 500 goto out_drop; 501 502 error = kobject_set_name(kobj, "%s", new_name); 503 if (error) 504 goto out_free; 505 506 kfree(sd->s_name); 507 sd->s_name = new_name; 508 509 /* move under the new parent */ 510 d_add(new_dentry, NULL); 511 d_move(kobj->dentry, new_dentry); 512 513 list_del_init(&sd->s_sibling); 514 list_add(&sd->s_sibling, &parent_sd->s_children); 515 516 error = 0; 517 goto out_unlock; 518 519 out_free: 520 kfree(dup_name); 521 out_drop: 522 d_drop(new_dentry); 523 out_dput: 524 dput(new_dentry); 525 out_unlock: 526 mutex_unlock(&new_parent->d_inode->i_mutex); 527 up_write(&sysfs_rename_sem); 528 return error; 529 } 530 531 int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent) 532 { 533 struct dentry *old_parent_dentry, *new_parent_dentry, *new_dentry; 534 struct sysfs_dirent *new_parent_sd, *sd; 535 int error; 536 537 old_parent_dentry = kobj->parent ? 538 kobj->parent->dentry : sysfs_mount->mnt_sb->s_root; 539 new_parent_dentry = new_parent ? 540 new_parent->dentry : sysfs_mount->mnt_sb->s_root; 541 542 if (old_parent_dentry->d_inode == new_parent_dentry->d_inode) 543 return 0; /* nothing to move */ 544 again: 545 mutex_lock(&old_parent_dentry->d_inode->i_mutex); 546 if (!mutex_trylock(&new_parent_dentry->d_inode->i_mutex)) { 547 mutex_unlock(&old_parent_dentry->d_inode->i_mutex); 548 goto again; 549 } 550 551 new_parent_sd = new_parent_dentry->d_fsdata; 552 sd = kobj->dentry->d_fsdata; 553 554 new_dentry = lookup_one_len(kobj->name, new_parent_dentry, 555 strlen(kobj->name)); 556 if (IS_ERR(new_dentry)) { 557 error = PTR_ERR(new_dentry); 558 goto out; 559 } else 560 error = 0; 561 d_add(new_dentry, NULL); 562 d_move(kobj->dentry, new_dentry); 563 dput(new_dentry); 564 565 /* Remove from old parent's list and insert into new parent's list. */ 566 list_del_init(&sd->s_sibling); 567 list_add(&sd->s_sibling, &new_parent_sd->s_children); 568 569 out: 570 mutex_unlock(&new_parent_dentry->d_inode->i_mutex); 571 mutex_unlock(&old_parent_dentry->d_inode->i_mutex); 572 573 return error; 574 } 575 576 static int sysfs_dir_open(struct inode *inode, struct file *file) 577 { 578 struct dentry * dentry = file->f_path.dentry; 579 struct sysfs_dirent * parent_sd = dentry->d_fsdata; 580 struct sysfs_dirent * sd; 581 582 mutex_lock(&dentry->d_inode->i_mutex); 583 sd = sysfs_new_dirent("_DIR_", 0, 0); 584 if (sd) 585 sysfs_attach_dirent(sd, parent_sd, NULL); 586 mutex_unlock(&dentry->d_inode->i_mutex); 587 588 file->private_data = sd; 589 return sd ? 0 : -ENOMEM; 590 } 591 592 static int sysfs_dir_close(struct inode *inode, struct file *file) 593 { 594 struct dentry * dentry = file->f_path.dentry; 595 struct sysfs_dirent * cursor = file->private_data; 596 597 mutex_lock(&dentry->d_inode->i_mutex); 598 list_del_init(&cursor->s_sibling); 599 mutex_unlock(&dentry->d_inode->i_mutex); 600 601 release_sysfs_dirent(cursor); 602 603 return 0; 604 } 605 606 /* Relationship between s_mode and the DT_xxx types */ 607 static inline unsigned char dt_type(struct sysfs_dirent *sd) 608 { 609 return (sd->s_mode >> 12) & 15; 610 } 611 612 static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir) 613 { 614 struct dentry *dentry = filp->f_path.dentry; 615 struct sysfs_dirent * parent_sd = dentry->d_fsdata; 616 struct sysfs_dirent *cursor = filp->private_data; 617 struct list_head *p, *q = &cursor->s_sibling; 618 ino_t ino; 619 int i = filp->f_pos; 620 621 switch (i) { 622 case 0: 623 ino = parent_sd->s_ino; 624 if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0) 625 break; 626 filp->f_pos++; 627 i++; 628 /* fallthrough */ 629 case 1: 630 if (parent_sd->s_parent) 631 ino = parent_sd->s_parent->s_ino; 632 else 633 ino = parent_sd->s_ino; 634 if (filldir(dirent, "..", 2, i, ino, DT_DIR) < 0) 635 break; 636 filp->f_pos++; 637 i++; 638 /* fallthrough */ 639 default: 640 if (filp->f_pos == 2) 641 list_move(q, &parent_sd->s_children); 642 643 for (p=q->next; p!= &parent_sd->s_children; p=p->next) { 644 struct sysfs_dirent *next; 645 const char * name; 646 int len; 647 648 next = list_entry(p, struct sysfs_dirent, 649 s_sibling); 650 if (!next->s_type) 651 continue; 652 653 name = next->s_name; 654 len = strlen(name); 655 ino = next->s_ino; 656 657 if (filldir(dirent, name, len, filp->f_pos, ino, 658 dt_type(next)) < 0) 659 return 0; 660 661 list_move(q, p); 662 p = q; 663 filp->f_pos++; 664 } 665 } 666 return 0; 667 } 668 669 static loff_t sysfs_dir_lseek(struct file * file, loff_t offset, int origin) 670 { 671 struct dentry * dentry = file->f_path.dentry; 672 673 mutex_lock(&dentry->d_inode->i_mutex); 674 switch (origin) { 675 case 1: 676 offset += file->f_pos; 677 case 0: 678 if (offset >= 0) 679 break; 680 default: 681 mutex_unlock(&file->f_path.dentry->d_inode->i_mutex); 682 return -EINVAL; 683 } 684 if (offset != file->f_pos) { 685 file->f_pos = offset; 686 if (file->f_pos >= 2) { 687 struct sysfs_dirent *sd = dentry->d_fsdata; 688 struct sysfs_dirent *cursor = file->private_data; 689 struct list_head *p; 690 loff_t n = file->f_pos - 2; 691 692 list_del(&cursor->s_sibling); 693 p = sd->s_children.next; 694 while (n && p != &sd->s_children) { 695 struct sysfs_dirent *next; 696 next = list_entry(p, struct sysfs_dirent, 697 s_sibling); 698 if (next->s_type) 699 n--; 700 p = p->next; 701 } 702 list_add_tail(&cursor->s_sibling, p); 703 } 704 } 705 mutex_unlock(&dentry->d_inode->i_mutex); 706 return offset; 707 } 708 709 710 /** 711 * sysfs_make_shadowed_dir - Setup so a directory can be shadowed 712 * @kobj: object we're creating shadow of. 713 */ 714 715 int sysfs_make_shadowed_dir(struct kobject *kobj, 716 void * (*follow_link)(struct dentry *, struct nameidata *)) 717 { 718 struct inode *inode; 719 struct inode_operations *i_op; 720 721 inode = kobj->dentry->d_inode; 722 if (inode->i_op != &sysfs_dir_inode_operations) 723 return -EINVAL; 724 725 i_op = kmalloc(sizeof(*i_op), GFP_KERNEL); 726 if (!i_op) 727 return -ENOMEM; 728 729 memcpy(i_op, &sysfs_dir_inode_operations, sizeof(*i_op)); 730 i_op->follow_link = follow_link; 731 732 /* Locking of inode->i_op? 733 * Since setting i_op is a single word write and they 734 * are atomic we should be ok here. 735 */ 736 inode->i_op = i_op; 737 return 0; 738 } 739 740 /** 741 * sysfs_create_shadow_dir - create a shadow directory for an object. 742 * @kobj: object we're creating directory for. 743 * 744 * sysfs_make_shadowed_dir must already have been called on this 745 * directory. 746 */ 747 748 struct dentry *sysfs_create_shadow_dir(struct kobject *kobj) 749 { 750 struct dentry *dir = kobj->dentry; 751 struct inode *inode = dir->d_inode; 752 struct dentry *parent = dir->d_parent; 753 struct sysfs_dirent *parent_sd = parent->d_fsdata; 754 struct dentry *shadow; 755 struct sysfs_dirent *sd; 756 757 shadow = ERR_PTR(-EINVAL); 758 if (!sysfs_is_shadowed_inode(inode)) 759 goto out; 760 761 shadow = d_alloc(parent, &dir->d_name); 762 if (!shadow) 763 goto nomem; 764 765 sd = sysfs_new_dirent("_SHADOW_", inode->i_mode, SYSFS_DIR); 766 if (!sd) 767 goto nomem; 768 sd->s_elem.dir.kobj = kobj; 769 /* point to parent_sd but don't attach to it */ 770 sd->s_parent = sysfs_get(parent_sd); 771 sysfs_attach_dirent(sd, NULL, shadow); 772 773 d_instantiate(shadow, igrab(inode)); 774 inc_nlink(inode); 775 inc_nlink(parent->d_inode); 776 shadow->d_op = &sysfs_dentry_ops; 777 778 dget(shadow); /* Extra count - pin the dentry in core */ 779 780 out: 781 return shadow; 782 nomem: 783 dput(shadow); 784 shadow = ERR_PTR(-ENOMEM); 785 goto out; 786 } 787 788 /** 789 * sysfs_remove_shadow_dir - remove an object's directory. 790 * @shadow: dentry of shadow directory 791 * 792 * The only thing special about this is that we remove any files in 793 * the directory before we remove the directory, and we've inlined 794 * what used to be sysfs_rmdir() below, instead of calling separately. 795 */ 796 797 void sysfs_remove_shadow_dir(struct dentry *shadow) 798 { 799 __sysfs_remove_dir(shadow); 800 } 801 802 const struct file_operations sysfs_dir_operations = { 803 .open = sysfs_dir_open, 804 .release = sysfs_dir_close, 805 .llseek = sysfs_dir_lseek, 806 .read = generic_read_dir, 807 .readdir = sysfs_readdir, 808 }; 809