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