1
2
3
4
5
6
7
8
9
10
11
12
13#undef DEBUG
14
15#include <linux/fs.h>
16#include <linux/fsnotify.h>
17#include <linux/mount.h>
18#include <linux/module.h>
19#include <linux/slab.h>
20#include <linux/err.h>
21
22#include <linux/configfs.h>
23#include "configfs_internal.h"
24
25
26
27
28
29
30
31
32
33
34
35
36
37DEFINE_SPINLOCK(configfs_dirent_lock);
38
39static void configfs_d_iput(struct dentry * dentry,
40 struct inode * inode)
41{
42 struct configfs_dirent *sd = dentry->d_fsdata;
43
44 if (sd) {
45
46 spin_lock(&configfs_dirent_lock);
47
48
49
50
51
52
53 if (sd->s_dentry == dentry)
54 sd->s_dentry = NULL;
55
56 spin_unlock(&configfs_dirent_lock);
57 configfs_put(sd);
58 }
59 iput(inode);
60}
61
62const struct dentry_operations configfs_dentry_ops = {
63 .d_iput = configfs_d_iput,
64 .d_delete = always_delete_dentry,
65};
66
67#ifdef CONFIG_LOCKDEP
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88static void configfs_init_dirent_depth(struct configfs_dirent *sd)
89{
90 sd->s_depth = -1;
91}
92
93static void configfs_set_dir_dirent_depth(struct configfs_dirent *parent_sd,
94 struct configfs_dirent *sd)
95{
96 int parent_depth = parent_sd->s_depth;
97
98 if (parent_depth >= 0)
99 sd->s_depth = parent_depth + 1;
100}
101
102static void
103configfs_adjust_dir_dirent_depth_before_populate(struct configfs_dirent *sd)
104{
105
106
107
108
109
110
111
112
113
114
115 if (sd->s_depth == -1)
116
117
118
119
120 sd->s_depth = 0;
121}
122
123static void
124configfs_adjust_dir_dirent_depth_after_populate(struct configfs_dirent *sd)
125{
126
127 sd->s_depth = -1;
128}
129
130#else
131
132static void configfs_init_dirent_depth(struct configfs_dirent *sd)
133{
134}
135
136static void configfs_set_dir_dirent_depth(struct configfs_dirent *parent_sd,
137 struct configfs_dirent *sd)
138{
139}
140
141static void
142configfs_adjust_dir_dirent_depth_before_populate(struct configfs_dirent *sd)
143{
144}
145
146static void
147configfs_adjust_dir_dirent_depth_after_populate(struct configfs_dirent *sd)
148{
149}
150
151#endif
152
153static struct configfs_fragment *new_fragment(void)
154{
155 struct configfs_fragment *p;
156
157 p = kmalloc(sizeof(struct configfs_fragment), GFP_KERNEL);
158 if (p) {
159 atomic_set(&p->frag_count, 1);
160 init_rwsem(&p->frag_sem);
161 p->frag_dead = false;
162 }
163 return p;
164}
165
166void put_fragment(struct configfs_fragment *frag)
167{
168 if (frag && atomic_dec_and_test(&frag->frag_count))
169 kfree(frag);
170}
171
172struct configfs_fragment *get_fragment(struct configfs_fragment *frag)
173{
174 if (likely(frag))
175 atomic_inc(&frag->frag_count);
176 return frag;
177}
178
179
180
181
182static struct configfs_dirent *configfs_new_dirent(struct configfs_dirent *parent_sd,
183 void *element, int type,
184 struct configfs_fragment *frag)
185{
186 struct configfs_dirent * sd;
187
188 sd = kmem_cache_zalloc(configfs_dir_cachep, GFP_KERNEL);
189 if (!sd)
190 return ERR_PTR(-ENOMEM);
191
192 atomic_set(&sd->s_count, 1);
193 INIT_LIST_HEAD(&sd->s_children);
194 sd->s_element = element;
195 sd->s_type = type;
196 configfs_init_dirent_depth(sd);
197 spin_lock(&configfs_dirent_lock);
198 if (parent_sd->s_type & CONFIGFS_USET_DROPPING) {
199 spin_unlock(&configfs_dirent_lock);
200 kmem_cache_free(configfs_dir_cachep, sd);
201 return ERR_PTR(-ENOENT);
202 }
203 sd->s_frag = get_fragment(frag);
204 list_add(&sd->s_sibling, &parent_sd->s_children);
205 spin_unlock(&configfs_dirent_lock);
206
207 return sd;
208}
209
210
211
212
213
214
215
216
217static int configfs_dirent_exists(struct configfs_dirent *parent_sd,
218 const unsigned char *new)
219{
220 struct configfs_dirent * sd;
221
222 list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
223 if (sd->s_element) {
224 const unsigned char *existing = configfs_get_name(sd);
225 if (strcmp(existing, new))
226 continue;
227 else
228 return -EEXIST;
229 }
230 }
231
232 return 0;
233}
234
235
236int configfs_make_dirent(struct configfs_dirent * parent_sd,
237 struct dentry * dentry, void * element,
238 umode_t mode, int type, struct configfs_fragment *frag)
239{
240 struct configfs_dirent * sd;
241
242 sd = configfs_new_dirent(parent_sd, element, type, frag);
243 if (IS_ERR(sd))
244 return PTR_ERR(sd);
245
246 sd->s_mode = mode;
247 sd->s_dentry = dentry;
248 if (dentry)
249 dentry->d_fsdata = configfs_get(sd);
250
251 return 0;
252}
253
254static void configfs_remove_dirent(struct dentry *dentry)
255{
256 struct configfs_dirent *sd = dentry->d_fsdata;
257
258 if (!sd)
259 return;
260 spin_lock(&configfs_dirent_lock);
261 list_del_init(&sd->s_sibling);
262 spin_unlock(&configfs_dirent_lock);
263 configfs_put(sd);
264}
265
266
267
268
269
270
271
272
273
274
275
276static int configfs_create_dir(struct config_item *item, struct dentry *dentry,
277 struct configfs_fragment *frag)
278{
279 int error;
280 umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
281 struct dentry *p = dentry->d_parent;
282 struct inode *inode;
283
284 BUG_ON(!item);
285
286 error = configfs_dirent_exists(p->d_fsdata, dentry->d_name.name);
287 if (unlikely(error))
288 return error;
289
290 error = configfs_make_dirent(p->d_fsdata, dentry, item, mode,
291 CONFIGFS_DIR | CONFIGFS_USET_CREATING,
292 frag);
293 if (unlikely(error))
294 return error;
295
296 configfs_set_dir_dirent_depth(p->d_fsdata, dentry->d_fsdata);
297 inode = configfs_create(dentry, mode);
298 if (IS_ERR(inode))
299 goto out_remove;
300
301 inode->i_op = &configfs_dir_inode_operations;
302 inode->i_fop = &configfs_dir_operations;
303
304 inc_nlink(inode);
305 d_instantiate(dentry, inode);
306
307 dget(dentry);
308 inc_nlink(d_inode(p));
309 item->ci_dentry = dentry;
310 return 0;
311
312out_remove:
313 configfs_remove_dirent(dentry);
314 return PTR_ERR(inode);
315}
316
317
318
319
320
321
322
323
324static void configfs_dir_set_ready(struct configfs_dirent *sd)
325{
326 struct configfs_dirent *child_sd;
327
328 sd->s_type &= ~CONFIGFS_USET_CREATING;
329 list_for_each_entry(child_sd, &sd->s_children, s_sibling)
330 if (child_sd->s_type & CONFIGFS_USET_CREATING)
331 configfs_dir_set_ready(child_sd);
332}
333
334
335
336
337
338
339
340
341
342
343
344int configfs_dirent_is_ready(struct configfs_dirent *sd)
345{
346 int ret;
347
348 spin_lock(&configfs_dirent_lock);
349 ret = !(sd->s_type & CONFIGFS_USET_CREATING);
350 spin_unlock(&configfs_dirent_lock);
351
352 return ret;
353}
354
355int configfs_create_link(struct configfs_dirent *target, struct dentry *parent,
356 struct dentry *dentry, char *body)
357{
358 int err = 0;
359 umode_t mode = S_IFLNK | S_IRWXUGO;
360 struct configfs_dirent *p = parent->d_fsdata;
361 struct inode *inode;
362
363 err = configfs_make_dirent(p, dentry, target, mode, CONFIGFS_ITEM_LINK,
364 p->s_frag);
365 if (err)
366 return err;
367
368 inode = configfs_create(dentry, mode);
369 if (IS_ERR(inode))
370 goto out_remove;
371
372 inode->i_link = body;
373 inode->i_op = &configfs_symlink_inode_operations;
374 d_instantiate(dentry, inode);
375 dget(dentry);
376 return 0;
377
378out_remove:
379 configfs_remove_dirent(dentry);
380 return PTR_ERR(inode);
381}
382
383static void remove_dir(struct dentry * d)
384{
385 struct dentry * parent = dget(d->d_parent);
386
387 configfs_remove_dirent(d);
388
389 if (d_really_is_positive(d))
390 simple_rmdir(d_inode(parent),d);
391
392 pr_debug(" o %pd removing done (%d)\n", d, d_count(d));
393
394 dput(parent);
395}
396
397
398
399
400
401
402
403
404
405
406
407
408static void configfs_remove_dir(struct config_item * item)
409{
410 struct dentry * dentry = dget(item->ci_dentry);
411
412 if (!dentry)
413 return;
414
415 remove_dir(dentry);
416
417
418
419 dput(dentry);
420}
421
422
423
424
425
426static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * dentry)
427{
428 struct configfs_attribute * attr = sd->s_element;
429 struct inode *inode;
430
431 spin_lock(&configfs_dirent_lock);
432 dentry->d_fsdata = configfs_get(sd);
433 sd->s_dentry = dentry;
434 spin_unlock(&configfs_dirent_lock);
435
436 inode = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG);
437 if (IS_ERR(inode)) {
438 configfs_put(sd);
439 return PTR_ERR(inode);
440 }
441 if (sd->s_type & CONFIGFS_ITEM_BIN_ATTR) {
442 inode->i_size = 0;
443 inode->i_fop = &configfs_bin_file_operations;
444 } else {
445 inode->i_size = PAGE_SIZE;
446 inode->i_fop = &configfs_file_operations;
447 }
448 d_add(dentry, inode);
449 return 0;
450}
451
452static struct dentry * configfs_lookup(struct inode *dir,
453 struct dentry *dentry,
454 unsigned int flags)
455{
456 struct configfs_dirent * parent_sd = dentry->d_parent->d_fsdata;
457 struct configfs_dirent * sd;
458 int found = 0;
459 int err;
460
461
462
463
464
465
466
467
468
469 err = -ENOENT;
470 if (!configfs_dirent_is_ready(parent_sd))
471 goto out;
472
473 list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
474 if (sd->s_type & CONFIGFS_NOT_PINNED) {
475 const unsigned char * name = configfs_get_name(sd);
476
477 if (strcmp(name, dentry->d_name.name))
478 continue;
479
480 found = 1;
481 err = configfs_attach_attr(sd, dentry);
482 break;
483 }
484 }
485
486 if (!found) {
487
488
489
490
491 if (dentry->d_name.len > NAME_MAX)
492 return ERR_PTR(-ENAMETOOLONG);
493 d_add(dentry, NULL);
494 return NULL;
495 }
496
497out:
498 return ERR_PTR(err);
499}
500
501
502
503
504
505
506
507
508
509static int configfs_detach_prep(struct dentry *dentry, struct dentry **wait)
510{
511 struct configfs_dirent *parent_sd = dentry->d_fsdata;
512 struct configfs_dirent *sd;
513 int ret;
514
515
516 parent_sd->s_type |= CONFIGFS_USET_DROPPING;
517
518 ret = -EBUSY;
519 if (parent_sd->s_links)
520 goto out;
521
522 ret = 0;
523 list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
524 if (!sd->s_element ||
525 (sd->s_type & CONFIGFS_NOT_PINNED))
526 continue;
527 if (sd->s_type & CONFIGFS_USET_DEFAULT) {
528
529 if (sd->s_type & CONFIGFS_USET_IN_MKDIR) {
530 if (wait)
531 *wait= dget(sd->s_dentry);
532 return -EAGAIN;
533 }
534
535
536
537
538
539 ret = configfs_detach_prep(sd->s_dentry, wait);
540 if (!ret)
541 continue;
542 } else
543 ret = -ENOTEMPTY;
544
545 break;
546 }
547
548out:
549 return ret;
550}
551
552
553
554
555
556static void configfs_detach_rollback(struct dentry *dentry)
557{
558 struct configfs_dirent *parent_sd = dentry->d_fsdata;
559 struct configfs_dirent *sd;
560
561 parent_sd->s_type &= ~CONFIGFS_USET_DROPPING;
562
563 list_for_each_entry(sd, &parent_sd->s_children, s_sibling)
564 if (sd->s_type & CONFIGFS_USET_DEFAULT)
565 configfs_detach_rollback(sd->s_dentry);
566}
567
568static void detach_attrs(struct config_item * item)
569{
570 struct dentry * dentry = dget(item->ci_dentry);
571 struct configfs_dirent * parent_sd;
572 struct configfs_dirent * sd, * tmp;
573
574 if (!dentry)
575 return;
576
577 pr_debug("configfs %s: dropping attrs for dir\n",
578 dentry->d_name.name);
579
580 parent_sd = dentry->d_fsdata;
581 list_for_each_entry_safe(sd, tmp, &parent_sd->s_children, s_sibling) {
582 if (!sd->s_element || !(sd->s_type & CONFIGFS_NOT_PINNED))
583 continue;
584 spin_lock(&configfs_dirent_lock);
585 list_del_init(&sd->s_sibling);
586 spin_unlock(&configfs_dirent_lock);
587 configfs_drop_dentry(sd, dentry);
588 configfs_put(sd);
589 }
590
591
592
593
594 dput(dentry);
595}
596
597static int populate_attrs(struct config_item *item)
598{
599 const struct config_item_type *t = item->ci_type;
600 struct configfs_attribute *attr;
601 struct configfs_bin_attribute *bin_attr;
602 int error = 0;
603 int i;
604
605 if (!t)
606 return -EINVAL;
607 if (t->ct_attrs) {
608 for (i = 0; (attr = t->ct_attrs[i]) != NULL; i++) {
609 if ((error = configfs_create_file(item, attr)))
610 break;
611 }
612 }
613 if (t->ct_bin_attrs) {
614 for (i = 0; (bin_attr = t->ct_bin_attrs[i]) != NULL; i++) {
615 error = configfs_create_bin_file(item, bin_attr);
616 if (error)
617 break;
618 }
619 }
620
621 if (error)
622 detach_attrs(item);
623
624 return error;
625}
626
627static int configfs_attach_group(struct config_item *parent_item,
628 struct config_item *item,
629 struct dentry *dentry,
630 struct configfs_fragment *frag);
631static void configfs_detach_group(struct config_item *item);
632
633static void detach_groups(struct config_group *group)
634{
635 struct dentry * dentry = dget(group->cg_item.ci_dentry);
636 struct dentry *child;
637 struct configfs_dirent *parent_sd;
638 struct configfs_dirent *sd, *tmp;
639
640 if (!dentry)
641 return;
642
643 parent_sd = dentry->d_fsdata;
644 list_for_each_entry_safe(sd, tmp, &parent_sd->s_children, s_sibling) {
645 if (!sd->s_element ||
646 !(sd->s_type & CONFIGFS_USET_DEFAULT))
647 continue;
648
649 child = sd->s_dentry;
650
651 inode_lock(d_inode(child));
652
653 configfs_detach_group(sd->s_element);
654 d_inode(child)->i_flags |= S_DEAD;
655 dont_mount(child);
656
657 inode_unlock(d_inode(child));
658
659 d_delete(child);
660 dput(child);
661 }
662
663
664
665
666 dput(dentry);
667}
668
669
670
671
672
673
674
675
676
677static int create_default_group(struct config_group *parent_group,
678 struct config_group *group,
679 struct configfs_fragment *frag)
680{
681 int ret;
682 struct configfs_dirent *sd;
683
684 struct dentry *child, *parent = parent_group->cg_item.ci_dentry;
685
686 if (!group->cg_item.ci_name)
687 group->cg_item.ci_name = group->cg_item.ci_namebuf;
688
689 ret = -ENOMEM;
690 child = d_alloc_name(parent, group->cg_item.ci_name);
691 if (child) {
692 d_add(child, NULL);
693
694 ret = configfs_attach_group(&parent_group->cg_item,
695 &group->cg_item, child, frag);
696 if (!ret) {
697 sd = child->d_fsdata;
698 sd->s_type |= CONFIGFS_USET_DEFAULT;
699 } else {
700 BUG_ON(d_inode(child));
701 d_drop(child);
702 dput(child);
703 }
704 }
705
706 return ret;
707}
708
709static int populate_groups(struct config_group *group,
710 struct configfs_fragment *frag)
711{
712 struct config_group *new_group;
713 int ret = 0;
714
715 list_for_each_entry(new_group, &group->default_groups, group_entry) {
716 ret = create_default_group(group, new_group, frag);
717 if (ret) {
718 detach_groups(group);
719 break;
720 }
721 }
722
723 return ret;
724}
725
726void configfs_remove_default_groups(struct config_group *group)
727{
728 struct config_group *g, *n;
729
730 list_for_each_entry_safe(g, n, &group->default_groups, group_entry) {
731 list_del(&g->group_entry);
732 config_item_put(&g->cg_item);
733 }
734}
735EXPORT_SYMBOL(configfs_remove_default_groups);
736
737
738
739
740
741
742static void unlink_obj(struct config_item *item)
743{
744 struct config_group *group;
745
746 group = item->ci_group;
747 if (group) {
748 list_del_init(&item->ci_entry);
749
750 item->ci_group = NULL;
751 item->ci_parent = NULL;
752
753
754 config_item_put(item);
755
756
757 config_group_put(group);
758 }
759}
760
761static void link_obj(struct config_item *parent_item, struct config_item *item)
762{
763
764
765
766
767 item->ci_parent = parent_item;
768
769
770
771
772
773 item->ci_group = config_group_get(to_config_group(parent_item));
774 list_add_tail(&item->ci_entry, &item->ci_group->cg_children);
775
776
777
778
779
780 config_item_get(item);
781}
782
783static void unlink_group(struct config_group *group)
784{
785 struct config_group *new_group;
786
787 list_for_each_entry(new_group, &group->default_groups, group_entry)
788 unlink_group(new_group);
789
790 group->cg_subsys = NULL;
791 unlink_obj(&group->cg_item);
792}
793
794static void link_group(struct config_group *parent_group, struct config_group *group)
795{
796 struct config_group *new_group;
797 struct configfs_subsystem *subsys = NULL;
798
799 link_obj(&parent_group->cg_item, &group->cg_item);
800
801 if (parent_group->cg_subsys)
802 subsys = parent_group->cg_subsys;
803 else if (configfs_is_root(&parent_group->cg_item))
804 subsys = to_configfs_subsystem(group);
805 else
806 BUG();
807 group->cg_subsys = subsys;
808
809 list_for_each_entry(new_group, &group->default_groups, group_entry)
810 link_group(group, new_group);
811}
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828static int configfs_attach_item(struct config_item *parent_item,
829 struct config_item *item,
830 struct dentry *dentry,
831 struct configfs_fragment *frag)
832{
833 int ret;
834
835 ret = configfs_create_dir(item, dentry, frag);
836 if (!ret) {
837 ret = populate_attrs(item);
838 if (ret) {
839
840
841
842
843
844 inode_lock(d_inode(dentry));
845 configfs_remove_dir(item);
846 d_inode(dentry)->i_flags |= S_DEAD;
847 dont_mount(dentry);
848 inode_unlock(d_inode(dentry));
849 d_delete(dentry);
850 }
851 }
852
853 return ret;
854}
855
856
857static void configfs_detach_item(struct config_item *item)
858{
859 detach_attrs(item);
860 configfs_remove_dir(item);
861}
862
863static int configfs_attach_group(struct config_item *parent_item,
864 struct config_item *item,
865 struct dentry *dentry,
866 struct configfs_fragment *frag)
867{
868 int ret;
869 struct configfs_dirent *sd;
870
871 ret = configfs_attach_item(parent_item, item, dentry, frag);
872 if (!ret) {
873 sd = dentry->d_fsdata;
874 sd->s_type |= CONFIGFS_USET_DIR;
875
876
877
878
879
880
881
882
883
884
885 inode_lock_nested(d_inode(dentry), I_MUTEX_CHILD);
886 configfs_adjust_dir_dirent_depth_before_populate(sd);
887 ret = populate_groups(to_config_group(item), frag);
888 if (ret) {
889 configfs_detach_item(item);
890 d_inode(dentry)->i_flags |= S_DEAD;
891 dont_mount(dentry);
892 }
893 configfs_adjust_dir_dirent_depth_after_populate(sd);
894 inode_unlock(d_inode(dentry));
895 if (ret)
896 d_delete(dentry);
897 }
898
899 return ret;
900}
901
902
903static void configfs_detach_group(struct config_item *item)
904{
905 detach_groups(to_config_group(item));
906 configfs_detach_item(item);
907}
908
909
910
911
912
913
914
915
916
917
918static void client_disconnect_notify(struct config_item *parent_item,
919 struct config_item *item)
920{
921 const struct config_item_type *type;
922
923 type = parent_item->ci_type;
924 BUG_ON(!type);
925
926 if (type->ct_group_ops && type->ct_group_ops->disconnect_notify)
927 type->ct_group_ops->disconnect_notify(to_config_group(parent_item),
928 item);
929}
930
931
932
933
934
935
936
937static void client_drop_item(struct config_item *parent_item,
938 struct config_item *item)
939{
940 const struct config_item_type *type;
941
942 type = parent_item->ci_type;
943 BUG_ON(!type);
944
945
946
947
948
949 if (type->ct_group_ops && type->ct_group_ops->drop_item)
950 type->ct_group_ops->drop_item(to_config_group(parent_item),
951 item);
952 else
953 config_item_put(item);
954}
955
956#ifdef DEBUG
957static void configfs_dump_one(struct configfs_dirent *sd, int level)
958{
959 pr_info("%*s\"%s\":\n", level, " ", configfs_get_name(sd));
960
961#define type_print(_type) if (sd->s_type & _type) pr_info("%*s %s\n", level, " ", #_type);
962 type_print(CONFIGFS_ROOT);
963 type_print(CONFIGFS_DIR);
964 type_print(CONFIGFS_ITEM_ATTR);
965 type_print(CONFIGFS_ITEM_LINK);
966 type_print(CONFIGFS_USET_DIR);
967 type_print(CONFIGFS_USET_DEFAULT);
968 type_print(CONFIGFS_USET_DROPPING);
969#undef type_print
970}
971
972static int configfs_dump(struct configfs_dirent *sd, int level)
973{
974 struct configfs_dirent *child_sd;
975 int ret = 0;
976
977 configfs_dump_one(sd, level);
978
979 if (!(sd->s_type & (CONFIGFS_DIR|CONFIGFS_ROOT)))
980 return 0;
981
982 list_for_each_entry(child_sd, &sd->s_children, s_sibling) {
983 ret = configfs_dump(child_sd, level + 2);
984 if (ret)
985 break;
986 }
987
988 return ret;
989}
990#endif
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051static int configfs_depend_prep(struct dentry *origin,
1052 struct config_item *target)
1053{
1054 struct configfs_dirent *child_sd, *sd;
1055 int ret = 0;
1056
1057 BUG_ON(!origin || !origin->d_fsdata);
1058 sd = origin->d_fsdata;
1059
1060 if (sd->s_element == target)
1061 goto out;
1062
1063 list_for_each_entry(child_sd, &sd->s_children, s_sibling) {
1064 if ((child_sd->s_type & CONFIGFS_DIR) &&
1065 !(child_sd->s_type & CONFIGFS_USET_DROPPING) &&
1066 !(child_sd->s_type & CONFIGFS_USET_CREATING)) {
1067 ret = configfs_depend_prep(child_sd->s_dentry,
1068 target);
1069 if (!ret)
1070 goto out;
1071 }
1072 }
1073
1074
1075 ret = -ENOENT;
1076
1077out:
1078 return ret;
1079}
1080
1081static int configfs_do_depend_item(struct dentry *subsys_dentry,
1082 struct config_item *target)
1083{
1084 struct configfs_dirent *p;
1085 int ret;
1086
1087 spin_lock(&configfs_dirent_lock);
1088
1089 ret = configfs_depend_prep(subsys_dentry, target);
1090 if (ret)
1091 goto out_unlock_dirent_lock;
1092
1093
1094
1095
1096
1097 p = target->ci_dentry->d_fsdata;
1098 p->s_dependent_count += 1;
1099
1100out_unlock_dirent_lock:
1101 spin_unlock(&configfs_dirent_lock);
1102
1103 return ret;
1104}
1105
1106static inline struct configfs_dirent *
1107configfs_find_subsys_dentry(struct configfs_dirent *root_sd,
1108 struct config_item *subsys_item)
1109{
1110 struct configfs_dirent *p;
1111 struct configfs_dirent *ret = NULL;
1112
1113 list_for_each_entry(p, &root_sd->s_children, s_sibling) {
1114 if (p->s_type & CONFIGFS_DIR &&
1115 p->s_element == subsys_item) {
1116 ret = p;
1117 break;
1118 }
1119 }
1120
1121 return ret;
1122}
1123
1124
1125int configfs_depend_item(struct configfs_subsystem *subsys,
1126 struct config_item *target)
1127{
1128 int ret;
1129 struct configfs_dirent *subsys_sd;
1130 struct config_item *s_item = &subsys->su_group.cg_item;
1131 struct dentry *root;
1132
1133
1134
1135
1136
1137 root = configfs_pin_fs();
1138 if (IS_ERR(root))
1139 return PTR_ERR(root);
1140
1141
1142
1143
1144
1145
1146 inode_lock(d_inode(root));
1147
1148 subsys_sd = configfs_find_subsys_dentry(root->d_fsdata, s_item);
1149 if (!subsys_sd) {
1150 ret = -ENOENT;
1151 goto out_unlock_fs;
1152 }
1153
1154
1155 ret = configfs_do_depend_item(subsys_sd->s_dentry, target);
1156
1157out_unlock_fs:
1158 inode_unlock(d_inode(root));
1159
1160
1161
1162
1163
1164 configfs_release_fs();
1165
1166 return ret;
1167}
1168EXPORT_SYMBOL(configfs_depend_item);
1169
1170
1171
1172
1173
1174
1175void configfs_undepend_item(struct config_item *target)
1176{
1177 struct configfs_dirent *sd;
1178
1179
1180
1181
1182
1183 spin_lock(&configfs_dirent_lock);
1184
1185 sd = target->ci_dentry->d_fsdata;
1186 BUG_ON(sd->s_dependent_count < 1);
1187
1188 sd->s_dependent_count -= 1;
1189
1190
1191
1192
1193
1194 spin_unlock(&configfs_dirent_lock);
1195}
1196EXPORT_SYMBOL(configfs_undepend_item);
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207int configfs_depend_item_unlocked(struct configfs_subsystem *caller_subsys,
1208 struct config_item *target)
1209{
1210 struct configfs_subsystem *target_subsys;
1211 struct config_group *root, *parent;
1212 struct configfs_dirent *subsys_sd;
1213 int ret = -ENOENT;
1214
1215
1216 if (configfs_is_root(target))
1217 return -EINVAL;
1218
1219 parent = target->ci_group;
1220
1221
1222
1223
1224 if (configfs_is_root(&parent->cg_item)) {
1225 target_subsys = to_configfs_subsystem(to_config_group(target));
1226 root = parent;
1227 } else {
1228 target_subsys = parent->cg_subsys;
1229
1230 for (root = parent; !configfs_is_root(&root->cg_item);
1231 root = root->cg_item.ci_group)
1232 ;
1233 }
1234
1235 if (target_subsys != caller_subsys) {
1236
1237
1238
1239
1240
1241 inode_lock(d_inode(root->cg_item.ci_dentry));
1242
1243
1244
1245
1246
1247 subsys_sd = configfs_find_subsys_dentry(
1248 root->cg_item.ci_dentry->d_fsdata,
1249 &target_subsys->su_group.cg_item);
1250 if (!subsys_sd)
1251 goto out_root_unlock;
1252 } else {
1253 subsys_sd = target_subsys->su_group.cg_item.ci_dentry->d_fsdata;
1254 }
1255
1256
1257 ret = configfs_do_depend_item(subsys_sd->s_dentry, target);
1258
1259 if (target_subsys != caller_subsys)
1260out_root_unlock:
1261
1262
1263
1264
1265 inode_unlock(d_inode(root->cg_item.ci_dentry));
1266
1267 return ret;
1268}
1269EXPORT_SYMBOL(configfs_depend_item_unlocked);
1270
1271static int configfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
1272{
1273 int ret = 0;
1274 int module_got = 0;
1275 struct config_group *group = NULL;
1276 struct config_item *item = NULL;
1277 struct config_item *parent_item;
1278 struct configfs_subsystem *subsys;
1279 struct configfs_dirent *sd;
1280 const struct config_item_type *type;
1281 struct module *subsys_owner = NULL, *new_item_owner = NULL;
1282 struct configfs_fragment *frag;
1283 char *name;
1284
1285 sd = dentry->d_parent->d_fsdata;
1286
1287
1288
1289
1290
1291 if (!configfs_dirent_is_ready(sd)) {
1292 ret = -ENOENT;
1293 goto out;
1294 }
1295
1296 if (!(sd->s_type & CONFIGFS_USET_DIR)) {
1297 ret = -EPERM;
1298 goto out;
1299 }
1300
1301 frag = new_fragment();
1302 if (!frag) {
1303 ret = -ENOMEM;
1304 goto out;
1305 }
1306
1307
1308 parent_item = configfs_get_config_item(dentry->d_parent);
1309 type = parent_item->ci_type;
1310 subsys = to_config_group(parent_item)->cg_subsys;
1311 BUG_ON(!subsys);
1312
1313 if (!type || !type->ct_group_ops ||
1314 (!type->ct_group_ops->make_group &&
1315 !type->ct_group_ops->make_item)) {
1316 ret = -EPERM;
1317 goto out_put;
1318 }
1319
1320
1321
1322
1323
1324
1325 if (!subsys->su_group.cg_item.ci_type) {
1326 ret = -EINVAL;
1327 goto out_put;
1328 }
1329 subsys_owner = subsys->su_group.cg_item.ci_type->ct_owner;
1330 if (!try_module_get(subsys_owner)) {
1331 ret = -EINVAL;
1332 goto out_put;
1333 }
1334
1335 name = kmalloc(dentry->d_name.len + 1, GFP_KERNEL);
1336 if (!name) {
1337 ret = -ENOMEM;
1338 goto out_subsys_put;
1339 }
1340
1341 snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name);
1342
1343 mutex_lock(&subsys->su_mutex);
1344 if (type->ct_group_ops->make_group) {
1345 group = type->ct_group_ops->make_group(to_config_group(parent_item), name);
1346 if (!group)
1347 group = ERR_PTR(-ENOMEM);
1348 if (!IS_ERR(group)) {
1349 link_group(to_config_group(parent_item), group);
1350 item = &group->cg_item;
1351 } else
1352 ret = PTR_ERR(group);
1353 } else {
1354 item = type->ct_group_ops->make_item(to_config_group(parent_item), name);
1355 if (!item)
1356 item = ERR_PTR(-ENOMEM);
1357 if (!IS_ERR(item))
1358 link_obj(parent_item, item);
1359 else
1360 ret = PTR_ERR(item);
1361 }
1362 mutex_unlock(&subsys->su_mutex);
1363
1364 kfree(name);
1365 if (ret) {
1366
1367
1368
1369
1370 goto out_subsys_put;
1371 }
1372
1373
1374
1375
1376
1377
1378 type = item->ci_type;
1379 if (!type) {
1380 ret = -EINVAL;
1381 goto out_unlink;
1382 }
1383
1384 new_item_owner = type->ct_owner;
1385 if (!try_module_get(new_item_owner)) {
1386 ret = -EINVAL;
1387 goto out_unlink;
1388 }
1389
1390
1391
1392
1393
1394
1395 module_got = 1;
1396
1397
1398
1399
1400
1401
1402
1403 spin_lock(&configfs_dirent_lock);
1404
1405 sd->s_type |= CONFIGFS_USET_IN_MKDIR;
1406 spin_unlock(&configfs_dirent_lock);
1407
1408 if (group)
1409 ret = configfs_attach_group(parent_item, item, dentry, frag);
1410 else
1411 ret = configfs_attach_item(parent_item, item, dentry, frag);
1412
1413 spin_lock(&configfs_dirent_lock);
1414 sd->s_type &= ~CONFIGFS_USET_IN_MKDIR;
1415 if (!ret)
1416 configfs_dir_set_ready(dentry->d_fsdata);
1417 spin_unlock(&configfs_dirent_lock);
1418
1419out_unlink:
1420 if (ret) {
1421
1422 mutex_lock(&subsys->su_mutex);
1423
1424 client_disconnect_notify(parent_item, item);
1425 if (group)
1426 unlink_group(group);
1427 else
1428 unlink_obj(item);
1429 client_drop_item(parent_item, item);
1430
1431 mutex_unlock(&subsys->su_mutex);
1432
1433 if (module_got)
1434 module_put(new_item_owner);
1435 }
1436
1437out_subsys_put:
1438 if (ret)
1439 module_put(subsys_owner);
1440
1441out_put:
1442
1443
1444
1445
1446
1447 config_item_put(parent_item);
1448 put_fragment(frag);
1449
1450out:
1451 return ret;
1452}
1453
1454static int configfs_rmdir(struct inode *dir, struct dentry *dentry)
1455{
1456 struct config_item *parent_item;
1457 struct config_item *item;
1458 struct configfs_subsystem *subsys;
1459 struct configfs_dirent *sd;
1460 struct configfs_fragment *frag;
1461 struct module *subsys_owner = NULL, *dead_item_owner = NULL;
1462 int ret;
1463
1464 sd = dentry->d_fsdata;
1465 if (sd->s_type & CONFIGFS_USET_DEFAULT)
1466 return -EPERM;
1467
1468
1469 parent_item = configfs_get_config_item(dentry->d_parent);
1470 subsys = to_config_group(parent_item)->cg_subsys;
1471 BUG_ON(!subsys);
1472
1473 if (!parent_item->ci_type) {
1474 config_item_put(parent_item);
1475 return -EINVAL;
1476 }
1477
1478
1479 BUG_ON(!subsys->su_group.cg_item.ci_type);
1480 subsys_owner = subsys->su_group.cg_item.ci_type->ct_owner;
1481
1482
1483
1484
1485
1486 do {
1487 struct dentry *wait;
1488
1489 mutex_lock(&configfs_symlink_mutex);
1490 spin_lock(&configfs_dirent_lock);
1491
1492
1493
1494
1495
1496 ret = sd->s_dependent_count ? -EBUSY : 0;
1497 if (!ret) {
1498 ret = configfs_detach_prep(dentry, &wait);
1499 if (ret)
1500 configfs_detach_rollback(dentry);
1501 }
1502 spin_unlock(&configfs_dirent_lock);
1503 mutex_unlock(&configfs_symlink_mutex);
1504
1505 if (ret) {
1506 if (ret != -EAGAIN) {
1507 config_item_put(parent_item);
1508 return ret;
1509 }
1510
1511
1512 inode_lock(d_inode(wait));
1513 inode_unlock(d_inode(wait));
1514 dput(wait);
1515 }
1516 } while (ret == -EAGAIN);
1517
1518 frag = sd->s_frag;
1519 if (down_write_killable(&frag->frag_sem)) {
1520 spin_lock(&configfs_dirent_lock);
1521 configfs_detach_rollback(dentry);
1522 spin_unlock(&configfs_dirent_lock);
1523 config_item_put(parent_item);
1524 return -EINTR;
1525 }
1526 frag->frag_dead = true;
1527 up_write(&frag->frag_sem);
1528
1529
1530 item = configfs_get_config_item(dentry);
1531
1532
1533 config_item_put(parent_item);
1534
1535 if (item->ci_type)
1536 dead_item_owner = item->ci_type->ct_owner;
1537
1538 if (sd->s_type & CONFIGFS_USET_DIR) {
1539 configfs_detach_group(item);
1540
1541 mutex_lock(&subsys->su_mutex);
1542 client_disconnect_notify(parent_item, item);
1543 unlink_group(to_config_group(item));
1544 } else {
1545 configfs_detach_item(item);
1546
1547 mutex_lock(&subsys->su_mutex);
1548 client_disconnect_notify(parent_item, item);
1549 unlink_obj(item);
1550 }
1551
1552 client_drop_item(parent_item, item);
1553 mutex_unlock(&subsys->su_mutex);
1554
1555
1556 config_item_put(item);
1557
1558 module_put(dead_item_owner);
1559 module_put(subsys_owner);
1560
1561 return 0;
1562}
1563
1564const struct inode_operations configfs_dir_inode_operations = {
1565 .mkdir = configfs_mkdir,
1566 .rmdir = configfs_rmdir,
1567 .symlink = configfs_symlink,
1568 .unlink = configfs_unlink,
1569 .lookup = configfs_lookup,
1570 .setattr = configfs_setattr,
1571};
1572
1573const struct inode_operations configfs_root_inode_operations = {
1574 .lookup = configfs_lookup,
1575 .setattr = configfs_setattr,
1576};
1577
1578static int configfs_dir_open(struct inode *inode, struct file *file)
1579{
1580 struct dentry * dentry = file->f_path.dentry;
1581 struct configfs_dirent * parent_sd = dentry->d_fsdata;
1582 int err;
1583
1584 inode_lock(d_inode(dentry));
1585
1586
1587
1588
1589 err = -ENOENT;
1590 if (configfs_dirent_is_ready(parent_sd)) {
1591 file->private_data = configfs_new_dirent(parent_sd, NULL, 0, NULL);
1592 if (IS_ERR(file->private_data))
1593 err = PTR_ERR(file->private_data);
1594 else
1595 err = 0;
1596 }
1597 inode_unlock(d_inode(dentry));
1598
1599 return err;
1600}
1601
1602static int configfs_dir_close(struct inode *inode, struct file *file)
1603{
1604 struct dentry * dentry = file->f_path.dentry;
1605 struct configfs_dirent * cursor = file->private_data;
1606
1607 inode_lock(d_inode(dentry));
1608 spin_lock(&configfs_dirent_lock);
1609 list_del_init(&cursor->s_sibling);
1610 spin_unlock(&configfs_dirent_lock);
1611 inode_unlock(d_inode(dentry));
1612
1613 release_configfs_dirent(cursor);
1614
1615 return 0;
1616}
1617
1618
1619static inline unsigned char dt_type(struct configfs_dirent *sd)
1620{
1621 return (sd->s_mode >> 12) & 15;
1622}
1623
1624static int configfs_readdir(struct file *file, struct dir_context *ctx)
1625{
1626 struct dentry *dentry = file->f_path.dentry;
1627 struct super_block *sb = dentry->d_sb;
1628 struct configfs_dirent * parent_sd = dentry->d_fsdata;
1629 struct configfs_dirent *cursor = file->private_data;
1630 struct list_head *p, *q = &cursor->s_sibling;
1631 ino_t ino = 0;
1632
1633 if (!dir_emit_dots(file, ctx))
1634 return 0;
1635 spin_lock(&configfs_dirent_lock);
1636 if (ctx->pos == 2)
1637 list_move(q, &parent_sd->s_children);
1638 for (p = q->next; p != &parent_sd->s_children; p = p->next) {
1639 struct configfs_dirent *next;
1640 const char *name;
1641 int len;
1642 struct inode *inode = NULL;
1643
1644 next = list_entry(p, struct configfs_dirent, s_sibling);
1645 if (!next->s_element)
1646 continue;
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661 dentry = next->s_dentry;
1662 if (dentry)
1663 inode = d_inode(dentry);
1664 if (inode)
1665 ino = inode->i_ino;
1666 spin_unlock(&configfs_dirent_lock);
1667 if (!inode)
1668 ino = iunique(sb, 2);
1669
1670 name = configfs_get_name(next);
1671 len = strlen(name);
1672
1673 if (!dir_emit(ctx, name, len, ino, dt_type(next)))
1674 return 0;
1675
1676 spin_lock(&configfs_dirent_lock);
1677 list_move(q, p);
1678 p = q;
1679 ctx->pos++;
1680 }
1681 spin_unlock(&configfs_dirent_lock);
1682 return 0;
1683}
1684
1685static loff_t configfs_dir_lseek(struct file *file, loff_t offset, int whence)
1686{
1687 struct dentry * dentry = file->f_path.dentry;
1688
1689 switch (whence) {
1690 case 1:
1691 offset += file->f_pos;
1692 fallthrough;
1693 case 0:
1694 if (offset >= 0)
1695 break;
1696 fallthrough;
1697 default:
1698 return -EINVAL;
1699 }
1700 if (offset != file->f_pos) {
1701 file->f_pos = offset;
1702 if (file->f_pos >= 2) {
1703 struct configfs_dirent *sd = dentry->d_fsdata;
1704 struct configfs_dirent *cursor = file->private_data;
1705 struct list_head *p;
1706 loff_t n = file->f_pos - 2;
1707
1708 spin_lock(&configfs_dirent_lock);
1709 list_del(&cursor->s_sibling);
1710 p = sd->s_children.next;
1711 while (n && p != &sd->s_children) {
1712 struct configfs_dirent *next;
1713 next = list_entry(p, struct configfs_dirent,
1714 s_sibling);
1715 if (next->s_element)
1716 n--;
1717 p = p->next;
1718 }
1719 list_add_tail(&cursor->s_sibling, p);
1720 spin_unlock(&configfs_dirent_lock);
1721 }
1722 }
1723 return offset;
1724}
1725
1726const struct file_operations configfs_dir_operations = {
1727 .open = configfs_dir_open,
1728 .release = configfs_dir_close,
1729 .llseek = configfs_dir_lseek,
1730 .read = generic_read_dir,
1731 .iterate_shared = configfs_readdir,
1732};
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744int configfs_register_group(struct config_group *parent_group,
1745 struct config_group *group)
1746{
1747 struct configfs_subsystem *subsys = parent_group->cg_subsys;
1748 struct dentry *parent;
1749 struct configfs_fragment *frag;
1750 int ret;
1751
1752 frag = new_fragment();
1753 if (!frag)
1754 return -ENOMEM;
1755
1756 mutex_lock(&subsys->su_mutex);
1757 link_group(parent_group, group);
1758 mutex_unlock(&subsys->su_mutex);
1759
1760 parent = parent_group->cg_item.ci_dentry;
1761
1762 inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
1763 ret = create_default_group(parent_group, group, frag);
1764 if (ret)
1765 goto err_out;
1766
1767 spin_lock(&configfs_dirent_lock);
1768 configfs_dir_set_ready(group->cg_item.ci_dentry->d_fsdata);
1769 spin_unlock(&configfs_dirent_lock);
1770 inode_unlock(d_inode(parent));
1771 put_fragment(frag);
1772 return 0;
1773err_out:
1774 inode_unlock(d_inode(parent));
1775 mutex_lock(&subsys->su_mutex);
1776 unlink_group(group);
1777 mutex_unlock(&subsys->su_mutex);
1778 put_fragment(frag);
1779 return ret;
1780}
1781EXPORT_SYMBOL(configfs_register_group);
1782
1783
1784
1785
1786
1787
1788
1789void configfs_unregister_group(struct config_group *group)
1790{
1791 struct configfs_subsystem *subsys = group->cg_subsys;
1792 struct dentry *dentry = group->cg_item.ci_dentry;
1793 struct dentry *parent = group->cg_item.ci_parent->ci_dentry;
1794 struct configfs_dirent *sd = dentry->d_fsdata;
1795 struct configfs_fragment *frag = sd->s_frag;
1796
1797 down_write(&frag->frag_sem);
1798 frag->frag_dead = true;
1799 up_write(&frag->frag_sem);
1800
1801 inode_lock_nested(d_inode(parent), I_MUTEX_PARENT);
1802 spin_lock(&configfs_dirent_lock);
1803 configfs_detach_prep(dentry, NULL);
1804 spin_unlock(&configfs_dirent_lock);
1805
1806 configfs_detach_group(&group->cg_item);
1807 d_inode(dentry)->i_flags |= S_DEAD;
1808 dont_mount(dentry);
1809 fsnotify_rmdir(d_inode(parent), dentry);
1810 d_delete(dentry);
1811 inode_unlock(d_inode(parent));
1812
1813 dput(dentry);
1814
1815 mutex_lock(&subsys->su_mutex);
1816 unlink_group(group);
1817 mutex_unlock(&subsys->su_mutex);
1818}
1819EXPORT_SYMBOL(configfs_unregister_group);
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832struct config_group *
1833configfs_register_default_group(struct config_group *parent_group,
1834 const char *name,
1835 const struct config_item_type *item_type)
1836{
1837 int ret;
1838 struct config_group *group;
1839
1840 group = kzalloc(sizeof(*group), GFP_KERNEL);
1841 if (!group)
1842 return ERR_PTR(-ENOMEM);
1843 config_group_init_type_name(group, name, item_type);
1844
1845 ret = configfs_register_group(parent_group, group);
1846 if (ret) {
1847 kfree(group);
1848 return ERR_PTR(ret);
1849 }
1850 return group;
1851}
1852EXPORT_SYMBOL(configfs_register_default_group);
1853
1854
1855
1856
1857
1858void configfs_unregister_default_group(struct config_group *group)
1859{
1860 configfs_unregister_group(group);
1861 kfree(group);
1862}
1863EXPORT_SYMBOL(configfs_unregister_default_group);
1864
1865int configfs_register_subsystem(struct configfs_subsystem *subsys)
1866{
1867 int err;
1868 struct config_group *group = &subsys->su_group;
1869 struct dentry *dentry;
1870 struct dentry *root;
1871 struct configfs_dirent *sd;
1872 struct configfs_fragment *frag;
1873
1874 frag = new_fragment();
1875 if (!frag)
1876 return -ENOMEM;
1877
1878 root = configfs_pin_fs();
1879 if (IS_ERR(root)) {
1880 put_fragment(frag);
1881 return PTR_ERR(root);
1882 }
1883
1884 if (!group->cg_item.ci_name)
1885 group->cg_item.ci_name = group->cg_item.ci_namebuf;
1886
1887 sd = root->d_fsdata;
1888 link_group(to_config_group(sd->s_element), group);
1889
1890 inode_lock_nested(d_inode(root), I_MUTEX_PARENT);
1891
1892 err = -ENOMEM;
1893 dentry = d_alloc_name(root, group->cg_item.ci_name);
1894 if (dentry) {
1895 d_add(dentry, NULL);
1896
1897 err = configfs_attach_group(sd->s_element, &group->cg_item,
1898 dentry, frag);
1899 if (err) {
1900 BUG_ON(d_inode(dentry));
1901 d_drop(dentry);
1902 dput(dentry);
1903 } else {
1904 spin_lock(&configfs_dirent_lock);
1905 configfs_dir_set_ready(dentry->d_fsdata);
1906 spin_unlock(&configfs_dirent_lock);
1907 }
1908 }
1909
1910 inode_unlock(d_inode(root));
1911
1912 if (err) {
1913 unlink_group(group);
1914 configfs_release_fs();
1915 }
1916 put_fragment(frag);
1917
1918 return err;
1919}
1920
1921void configfs_unregister_subsystem(struct configfs_subsystem *subsys)
1922{
1923 struct config_group *group = &subsys->su_group;
1924 struct dentry *dentry = group->cg_item.ci_dentry;
1925 struct dentry *root = dentry->d_sb->s_root;
1926 struct configfs_dirent *sd = dentry->d_fsdata;
1927 struct configfs_fragment *frag = sd->s_frag;
1928
1929 if (dentry->d_parent != root) {
1930 pr_err("Tried to unregister non-subsystem!\n");
1931 return;
1932 }
1933
1934 down_write(&frag->frag_sem);
1935 frag->frag_dead = true;
1936 up_write(&frag->frag_sem);
1937
1938 inode_lock_nested(d_inode(root),
1939 I_MUTEX_PARENT);
1940 inode_lock_nested(d_inode(dentry), I_MUTEX_CHILD);
1941 mutex_lock(&configfs_symlink_mutex);
1942 spin_lock(&configfs_dirent_lock);
1943 if (configfs_detach_prep(dentry, NULL)) {
1944 pr_err("Tried to unregister non-empty subsystem!\n");
1945 }
1946 spin_unlock(&configfs_dirent_lock);
1947 mutex_unlock(&configfs_symlink_mutex);
1948 configfs_detach_group(&group->cg_item);
1949 d_inode(dentry)->i_flags |= S_DEAD;
1950 dont_mount(dentry);
1951 fsnotify_rmdir(d_inode(root), dentry);
1952 inode_unlock(d_inode(dentry));
1953
1954 d_delete(dentry);
1955
1956 inode_unlock(d_inode(root));
1957
1958 dput(dentry);
1959
1960 unlink_group(group);
1961 configfs_release_fs();
1962}
1963
1964EXPORT_SYMBOL(configfs_register_subsystem);
1965EXPORT_SYMBOL(configfs_unregister_subsystem);
1966