Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/fs/configfs/dir.c
15109 views
1
/* -*- mode: c; c-basic-offset: 8; -*-
2
* vim: noexpandtab sw=8 ts=8 sts=0:
3
*
4
* dir.c - Operations for configfs directories.
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public
8
* License as published by the Free Software Foundation; either
9
* version 2 of the License, or (at your option) any later version.
10
*
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
15
*
16
* You should have received a copy of the GNU General Public
17
* License along with this program; if not, write to the
18
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
* Boston, MA 021110-1307, USA.
20
*
21
* Based on sysfs:
22
* sysfs is Copyright (C) 2001, 2002, 2003 Patrick Mochel
23
*
24
* configfs Copyright (C) 2005 Oracle. All rights reserved.
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
38
DECLARE_RWSEM(configfs_rename_sem);
39
/*
40
* Protects mutations of configfs_dirent linkage together with proper i_mutex
41
* Also protects mutations of symlinks linkage to target configfs_dirent
42
* Mutators of configfs_dirent linkage must *both* have the proper inode locked
43
* and configfs_dirent_lock locked, in that order.
44
* This allows one to safely traverse configfs_dirent trees and symlinks without
45
* having to lock inodes.
46
*
47
* Protects setting of CONFIGFS_USET_DROPPING: checking the flag
48
* unlocked is not reliable unless in detach_groups() called from
49
* rmdir()/unregister() and from configfs_attach_group()
50
*/
51
DEFINE_SPINLOCK(configfs_dirent_lock);
52
53
static 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
/* Coordinate with configfs_readdir */
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
* We _must_ delete our dentries on last dput, as the chain-to-parent
71
* behavior is required to clear the parents of default_groups.
72
*/
73
static int configfs_d_delete(const struct dentry *dentry)
74
{
75
return 1;
76
}
77
78
const struct dentry_operations configfs_dentry_ops = {
79
.d_iput = configfs_d_iput,
80
/* simple_delete_dentry() isn't exported */
81
.d_delete = configfs_d_delete,
82
};
83
84
#ifdef CONFIG_LOCKDEP
85
86
/*
87
* Helpers to make lockdep happy with our recursive locking of default groups'
88
* inodes (see configfs_attach_group() and configfs_detach_group()).
89
* We put default groups i_mutexes in separate classes according to their depth
90
* from the youngest non-default group ancestor.
91
*
92
* For a non-default group A having default groups A/B, A/C, and A/C/D, default
93
* groups A/B and A/C will have their inode's mutex in class
94
* default_group_class[0], and default group A/C/D will be in
95
* default_group_class[1].
96
*
97
* The lock classes are declared and assigned in inode.c, according to the
98
* s_depth value.
99
* The s_depth value is initialized to -1, adjusted to >= 0 when attaching
100
* default groups, and reset to -1 when all default groups are attached. During
101
* attachment, if configfs_create() sees s_depth > 0, the lock class of the new
102
* inode's mutex is set to default_group_class[s_depth - 1].
103
*/
104
105
static void configfs_init_dirent_depth(struct configfs_dirent *sd)
106
{
107
sd->s_depth = -1;
108
}
109
110
static 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
119
static void
120
configfs_adjust_dir_dirent_depth_before_populate(struct configfs_dirent *sd)
121
{
122
/*
123
* item's i_mutex class is already setup, so s_depth is now only
124
* used to set new sub-directories s_depth, which is always done
125
* with item's i_mutex locked.
126
*/
127
/*
128
* sd->s_depth == -1 iff we are a non default group.
129
* else (we are a default group) sd->s_depth > 0 (see
130
* create_dir()).
131
*/
132
if (sd->s_depth == -1)
133
/*
134
* We are a non default group and we are going to create
135
* default groups.
136
*/
137
sd->s_depth = 0;
138
}
139
140
static void
141
configfs_adjust_dir_dirent_depth_after_populate(struct configfs_dirent *sd)
142
{
143
/* We will not create default groups anymore. */
144
sd->s_depth = -1;
145
}
146
147
#else /* CONFIG_LOCKDEP */
148
149
static void configfs_init_dirent_depth(struct configfs_dirent *sd)
150
{
151
}
152
153
static void configfs_set_dir_dirent_depth(struct configfs_dirent *parent_sd,
154
struct configfs_dirent *sd)
155
{
156
}
157
158
static void
159
configfs_adjust_dir_dirent_depth_before_populate(struct configfs_dirent *sd)
160
{
161
}
162
163
static void
164
configfs_adjust_dir_dirent_depth_after_populate(struct configfs_dirent *sd)
165
{
166
}
167
168
#endif /* CONFIG_LOCKDEP */
169
170
/*
171
* Allocates a new configfs_dirent and links it to the parent configfs_dirent
172
*/
173
static 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
* Return -EEXIST if there is already a configfs element with the same
203
* name for the same parent.
204
*
205
* called with parent inode's i_mutex held
206
*/
207
static 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
226
int 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
244
static int init_dir(struct inode * inode)
245
{
246
inode->i_op = &configfs_dir_inode_operations;
247
inode->i_fop = &configfs_dir_operations;
248
249
/* directory inodes start off with i_nlink == 2 (for "." entry) */
250
inc_nlink(inode);
251
return 0;
252
}
253
254
static 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
261
static int init_symlink(struct inode * inode)
262
{
263
inode->i_op = &configfs_symlink_inode_operations;
264
return 0;
265
}
266
267
static int create_dir(struct config_item * k, struct dentry * p,
268
struct dentry * d)
269
{
270
int error;
271
umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
272
273
error = configfs_dirent_exists(p->d_fsdata, d->d_name.name);
274
if (!error)
275
error = configfs_make_dirent(p->d_fsdata, d, k, mode,
276
CONFIGFS_DIR | CONFIGFS_USET_CREATING);
277
if (!error) {
278
configfs_set_dir_dirent_depth(p->d_fsdata, d->d_fsdata);
279
error = configfs_create(d, mode, init_dir);
280
if (!error) {
281
inc_nlink(p->d_inode);
282
} else {
283
struct configfs_dirent *sd = d->d_fsdata;
284
if (sd) {
285
spin_lock(&configfs_dirent_lock);
286
list_del_init(&sd->s_sibling);
287
spin_unlock(&configfs_dirent_lock);
288
configfs_put(sd);
289
}
290
}
291
}
292
return error;
293
}
294
295
296
/**
297
* configfs_create_dir - create a directory for an config_item.
298
* @item: config_itemwe're creating directory for.
299
* @dentry: config_item's dentry.
300
*
301
* Note: user-created entries won't be allowed under this new directory
302
* until it is validated by configfs_dir_set_ready()
303
*/
304
305
static int configfs_create_dir(struct config_item * item, struct dentry *dentry)
306
{
307
struct dentry * parent;
308
int error = 0;
309
310
BUG_ON(!item);
311
312
if (item->ci_parent)
313
parent = item->ci_parent->ci_dentry;
314
else if (configfs_mount && configfs_mount->mnt_sb)
315
parent = configfs_mount->mnt_sb->s_root;
316
else
317
return -EFAULT;
318
319
error = create_dir(item,parent,dentry);
320
if (!error)
321
item->ci_dentry = dentry;
322
return error;
323
}
324
325
/*
326
* Allow userspace to create new entries under a new directory created with
327
* configfs_create_dir(), and under all of its chidlren directories recursively.
328
* @sd configfs_dirent of the new directory to validate
329
*
330
* Caller must hold configfs_dirent_lock.
331
*/
332
static void configfs_dir_set_ready(struct configfs_dirent *sd)
333
{
334
struct configfs_dirent *child_sd;
335
336
sd->s_type &= ~CONFIGFS_USET_CREATING;
337
list_for_each_entry(child_sd, &sd->s_children, s_sibling)
338
if (child_sd->s_type & CONFIGFS_USET_CREATING)
339
configfs_dir_set_ready(child_sd);
340
}
341
342
/*
343
* Check that a directory does not belong to a directory hierarchy being
344
* attached and not validated yet.
345
* @sd configfs_dirent of the directory to check
346
*
347
* @return non-zero iff the directory was validated
348
*
349
* Note: takes configfs_dirent_lock, so the result may change from false to true
350
* in two consecutive calls, but never from true to false.
351
*/
352
int configfs_dirent_is_ready(struct configfs_dirent *sd)
353
{
354
int ret;
355
356
spin_lock(&configfs_dirent_lock);
357
ret = !(sd->s_type & CONFIGFS_USET_CREATING);
358
spin_unlock(&configfs_dirent_lock);
359
360
return ret;
361
}
362
363
int configfs_create_link(struct configfs_symlink *sl,
364
struct dentry *parent,
365
struct dentry *dentry)
366
{
367
int err = 0;
368
umode_t mode = S_IFLNK | S_IRWXUGO;
369
370
err = configfs_make_dirent(parent->d_fsdata, dentry, sl, mode,
371
CONFIGFS_ITEM_LINK);
372
if (!err) {
373
err = configfs_create(dentry, mode, init_symlink);
374
if (err) {
375
struct configfs_dirent *sd = dentry->d_fsdata;
376
if (sd) {
377
spin_lock(&configfs_dirent_lock);
378
list_del_init(&sd->s_sibling);
379
spin_unlock(&configfs_dirent_lock);
380
configfs_put(sd);
381
}
382
}
383
}
384
return err;
385
}
386
387
static void remove_dir(struct dentry * d)
388
{
389
struct dentry * parent = dget(d->d_parent);
390
struct configfs_dirent * sd;
391
392
sd = d->d_fsdata;
393
spin_lock(&configfs_dirent_lock);
394
list_del_init(&sd->s_sibling);
395
spin_unlock(&configfs_dirent_lock);
396
configfs_put(sd);
397
if (d->d_inode)
398
simple_rmdir(parent->d_inode,d);
399
400
pr_debug(" o %s removing done (%d)\n",d->d_name.name, d->d_count);
401
402
dput(parent);
403
}
404
405
/**
406
* configfs_remove_dir - remove an config_item's directory.
407
* @item: config_item we're removing.
408
*
409
* The only thing special about this is that we remove any files in
410
* the directory before we remove the directory, and we've inlined
411
* what used to be configfs_rmdir() below, instead of calling separately.
412
*
413
* Caller holds the mutex of the item's inode
414
*/
415
416
static void configfs_remove_dir(struct config_item * item)
417
{
418
struct dentry * dentry = dget(item->ci_dentry);
419
420
if (!dentry)
421
return;
422
423
remove_dir(dentry);
424
/**
425
* Drop reference from dget() on entrance.
426
*/
427
dput(dentry);
428
}
429
430
431
/* attaches attribute's configfs_dirent to the dentry corresponding to the
432
* attribute file
433
*/
434
static int configfs_attach_attr(struct configfs_dirent * sd, struct dentry * dentry)
435
{
436
struct configfs_attribute * attr = sd->s_element;
437
int error;
438
439
dentry->d_fsdata = configfs_get(sd);
440
sd->s_dentry = dentry;
441
error = configfs_create(dentry, (attr->ca_mode & S_IALLUGO) | S_IFREG,
442
configfs_init_file);
443
if (error) {
444
configfs_put(sd);
445
return error;
446
}
447
448
d_rehash(dentry);
449
450
return 0;
451
}
452
453
static struct dentry * configfs_lookup(struct inode *dir,
454
struct dentry *dentry,
455
struct nameidata *nd)
456
{
457
struct configfs_dirent * parent_sd = dentry->d_parent->d_fsdata;
458
struct configfs_dirent * sd;
459
int found = 0;
460
int err;
461
462
/*
463
* Fake invisibility if dir belongs to a group/default groups hierarchy
464
* being attached
465
*
466
* This forbids userspace to read/write attributes of items which may
467
* not complete their initialization, since the dentries of the
468
* attributes won't be instantiated.
469
*/
470
err = -ENOENT;
471
if (!configfs_dirent_is_ready(parent_sd))
472
goto out;
473
474
list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
475
if (sd->s_type & CONFIGFS_NOT_PINNED) {
476
const unsigned char * name = configfs_get_name(sd);
477
478
if (strcmp(name, dentry->d_name.name))
479
continue;
480
481
found = 1;
482
err = configfs_attach_attr(sd, dentry);
483
break;
484
}
485
}
486
487
if (!found) {
488
/*
489
* If it doesn't exist and it isn't a NOT_PINNED item,
490
* it must be negative.
491
*/
492
if (dentry->d_name.len > NAME_MAX)
493
return ERR_PTR(-ENAMETOOLONG);
494
d_add(dentry, NULL);
495
return NULL;
496
}
497
498
out:
499
return ERR_PTR(err);
500
}
501
502
/*
503
* Only subdirectories count here. Files (CONFIGFS_NOT_PINNED) are
504
* attributes and are removed by rmdir(). We recurse, setting
505
* CONFIGFS_USET_DROPPING on all children that are candidates for
506
* default detach.
507
* If there is an error, the caller will reset the flags via
508
* configfs_detach_rollback().
509
*/
510
static int configfs_detach_prep(struct dentry *dentry, struct mutex **wait_mutex)
511
{
512
struct configfs_dirent *parent_sd = dentry->d_fsdata;
513
struct configfs_dirent *sd;
514
int ret;
515
516
/* Mark that we're trying to drop the group */
517
parent_sd->s_type |= CONFIGFS_USET_DROPPING;
518
519
ret = -EBUSY;
520
if (!list_empty(&parent_sd->s_links))
521
goto out;
522
523
ret = 0;
524
list_for_each_entry(sd, &parent_sd->s_children, s_sibling) {
525
if (!sd->s_element ||
526
(sd->s_type & CONFIGFS_NOT_PINNED))
527
continue;
528
if (sd->s_type & CONFIGFS_USET_DEFAULT) {
529
/* Abort if racing with mkdir() */
530
if (sd->s_type & CONFIGFS_USET_IN_MKDIR) {
531
if (wait_mutex)
532
*wait_mutex = &sd->s_dentry->d_inode->i_mutex;
533
return -EAGAIN;
534
}
535
536
/*
537
* Yup, recursive. If there's a problem, blame
538
* deep nesting of default_groups
539
*/
540
ret = configfs_detach_prep(sd->s_dentry, wait_mutex);
541
if (!ret)
542
continue;
543
} else
544
ret = -ENOTEMPTY;
545
546
break;
547
}
548
549
out:
550
return ret;
551
}
552
553
/*
554
* Walk the tree, resetting CONFIGFS_USET_DROPPING wherever it was
555
* set.
556
*/
557
static void configfs_detach_rollback(struct dentry *dentry)
558
{
559
struct configfs_dirent *parent_sd = dentry->d_fsdata;
560
struct configfs_dirent *sd;
561
562
parent_sd->s_type &= ~CONFIGFS_USET_DROPPING;
563
564
list_for_each_entry(sd, &parent_sd->s_children, s_sibling)
565
if (sd->s_type & CONFIGFS_USET_DEFAULT)
566
configfs_detach_rollback(sd->s_dentry);
567
}
568
569
static void detach_attrs(struct config_item * item)
570
{
571
struct dentry * dentry = dget(item->ci_dentry);
572
struct configfs_dirent * parent_sd;
573
struct configfs_dirent * sd, * tmp;
574
575
if (!dentry)
576
return;
577
578
pr_debug("configfs %s: dropping attrs for dir\n",
579
dentry->d_name.name);
580
581
parent_sd = dentry->d_fsdata;
582
list_for_each_entry_safe(sd, tmp, &parent_sd->s_children, s_sibling) {
583
if (!sd->s_element || !(sd->s_type & CONFIGFS_NOT_PINNED))
584
continue;
585
spin_lock(&configfs_dirent_lock);
586
list_del_init(&sd->s_sibling);
587
spin_unlock(&configfs_dirent_lock);
588
configfs_drop_dentry(sd, dentry);
589
configfs_put(sd);
590
}
591
592
/**
593
* Drop reference from dget() on entrance.
594
*/
595
dput(dentry);
596
}
597
598
static int populate_attrs(struct config_item *item)
599
{
600
struct config_item_type *t = item->ci_type;
601
struct configfs_attribute *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
614
if (error)
615
detach_attrs(item);
616
617
return error;
618
}
619
620
static int configfs_attach_group(struct config_item *parent_item,
621
struct config_item *item,
622
struct dentry *dentry);
623
static void configfs_detach_group(struct config_item *item);
624
625
static void detach_groups(struct config_group *group)
626
{
627
struct dentry * dentry = dget(group->cg_item.ci_dentry);
628
struct dentry *child;
629
struct configfs_dirent *parent_sd;
630
struct configfs_dirent *sd, *tmp;
631
632
if (!dentry)
633
return;
634
635
parent_sd = dentry->d_fsdata;
636
list_for_each_entry_safe(sd, tmp, &parent_sd->s_children, s_sibling) {
637
if (!sd->s_element ||
638
!(sd->s_type & CONFIGFS_USET_DEFAULT))
639
continue;
640
641
child = sd->s_dentry;
642
643
mutex_lock(&child->d_inode->i_mutex);
644
645
configfs_detach_group(sd->s_element);
646
child->d_inode->i_flags |= S_DEAD;
647
dont_mount(child);
648
649
mutex_unlock(&child->d_inode->i_mutex);
650
651
d_delete(child);
652
dput(child);
653
}
654
655
/**
656
* Drop reference from dget() on entrance.
657
*/
658
dput(dentry);
659
}
660
661
/*
662
* This fakes mkdir(2) on a default_groups[] entry. It
663
* creates a dentry, attachs it, and then does fixup
664
* on the sd->s_type.
665
*
666
* We could, perhaps, tweak our parent's ->mkdir for a minute and
667
* try using vfs_mkdir. Just a thought.
668
*/
669
static int create_default_group(struct config_group *parent_group,
670
struct config_group *group)
671
{
672
int ret;
673
struct qstr name;
674
struct configfs_dirent *sd;
675
/* We trust the caller holds a reference to parent */
676
struct dentry *child, *parent = parent_group->cg_item.ci_dentry;
677
678
if (!group->cg_item.ci_name)
679
group->cg_item.ci_name = group->cg_item.ci_namebuf;
680
name.name = group->cg_item.ci_name;
681
name.len = strlen(name.name);
682
name.hash = full_name_hash(name.name, name.len);
683
684
ret = -ENOMEM;
685
child = d_alloc(parent, &name);
686
if (child) {
687
d_add(child, NULL);
688
689
ret = configfs_attach_group(&parent_group->cg_item,
690
&group->cg_item, child);
691
if (!ret) {
692
sd = child->d_fsdata;
693
sd->s_type |= CONFIGFS_USET_DEFAULT;
694
} else {
695
BUG_ON(child->d_inode);
696
d_drop(child);
697
dput(child);
698
}
699
}
700
701
return ret;
702
}
703
704
static int populate_groups(struct config_group *group)
705
{
706
struct config_group *new_group;
707
int ret = 0;
708
int i;
709
710
if (group->default_groups) {
711
for (i = 0; group->default_groups[i]; i++) {
712
new_group = group->default_groups[i];
713
714
ret = create_default_group(group, new_group);
715
if (ret) {
716
detach_groups(group);
717
break;
718
}
719
}
720
}
721
722
return ret;
723
}
724
725
/*
726
* All of link_obj/unlink_obj/link_group/unlink_group require that
727
* subsys->su_mutex is held.
728
*/
729
730
static void unlink_obj(struct config_item *item)
731
{
732
struct config_group *group;
733
734
group = item->ci_group;
735
if (group) {
736
list_del_init(&item->ci_entry);
737
738
item->ci_group = NULL;
739
item->ci_parent = NULL;
740
741
/* Drop the reference for ci_entry */
742
config_item_put(item);
743
744
/* Drop the reference for ci_parent */
745
config_group_put(group);
746
}
747
}
748
749
static void link_obj(struct config_item *parent_item, struct config_item *item)
750
{
751
/*
752
* Parent seems redundant with group, but it makes certain
753
* traversals much nicer.
754
*/
755
item->ci_parent = parent_item;
756
757
/*
758
* We hold a reference on the parent for the child's ci_parent
759
* link.
760
*/
761
item->ci_group = config_group_get(to_config_group(parent_item));
762
list_add_tail(&item->ci_entry, &item->ci_group->cg_children);
763
764
/*
765
* We hold a reference on the child for ci_entry on the parent's
766
* cg_children
767
*/
768
config_item_get(item);
769
}
770
771
static void unlink_group(struct config_group *group)
772
{
773
int i;
774
struct config_group *new_group;
775
776
if (group->default_groups) {
777
for (i = 0; group->default_groups[i]; i++) {
778
new_group = group->default_groups[i];
779
unlink_group(new_group);
780
}
781
}
782
783
group->cg_subsys = NULL;
784
unlink_obj(&group->cg_item);
785
}
786
787
static void link_group(struct config_group *parent_group, struct config_group *group)
788
{
789
int i;
790
struct config_group *new_group;
791
struct configfs_subsystem *subsys = NULL; /* gcc is a turd */
792
793
link_obj(&parent_group->cg_item, &group->cg_item);
794
795
if (parent_group->cg_subsys)
796
subsys = parent_group->cg_subsys;
797
else if (configfs_is_root(&parent_group->cg_item))
798
subsys = to_configfs_subsystem(group);
799
else
800
BUG();
801
group->cg_subsys = subsys;
802
803
if (group->default_groups) {
804
for (i = 0; group->default_groups[i]; i++) {
805
new_group = group->default_groups[i];
806
link_group(group, new_group);
807
}
808
}
809
}
810
811
/*
812
* The goal is that configfs_attach_item() (and
813
* configfs_attach_group()) can be called from either the VFS or this
814
* module. That is, they assume that the items have been created,
815
* the dentry allocated, and the dcache is all ready to go.
816
*
817
* If they fail, they must clean up after themselves as if they
818
* had never been called. The caller (VFS or local function) will
819
* handle cleaning up the dcache bits.
820
*
821
* configfs_detach_group() and configfs_detach_item() behave similarly on
822
* the way out. They assume that the proper semaphores are held, they
823
* clean up the configfs items, and they expect their callers will
824
* handle the dcache bits.
825
*/
826
static int configfs_attach_item(struct config_item *parent_item,
827
struct config_item *item,
828
struct dentry *dentry)
829
{
830
int ret;
831
832
ret = configfs_create_dir(item, dentry);
833
if (!ret) {
834
ret = populate_attrs(item);
835
if (ret) {
836
/*
837
* We are going to remove an inode and its dentry but
838
* the VFS may already have hit and used them. Thus,
839
* we must lock them as rmdir() would.
840
*/
841
mutex_lock(&dentry->d_inode->i_mutex);
842
configfs_remove_dir(item);
843
dentry->d_inode->i_flags |= S_DEAD;
844
dont_mount(dentry);
845
mutex_unlock(&dentry->d_inode->i_mutex);
846
d_delete(dentry);
847
}
848
}
849
850
return ret;
851
}
852
853
/* Caller holds the mutex of the item's inode */
854
static void configfs_detach_item(struct config_item *item)
855
{
856
detach_attrs(item);
857
configfs_remove_dir(item);
858
}
859
860
static int configfs_attach_group(struct config_item *parent_item,
861
struct config_item *item,
862
struct dentry *dentry)
863
{
864
int ret;
865
struct configfs_dirent *sd;
866
867
ret = configfs_attach_item(parent_item, item, dentry);
868
if (!ret) {
869
sd = dentry->d_fsdata;
870
sd->s_type |= CONFIGFS_USET_DIR;
871
872
/*
873
* FYI, we're faking mkdir in populate_groups()
874
* We must lock the group's inode to avoid races with the VFS
875
* which can already hit the inode and try to add/remove entries
876
* under it.
877
*
878
* We must also lock the inode to remove it safely in case of
879
* error, as rmdir() would.
880
*/
881
mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
882
configfs_adjust_dir_dirent_depth_before_populate(sd);
883
ret = populate_groups(to_config_group(item));
884
if (ret) {
885
configfs_detach_item(item);
886
dentry->d_inode->i_flags |= S_DEAD;
887
dont_mount(dentry);
888
}
889
configfs_adjust_dir_dirent_depth_after_populate(sd);
890
mutex_unlock(&dentry->d_inode->i_mutex);
891
if (ret)
892
d_delete(dentry);
893
}
894
895
return ret;
896
}
897
898
/* Caller holds the mutex of the group's inode */
899
static void configfs_detach_group(struct config_item *item)
900
{
901
detach_groups(to_config_group(item));
902
configfs_detach_item(item);
903
}
904
905
/*
906
* After the item has been detached from the filesystem view, we are
907
* ready to tear it out of the hierarchy. Notify the client before
908
* we do that so they can perform any cleanup that requires
909
* navigating the hierarchy. A client does not need to provide this
910
* callback. The subsystem semaphore MUST be held by the caller, and
911
* references must be valid for both items. It also assumes the
912
* caller has validated ci_type.
913
*/
914
static void client_disconnect_notify(struct config_item *parent_item,
915
struct config_item *item)
916
{
917
struct config_item_type *type;
918
919
type = parent_item->ci_type;
920
BUG_ON(!type);
921
922
if (type->ct_group_ops && type->ct_group_ops->disconnect_notify)
923
type->ct_group_ops->disconnect_notify(to_config_group(parent_item),
924
item);
925
}
926
927
/*
928
* Drop the initial reference from make_item()/make_group()
929
* This function assumes that reference is held on item
930
* and that item holds a valid reference to the parent. Also, it
931
* assumes the caller has validated ci_type.
932
*/
933
static void client_drop_item(struct config_item *parent_item,
934
struct config_item *item)
935
{
936
struct config_item_type *type;
937
938
type = parent_item->ci_type;
939
BUG_ON(!type);
940
941
/*
942
* If ->drop_item() exists, it is responsible for the
943
* config_item_put().
944
*/
945
if (type->ct_group_ops && type->ct_group_ops->drop_item)
946
type->ct_group_ops->drop_item(to_config_group(parent_item),
947
item);
948
else
949
config_item_put(item);
950
}
951
952
#ifdef DEBUG
953
static void configfs_dump_one(struct configfs_dirent *sd, int level)
954
{
955
printk(KERN_INFO "%*s\"%s\":\n", level, " ", configfs_get_name(sd));
956
957
#define type_print(_type) if (sd->s_type & _type) printk(KERN_INFO "%*s %s\n", level, " ", #_type);
958
type_print(CONFIGFS_ROOT);
959
type_print(CONFIGFS_DIR);
960
type_print(CONFIGFS_ITEM_ATTR);
961
type_print(CONFIGFS_ITEM_LINK);
962
type_print(CONFIGFS_USET_DIR);
963
type_print(CONFIGFS_USET_DEFAULT);
964
type_print(CONFIGFS_USET_DROPPING);
965
#undef type_print
966
}
967
968
static int configfs_dump(struct configfs_dirent *sd, int level)
969
{
970
struct configfs_dirent *child_sd;
971
int ret = 0;
972
973
configfs_dump_one(sd, level);
974
975
if (!(sd->s_type & (CONFIGFS_DIR|CONFIGFS_ROOT)))
976
return 0;
977
978
list_for_each_entry(child_sd, &sd->s_children, s_sibling) {
979
ret = configfs_dump(child_sd, level + 2);
980
if (ret)
981
break;
982
}
983
984
return ret;
985
}
986
#endif
987
988
989
/*
990
* configfs_depend_item() and configfs_undepend_item()
991
*
992
* WARNING: Do not call these from a configfs callback!
993
*
994
* This describes these functions and their helpers.
995
*
996
* Allow another kernel system to depend on a config_item. If this
997
* happens, the item cannot go away until the dependent can live without
998
* it. The idea is to give client modules as simple an interface as
999
* possible. When a system asks them to depend on an item, they just
1000
* call configfs_depend_item(). If the item is live and the client
1001
* driver is in good shape, we'll happily do the work for them.
1002
*
1003
* Why is the locking complex? Because configfs uses the VFS to handle
1004
* all locking, but this function is called outside the normal
1005
* VFS->configfs path. So it must take VFS locks to prevent the
1006
* VFS->configfs stuff (configfs_mkdir(), configfs_rmdir(), etc). This is
1007
* why you can't call these functions underneath configfs callbacks.
1008
*
1009
* Note, btw, that this can be called at *any* time, even when a configfs
1010
* subsystem isn't registered, or when configfs is loading or unloading.
1011
* Just like configfs_register_subsystem(). So we take the same
1012
* precautions. We pin the filesystem. We lock configfs_dirent_lock.
1013
* If we can find the target item in the
1014
* configfs tree, it must be part of the subsystem tree as well, so we
1015
* do not need the subsystem semaphore. Holding configfs_dirent_lock helps
1016
* locking out mkdir() and rmdir(), who might be racing us.
1017
*/
1018
1019
/*
1020
* configfs_depend_prep()
1021
*
1022
* Only subdirectories count here. Files (CONFIGFS_NOT_PINNED) are
1023
* attributes. This is similar but not the same to configfs_detach_prep().
1024
* Note that configfs_detach_prep() expects the parent to be locked when it
1025
* is called, but we lock the parent *inside* configfs_depend_prep(). We
1026
* do that so we can unlock it if we find nothing.
1027
*
1028
* Here we do a depth-first search of the dentry hierarchy looking for
1029
* our object.
1030
* We deliberately ignore items tagged as dropping since they are virtually
1031
* dead, as well as items in the middle of attachment since they virtually
1032
* do not exist yet. This completes the locking out of racing mkdir() and
1033
* rmdir().
1034
* Note: subdirectories in the middle of attachment start with s_type =
1035
* CONFIGFS_DIR|CONFIGFS_USET_CREATING set by create_dir(). When
1036
* CONFIGFS_USET_CREATING is set, we ignore the item. The actual set of
1037
* s_type is in configfs_new_dirent(), which has configfs_dirent_lock.
1038
*
1039
* If the target is not found, -ENOENT is bubbled up.
1040
*
1041
* This adds a requirement that all config_items be unique!
1042
*
1043
* This is recursive. There isn't
1044
* much on the stack, though, so folks that need this function - be careful
1045
* about your stack! Patches will be accepted to make it iterative.
1046
*/
1047
static int configfs_depend_prep(struct dentry *origin,
1048
struct config_item *target)
1049
{
1050
struct configfs_dirent *child_sd, *sd = origin->d_fsdata;
1051
int ret = 0;
1052
1053
BUG_ON(!origin || !sd);
1054
1055
if (sd->s_element == target) /* Boo-yah */
1056
goto out;
1057
1058
list_for_each_entry(child_sd, &sd->s_children, s_sibling) {
1059
if ((child_sd->s_type & CONFIGFS_DIR) &&
1060
!(child_sd->s_type & CONFIGFS_USET_DROPPING) &&
1061
!(child_sd->s_type & CONFIGFS_USET_CREATING)) {
1062
ret = configfs_depend_prep(child_sd->s_dentry,
1063
target);
1064
if (!ret)
1065
goto out; /* Child path boo-yah */
1066
}
1067
}
1068
1069
/* We looped all our children and didn't find target */
1070
ret = -ENOENT;
1071
1072
out:
1073
return ret;
1074
}
1075
1076
int configfs_depend_item(struct configfs_subsystem *subsys,
1077
struct config_item *target)
1078
{
1079
int ret;
1080
struct configfs_dirent *p, *root_sd, *subsys_sd = NULL;
1081
struct config_item *s_item = &subsys->su_group.cg_item;
1082
1083
/*
1084
* Pin the configfs filesystem. This means we can safely access
1085
* the root of the configfs filesystem.
1086
*/
1087
ret = configfs_pin_fs();
1088
if (ret)
1089
return ret;
1090
1091
/*
1092
* Next, lock the root directory. We're going to check that the
1093
* subsystem is really registered, and so we need to lock out
1094
* configfs_[un]register_subsystem().
1095
*/
1096
mutex_lock(&configfs_sb->s_root->d_inode->i_mutex);
1097
1098
root_sd = configfs_sb->s_root->d_fsdata;
1099
1100
list_for_each_entry(p, &root_sd->s_children, s_sibling) {
1101
if (p->s_type & CONFIGFS_DIR) {
1102
if (p->s_element == s_item) {
1103
subsys_sd = p;
1104
break;
1105
}
1106
}
1107
}
1108
1109
if (!subsys_sd) {
1110
ret = -ENOENT;
1111
goto out_unlock_fs;
1112
}
1113
1114
/* Ok, now we can trust subsys/s_item */
1115
1116
spin_lock(&configfs_dirent_lock);
1117
/* Scan the tree, return 0 if found */
1118
ret = configfs_depend_prep(subsys_sd->s_dentry, target);
1119
if (ret)
1120
goto out_unlock_dirent_lock;
1121
1122
/*
1123
* We are sure that the item is not about to be removed by rmdir(), and
1124
* not in the middle of attachment by mkdir().
1125
*/
1126
p = target->ci_dentry->d_fsdata;
1127
p->s_dependent_count += 1;
1128
1129
out_unlock_dirent_lock:
1130
spin_unlock(&configfs_dirent_lock);
1131
out_unlock_fs:
1132
mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
1133
1134
/*
1135
* If we succeeded, the fs is pinned via other methods. If not,
1136
* we're done with it anyway. So release_fs() is always right.
1137
*/
1138
configfs_release_fs();
1139
1140
return ret;
1141
}
1142
EXPORT_SYMBOL(configfs_depend_item);
1143
1144
/*
1145
* Release the dependent linkage. This is much simpler than
1146
* configfs_depend_item() because we know that that the client driver is
1147
* pinned, thus the subsystem is pinned, and therefore configfs is pinned.
1148
*/
1149
void configfs_undepend_item(struct configfs_subsystem *subsys,
1150
struct config_item *target)
1151
{
1152
struct configfs_dirent *sd;
1153
1154
/*
1155
* Since we can trust everything is pinned, we just need
1156
* configfs_dirent_lock.
1157
*/
1158
spin_lock(&configfs_dirent_lock);
1159
1160
sd = target->ci_dentry->d_fsdata;
1161
BUG_ON(sd->s_dependent_count < 1);
1162
1163
sd->s_dependent_count -= 1;
1164
1165
/*
1166
* After this unlock, we cannot trust the item to stay alive!
1167
* DO NOT REFERENCE item after this unlock.
1168
*/
1169
spin_unlock(&configfs_dirent_lock);
1170
}
1171
EXPORT_SYMBOL(configfs_undepend_item);
1172
1173
static int configfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
1174
{
1175
int ret = 0;
1176
int module_got = 0;
1177
struct config_group *group = NULL;
1178
struct config_item *item = NULL;
1179
struct config_item *parent_item;
1180
struct configfs_subsystem *subsys;
1181
struct configfs_dirent *sd;
1182
struct config_item_type *type;
1183
struct module *subsys_owner = NULL, *new_item_owner = NULL;
1184
char *name;
1185
1186
if (dentry->d_parent == configfs_sb->s_root) {
1187
ret = -EPERM;
1188
goto out;
1189
}
1190
1191
sd = dentry->d_parent->d_fsdata;
1192
1193
/*
1194
* Fake invisibility if dir belongs to a group/default groups hierarchy
1195
* being attached
1196
*/
1197
if (!configfs_dirent_is_ready(sd)) {
1198
ret = -ENOENT;
1199
goto out;
1200
}
1201
1202
if (!(sd->s_type & CONFIGFS_USET_DIR)) {
1203
ret = -EPERM;
1204
goto out;
1205
}
1206
1207
/* Get a working ref for the duration of this function */
1208
parent_item = configfs_get_config_item(dentry->d_parent);
1209
type = parent_item->ci_type;
1210
subsys = to_config_group(parent_item)->cg_subsys;
1211
BUG_ON(!subsys);
1212
1213
if (!type || !type->ct_group_ops ||
1214
(!type->ct_group_ops->make_group &&
1215
!type->ct_group_ops->make_item)) {
1216
ret = -EPERM; /* Lack-of-mkdir returns -EPERM */
1217
goto out_put;
1218
}
1219
1220
/*
1221
* The subsystem may belong to a different module than the item
1222
* being created. We don't want to safely pin the new item but
1223
* fail to pin the subsystem it sits under.
1224
*/
1225
if (!subsys->su_group.cg_item.ci_type) {
1226
ret = -EINVAL;
1227
goto out_put;
1228
}
1229
subsys_owner = subsys->su_group.cg_item.ci_type->ct_owner;
1230
if (!try_module_get(subsys_owner)) {
1231
ret = -EINVAL;
1232
goto out_put;
1233
}
1234
1235
name = kmalloc(dentry->d_name.len + 1, GFP_KERNEL);
1236
if (!name) {
1237
ret = -ENOMEM;
1238
goto out_subsys_put;
1239
}
1240
1241
snprintf(name, dentry->d_name.len + 1, "%s", dentry->d_name.name);
1242
1243
mutex_lock(&subsys->su_mutex);
1244
if (type->ct_group_ops->make_group) {
1245
group = type->ct_group_ops->make_group(to_config_group(parent_item), name);
1246
if (!group)
1247
group = ERR_PTR(-ENOMEM);
1248
if (!IS_ERR(group)) {
1249
link_group(to_config_group(parent_item), group);
1250
item = &group->cg_item;
1251
} else
1252
ret = PTR_ERR(group);
1253
} else {
1254
item = type->ct_group_ops->make_item(to_config_group(parent_item), name);
1255
if (!item)
1256
item = ERR_PTR(-ENOMEM);
1257
if (!IS_ERR(item))
1258
link_obj(parent_item, item);
1259
else
1260
ret = PTR_ERR(item);
1261
}
1262
mutex_unlock(&subsys->su_mutex);
1263
1264
kfree(name);
1265
if (ret) {
1266
/*
1267
* If ret != 0, then link_obj() was never called.
1268
* There are no extra references to clean up.
1269
*/
1270
goto out_subsys_put;
1271
}
1272
1273
/*
1274
* link_obj() has been called (via link_group() for groups).
1275
* From here on out, errors must clean that up.
1276
*/
1277
1278
type = item->ci_type;
1279
if (!type) {
1280
ret = -EINVAL;
1281
goto out_unlink;
1282
}
1283
1284
new_item_owner = type->ct_owner;
1285
if (!try_module_get(new_item_owner)) {
1286
ret = -EINVAL;
1287
goto out_unlink;
1288
}
1289
1290
/*
1291
* I hate doing it this way, but if there is
1292
* an error, module_put() probably should
1293
* happen after any cleanup.
1294
*/
1295
module_got = 1;
1296
1297
/*
1298
* Make racing rmdir() fail if it did not tag parent with
1299
* CONFIGFS_USET_DROPPING
1300
* Note: if CONFIGFS_USET_DROPPING is already set, attach_group() will
1301
* fail and let rmdir() terminate correctly
1302
*/
1303
spin_lock(&configfs_dirent_lock);
1304
/* This will make configfs_detach_prep() fail */
1305
sd->s_type |= CONFIGFS_USET_IN_MKDIR;
1306
spin_unlock(&configfs_dirent_lock);
1307
1308
if (group)
1309
ret = configfs_attach_group(parent_item, item, dentry);
1310
else
1311
ret = configfs_attach_item(parent_item, item, dentry);
1312
1313
spin_lock(&configfs_dirent_lock);
1314
sd->s_type &= ~CONFIGFS_USET_IN_MKDIR;
1315
if (!ret)
1316
configfs_dir_set_ready(dentry->d_fsdata);
1317
spin_unlock(&configfs_dirent_lock);
1318
1319
out_unlink:
1320
if (ret) {
1321
/* Tear down everything we built up */
1322
mutex_lock(&subsys->su_mutex);
1323
1324
client_disconnect_notify(parent_item, item);
1325
if (group)
1326
unlink_group(group);
1327
else
1328
unlink_obj(item);
1329
client_drop_item(parent_item, item);
1330
1331
mutex_unlock(&subsys->su_mutex);
1332
1333
if (module_got)
1334
module_put(new_item_owner);
1335
}
1336
1337
out_subsys_put:
1338
if (ret)
1339
module_put(subsys_owner);
1340
1341
out_put:
1342
/*
1343
* link_obj()/link_group() took a reference from child->parent,
1344
* so the parent is safely pinned. We can drop our working
1345
* reference.
1346
*/
1347
config_item_put(parent_item);
1348
1349
out:
1350
return ret;
1351
}
1352
1353
static int configfs_rmdir(struct inode *dir, struct dentry *dentry)
1354
{
1355
struct config_item *parent_item;
1356
struct config_item *item;
1357
struct configfs_subsystem *subsys;
1358
struct configfs_dirent *sd;
1359
struct module *subsys_owner = NULL, *dead_item_owner = NULL;
1360
int ret;
1361
1362
if (dentry->d_parent == configfs_sb->s_root)
1363
return -EPERM;
1364
1365
sd = dentry->d_fsdata;
1366
if (sd->s_type & CONFIGFS_USET_DEFAULT)
1367
return -EPERM;
1368
1369
/* Get a working ref until we have the child */
1370
parent_item = configfs_get_config_item(dentry->d_parent);
1371
subsys = to_config_group(parent_item)->cg_subsys;
1372
BUG_ON(!subsys);
1373
1374
if (!parent_item->ci_type) {
1375
config_item_put(parent_item);
1376
return -EINVAL;
1377
}
1378
1379
/* configfs_mkdir() shouldn't have allowed this */
1380
BUG_ON(!subsys->su_group.cg_item.ci_type);
1381
subsys_owner = subsys->su_group.cg_item.ci_type->ct_owner;
1382
1383
/*
1384
* Ensure that no racing symlink() will make detach_prep() fail while
1385
* the new link is temporarily attached
1386
*/
1387
do {
1388
struct mutex *wait_mutex;
1389
1390
mutex_lock(&configfs_symlink_mutex);
1391
spin_lock(&configfs_dirent_lock);
1392
/*
1393
* Here's where we check for dependents. We're protected by
1394
* configfs_dirent_lock.
1395
* If no dependent, atomically tag the item as dropping.
1396
*/
1397
ret = sd->s_dependent_count ? -EBUSY : 0;
1398
if (!ret) {
1399
ret = configfs_detach_prep(dentry, &wait_mutex);
1400
if (ret)
1401
configfs_detach_rollback(dentry);
1402
}
1403
spin_unlock(&configfs_dirent_lock);
1404
mutex_unlock(&configfs_symlink_mutex);
1405
1406
if (ret) {
1407
if (ret != -EAGAIN) {
1408
config_item_put(parent_item);
1409
return ret;
1410
}
1411
1412
/* Wait until the racing operation terminates */
1413
mutex_lock(wait_mutex);
1414
mutex_unlock(wait_mutex);
1415
}
1416
} while (ret == -EAGAIN);
1417
1418
/* Get a working ref for the duration of this function */
1419
item = configfs_get_config_item(dentry);
1420
1421
/* Drop reference from above, item already holds one. */
1422
config_item_put(parent_item);
1423
1424
if (item->ci_type)
1425
dead_item_owner = item->ci_type->ct_owner;
1426
1427
if (sd->s_type & CONFIGFS_USET_DIR) {
1428
configfs_detach_group(item);
1429
1430
mutex_lock(&subsys->su_mutex);
1431
client_disconnect_notify(parent_item, item);
1432
unlink_group(to_config_group(item));
1433
} else {
1434
configfs_detach_item(item);
1435
1436
mutex_lock(&subsys->su_mutex);
1437
client_disconnect_notify(parent_item, item);
1438
unlink_obj(item);
1439
}
1440
1441
client_drop_item(parent_item, item);
1442
mutex_unlock(&subsys->su_mutex);
1443
1444
/* Drop our reference from above */
1445
config_item_put(item);
1446
1447
module_put(dead_item_owner);
1448
module_put(subsys_owner);
1449
1450
return 0;
1451
}
1452
1453
const struct inode_operations configfs_dir_inode_operations = {
1454
.mkdir = configfs_mkdir,
1455
.rmdir = configfs_rmdir,
1456
.symlink = configfs_symlink,
1457
.unlink = configfs_unlink,
1458
.lookup = configfs_lookup,
1459
.setattr = configfs_setattr,
1460
};
1461
1462
#if 0
1463
int configfs_rename_dir(struct config_item * item, const char *new_name)
1464
{
1465
int error = 0;
1466
struct dentry * new_dentry, * parent;
1467
1468
if (!strcmp(config_item_name(item), new_name))
1469
return -EINVAL;
1470
1471
if (!item->parent)
1472
return -EINVAL;
1473
1474
down_write(&configfs_rename_sem);
1475
parent = item->parent->dentry;
1476
1477
mutex_lock(&parent->d_inode->i_mutex);
1478
1479
new_dentry = lookup_one_len(new_name, parent, strlen(new_name));
1480
if (!IS_ERR(new_dentry)) {
1481
if (!new_dentry->d_inode) {
1482
error = config_item_set_name(item, "%s", new_name);
1483
if (!error) {
1484
d_add(new_dentry, NULL);
1485
d_move(item->dentry, new_dentry);
1486
}
1487
else
1488
d_delete(new_dentry);
1489
} else
1490
error = -EEXIST;
1491
dput(new_dentry);
1492
}
1493
mutex_unlock(&parent->d_inode->i_mutex);
1494
up_write(&configfs_rename_sem);
1495
1496
return error;
1497
}
1498
#endif
1499
1500
static int configfs_dir_open(struct inode *inode, struct file *file)
1501
{
1502
struct dentry * dentry = file->f_path.dentry;
1503
struct configfs_dirent * parent_sd = dentry->d_fsdata;
1504
int err;
1505
1506
mutex_lock(&dentry->d_inode->i_mutex);
1507
/*
1508
* Fake invisibility if dir belongs to a group/default groups hierarchy
1509
* being attached
1510
*/
1511
err = -ENOENT;
1512
if (configfs_dirent_is_ready(parent_sd)) {
1513
file->private_data = configfs_new_dirent(parent_sd, NULL, 0);
1514
if (IS_ERR(file->private_data))
1515
err = PTR_ERR(file->private_data);
1516
else
1517
err = 0;
1518
}
1519
mutex_unlock(&dentry->d_inode->i_mutex);
1520
1521
return err;
1522
}
1523
1524
static int configfs_dir_close(struct inode *inode, struct file *file)
1525
{
1526
struct dentry * dentry = file->f_path.dentry;
1527
struct configfs_dirent * cursor = file->private_data;
1528
1529
mutex_lock(&dentry->d_inode->i_mutex);
1530
spin_lock(&configfs_dirent_lock);
1531
list_del_init(&cursor->s_sibling);
1532
spin_unlock(&configfs_dirent_lock);
1533
mutex_unlock(&dentry->d_inode->i_mutex);
1534
1535
release_configfs_dirent(cursor);
1536
1537
return 0;
1538
}
1539
1540
/* Relationship between s_mode and the DT_xxx types */
1541
static inline unsigned char dt_type(struct configfs_dirent *sd)
1542
{
1543
return (sd->s_mode >> 12) & 15;
1544
}
1545
1546
static int configfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
1547
{
1548
struct dentry *dentry = filp->f_path.dentry;
1549
struct configfs_dirent * parent_sd = dentry->d_fsdata;
1550
struct configfs_dirent *cursor = filp->private_data;
1551
struct list_head *p, *q = &cursor->s_sibling;
1552
ino_t ino = 0;
1553
int i = filp->f_pos;
1554
1555
switch (i) {
1556
case 0:
1557
ino = dentry->d_inode->i_ino;
1558
if (filldir(dirent, ".", 1, i, ino, DT_DIR) < 0)
1559
break;
1560
filp->f_pos++;
1561
i++;
1562
/* fallthrough */
1563
case 1:
1564
ino = parent_ino(dentry);
1565
if (filldir(dirent, "..", 2, i, ino, DT_DIR) < 0)
1566
break;
1567
filp->f_pos++;
1568
i++;
1569
/* fallthrough */
1570
default:
1571
if (filp->f_pos == 2) {
1572
spin_lock(&configfs_dirent_lock);
1573
list_move(q, &parent_sd->s_children);
1574
spin_unlock(&configfs_dirent_lock);
1575
}
1576
for (p=q->next; p!= &parent_sd->s_children; p=p->next) {
1577
struct configfs_dirent *next;
1578
const char * name;
1579
int len;
1580
struct inode *inode = NULL;
1581
1582
next = list_entry(p, struct configfs_dirent,
1583
s_sibling);
1584
if (!next->s_element)
1585
continue;
1586
1587
name = configfs_get_name(next);
1588
len = strlen(name);
1589
1590
/*
1591
* We'll have a dentry and an inode for
1592
* PINNED items and for open attribute
1593
* files. We lock here to prevent a race
1594
* with configfs_d_iput() clearing
1595
* s_dentry before calling iput().
1596
*
1597
* Why do we go to the trouble? If
1598
* someone has an attribute file open,
1599
* the inode number should match until
1600
* they close it. Beyond that, we don't
1601
* care.
1602
*/
1603
spin_lock(&configfs_dirent_lock);
1604
dentry = next->s_dentry;
1605
if (dentry)
1606
inode = dentry->d_inode;
1607
if (inode)
1608
ino = inode->i_ino;
1609
spin_unlock(&configfs_dirent_lock);
1610
if (!inode)
1611
ino = iunique(configfs_sb, 2);
1612
1613
if (filldir(dirent, name, len, filp->f_pos, ino,
1614
dt_type(next)) < 0)
1615
return 0;
1616
1617
spin_lock(&configfs_dirent_lock);
1618
list_move(q, p);
1619
spin_unlock(&configfs_dirent_lock);
1620
p = q;
1621
filp->f_pos++;
1622
}
1623
}
1624
return 0;
1625
}
1626
1627
static loff_t configfs_dir_lseek(struct file * file, loff_t offset, int origin)
1628
{
1629
struct dentry * dentry = file->f_path.dentry;
1630
1631
mutex_lock(&dentry->d_inode->i_mutex);
1632
switch (origin) {
1633
case 1:
1634
offset += file->f_pos;
1635
case 0:
1636
if (offset >= 0)
1637
break;
1638
default:
1639
mutex_unlock(&file->f_path.dentry->d_inode->i_mutex);
1640
return -EINVAL;
1641
}
1642
if (offset != file->f_pos) {
1643
file->f_pos = offset;
1644
if (file->f_pos >= 2) {
1645
struct configfs_dirent *sd = dentry->d_fsdata;
1646
struct configfs_dirent *cursor = file->private_data;
1647
struct list_head *p;
1648
loff_t n = file->f_pos - 2;
1649
1650
spin_lock(&configfs_dirent_lock);
1651
list_del(&cursor->s_sibling);
1652
p = sd->s_children.next;
1653
while (n && p != &sd->s_children) {
1654
struct configfs_dirent *next;
1655
next = list_entry(p, struct configfs_dirent,
1656
s_sibling);
1657
if (next->s_element)
1658
n--;
1659
p = p->next;
1660
}
1661
list_add_tail(&cursor->s_sibling, p);
1662
spin_unlock(&configfs_dirent_lock);
1663
}
1664
}
1665
mutex_unlock(&dentry->d_inode->i_mutex);
1666
return offset;
1667
}
1668
1669
const struct file_operations configfs_dir_operations = {
1670
.open = configfs_dir_open,
1671
.release = configfs_dir_close,
1672
.llseek = configfs_dir_lseek,
1673
.read = generic_read_dir,
1674
.readdir = configfs_readdir,
1675
};
1676
1677
int configfs_register_subsystem(struct configfs_subsystem *subsys)
1678
{
1679
int err;
1680
struct config_group *group = &subsys->su_group;
1681
struct qstr name;
1682
struct dentry *dentry;
1683
struct configfs_dirent *sd;
1684
1685
err = configfs_pin_fs();
1686
if (err)
1687
return err;
1688
1689
if (!group->cg_item.ci_name)
1690
group->cg_item.ci_name = group->cg_item.ci_namebuf;
1691
1692
sd = configfs_sb->s_root->d_fsdata;
1693
link_group(to_config_group(sd->s_element), group);
1694
1695
mutex_lock_nested(&configfs_sb->s_root->d_inode->i_mutex,
1696
I_MUTEX_PARENT);
1697
1698
name.name = group->cg_item.ci_name;
1699
name.len = strlen(name.name);
1700
name.hash = full_name_hash(name.name, name.len);
1701
1702
err = -ENOMEM;
1703
dentry = d_alloc(configfs_sb->s_root, &name);
1704
if (dentry) {
1705
d_add(dentry, NULL);
1706
1707
err = configfs_attach_group(sd->s_element, &group->cg_item,
1708
dentry);
1709
if (err) {
1710
BUG_ON(dentry->d_inode);
1711
d_drop(dentry);
1712
dput(dentry);
1713
} else {
1714
spin_lock(&configfs_dirent_lock);
1715
configfs_dir_set_ready(dentry->d_fsdata);
1716
spin_unlock(&configfs_dirent_lock);
1717
}
1718
}
1719
1720
mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
1721
1722
if (err) {
1723
unlink_group(group);
1724
configfs_release_fs();
1725
}
1726
1727
return err;
1728
}
1729
1730
void configfs_unregister_subsystem(struct configfs_subsystem *subsys)
1731
{
1732
struct config_group *group = &subsys->su_group;
1733
struct dentry *dentry = group->cg_item.ci_dentry;
1734
1735
if (dentry->d_parent != configfs_sb->s_root) {
1736
printk(KERN_ERR "configfs: Tried to unregister non-subsystem!\n");
1737
return;
1738
}
1739
1740
mutex_lock_nested(&configfs_sb->s_root->d_inode->i_mutex,
1741
I_MUTEX_PARENT);
1742
mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
1743
mutex_lock(&configfs_symlink_mutex);
1744
spin_lock(&configfs_dirent_lock);
1745
if (configfs_detach_prep(dentry, NULL)) {
1746
printk(KERN_ERR "configfs: Tried to unregister non-empty subsystem!\n");
1747
}
1748
spin_unlock(&configfs_dirent_lock);
1749
mutex_unlock(&configfs_symlink_mutex);
1750
configfs_detach_group(&group->cg_item);
1751
dentry->d_inode->i_flags |= S_DEAD;
1752
dont_mount(dentry);
1753
mutex_unlock(&dentry->d_inode->i_mutex);
1754
1755
d_delete(dentry);
1756
1757
mutex_unlock(&configfs_sb->s_root->d_inode->i_mutex);
1758
1759
dput(dentry);
1760
1761
unlink_group(group);
1762
configfs_release_fs();
1763
}
1764
1765
EXPORT_SYMBOL(configfs_register_subsystem);
1766
EXPORT_SYMBOL(configfs_unregister_subsystem);
1767
1768