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