sysfs: Implement sysfs_getattr & sysfs_permission
[pandora-kernel.git] / fs / sysfs / dir.c
1 /*
2  * fs/sysfs/dir.c - sysfs core and dir operation implementation
3  *
4  * Copyright (c) 2001-3 Patrick Mochel
5  * Copyright (c) 2007 SUSE Linux Products GmbH
6  * Copyright (c) 2007 Tejun Heo <teheo@suse.de>
7  *
8  * This file is released under the GPLv2.
9  *
10  * Please see Documentation/filesystems/sysfs.txt for more information.
11  */
12
13 #undef DEBUG
14
15 #include <linux/fs.h>
16 #include <linux/mount.h>
17 #include <linux/module.h>
18 #include <linux/kobject.h>
19 #include <linux/namei.h>
20 #include <linux/idr.h>
21 #include <linux/completion.h>
22 #include <linux/mutex.h>
23 #include <linux/slab.h>
24 #include <linux/security.h>
25 #include "sysfs.h"
26
27 DEFINE_MUTEX(sysfs_mutex);
28 DEFINE_MUTEX(sysfs_rename_mutex);
29 DEFINE_SPINLOCK(sysfs_assoc_lock);
30
31 static DEFINE_SPINLOCK(sysfs_ino_lock);
32 static DEFINE_IDA(sysfs_ino_ida);
33
34 /**
35  *      sysfs_link_sibling - link sysfs_dirent into sibling list
36  *      @sd: sysfs_dirent of interest
37  *
38  *      Link @sd into its sibling list which starts from
39  *      sd->s_parent->s_dir.children.
40  *
41  *      Locking:
42  *      mutex_lock(sysfs_mutex)
43  */
44 static void sysfs_link_sibling(struct sysfs_dirent *sd)
45 {
46         struct sysfs_dirent *parent_sd = sd->s_parent;
47         struct sysfs_dirent **pos;
48
49         BUG_ON(sd->s_sibling);
50
51         /* Store directory entries in order by ino.  This allows
52          * readdir to properly restart without having to add a
53          * cursor into the s_dir.children list.
54          */
55         for (pos = &parent_sd->s_dir.children; *pos; pos = &(*pos)->s_sibling) {
56                 if (sd->s_ino < (*pos)->s_ino)
57                         break;
58         }
59         sd->s_sibling = *pos;
60         *pos = sd;
61 }
62
63 /**
64  *      sysfs_unlink_sibling - unlink sysfs_dirent from sibling list
65  *      @sd: sysfs_dirent of interest
66  *
67  *      Unlink @sd from its sibling list which starts from
68  *      sd->s_parent->s_dir.children.
69  *
70  *      Locking:
71  *      mutex_lock(sysfs_mutex)
72  */
73 static void sysfs_unlink_sibling(struct sysfs_dirent *sd)
74 {
75         struct sysfs_dirent **pos;
76
77         for (pos = &sd->s_parent->s_dir.children; *pos;
78              pos = &(*pos)->s_sibling) {
79                 if (*pos == sd) {
80                         *pos = sd->s_sibling;
81                         sd->s_sibling = NULL;
82                         break;
83                 }
84         }
85 }
86
87 /**
88  *      sysfs_get_dentry - get dentry for the given sysfs_dirent
89  *      @sd: sysfs_dirent of interest
90  *
91  *      Get dentry for @sd.  Dentry is looked up if currently not
92  *      present.  This function descends from the root looking up
93  *      dentry for each step.
94  *
95  *      LOCKING:
96  *      mutex_lock(sysfs_rename_mutex)
97  *
98  *      RETURNS:
99  *      Pointer to found dentry on success, ERR_PTR() value on error.
100  */
101 struct dentry *sysfs_get_dentry(struct sysfs_dirent *sd)
102 {
103         struct dentry *dentry = dget(sysfs_sb->s_root);
104
105         while (dentry->d_fsdata != sd) {
106                 struct sysfs_dirent *cur;
107                 struct dentry *parent;
108
109                 /* find the first ancestor which hasn't been looked up */
110                 cur = sd;
111                 while (cur->s_parent != dentry->d_fsdata)
112                         cur = cur->s_parent;
113
114                 /* look it up */
115                 parent = dentry;
116                 mutex_lock(&parent->d_inode->i_mutex);
117                 dentry = lookup_one_noperm(cur->s_name, parent);
118                 mutex_unlock(&parent->d_inode->i_mutex);
119                 dput(parent);
120
121                 if (IS_ERR(dentry))
122                         break;
123         }
124         return dentry;
125 }
126
127 /**
128  *      sysfs_get_active - get an active reference to sysfs_dirent
129  *      @sd: sysfs_dirent to get an active reference to
130  *
131  *      Get an active reference of @sd.  This function is noop if @sd
132  *      is NULL.
133  *
134  *      RETURNS:
135  *      Pointer to @sd on success, NULL on failure.
136  */
137 static struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
138 {
139         if (unlikely(!sd))
140                 return NULL;
141
142         while (1) {
143                 int v, t;
144
145                 v = atomic_read(&sd->s_active);
146                 if (unlikely(v < 0))
147                         return NULL;
148
149                 t = atomic_cmpxchg(&sd->s_active, v, v + 1);
150                 if (likely(t == v))
151                         return sd;
152                 if (t < 0)
153                         return NULL;
154
155                 cpu_relax();
156         }
157 }
158
159 /**
160  *      sysfs_put_active - put an active reference to sysfs_dirent
161  *      @sd: sysfs_dirent to put an active reference to
162  *
163  *      Put an active reference to @sd.  This function is noop if @sd
164  *      is NULL.
165  */
166 static void sysfs_put_active(struct sysfs_dirent *sd)
167 {
168         struct completion *cmpl;
169         int v;
170
171         if (unlikely(!sd))
172                 return;
173
174         v = atomic_dec_return(&sd->s_active);
175         if (likely(v != SD_DEACTIVATED_BIAS))
176                 return;
177
178         /* atomic_dec_return() is a mb(), we'll always see the updated
179          * sd->s_sibling.
180          */
181         cmpl = (void *)sd->s_sibling;
182         complete(cmpl);
183 }
184
185 /**
186  *      sysfs_get_active_two - get active references to sysfs_dirent and parent
187  *      @sd: sysfs_dirent of interest
188  *
189  *      Get active reference to @sd and its parent.  Parent's active
190  *      reference is grabbed first.  This function is noop if @sd is
191  *      NULL.
192  *
193  *      RETURNS:
194  *      Pointer to @sd on success, NULL on failure.
195  */
196 struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd)
197 {
198         if (sd) {
199                 if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent)))
200                         return NULL;
201                 if (unlikely(!sysfs_get_active(sd))) {
202                         sysfs_put_active(sd->s_parent);
203                         return NULL;
204                 }
205         }
206         return sd;
207 }
208
209 /**
210  *      sysfs_put_active_two - put active references to sysfs_dirent and parent
211  *      @sd: sysfs_dirent of interest
212  *
213  *      Put active references to @sd and its parent.  This function is
214  *      noop if @sd is NULL.
215  */
216 void sysfs_put_active_two(struct sysfs_dirent *sd)
217 {
218         if (sd) {
219                 sysfs_put_active(sd);
220                 sysfs_put_active(sd->s_parent);
221         }
222 }
223
224 /**
225  *      sysfs_deactivate - deactivate sysfs_dirent
226  *      @sd: sysfs_dirent to deactivate
227  *
228  *      Deny new active references and drain existing ones.
229  */
230 static void sysfs_deactivate(struct sysfs_dirent *sd)
231 {
232         DECLARE_COMPLETION_ONSTACK(wait);
233         int v;
234
235         BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));
236         sd->s_sibling = (void *)&wait;
237
238         /* atomic_add_return() is a mb(), put_active() will always see
239          * the updated sd->s_sibling.
240          */
241         v = atomic_add_return(SD_DEACTIVATED_BIAS, &sd->s_active);
242
243         if (v != SD_DEACTIVATED_BIAS)
244                 wait_for_completion(&wait);
245
246         sd->s_sibling = NULL;
247 }
248
249 static int sysfs_alloc_ino(ino_t *pino)
250 {
251         int ino, rc;
252
253  retry:
254         spin_lock(&sysfs_ino_lock);
255         rc = ida_get_new_above(&sysfs_ino_ida, 2, &ino);
256         spin_unlock(&sysfs_ino_lock);
257
258         if (rc == -EAGAIN) {
259                 if (ida_pre_get(&sysfs_ino_ida, GFP_KERNEL))
260                         goto retry;
261                 rc = -ENOMEM;
262         }
263
264         *pino = ino;
265         return rc;
266 }
267
268 static void sysfs_free_ino(ino_t ino)
269 {
270         spin_lock(&sysfs_ino_lock);
271         ida_remove(&sysfs_ino_ida, ino);
272         spin_unlock(&sysfs_ino_lock);
273 }
274
275 void release_sysfs_dirent(struct sysfs_dirent * sd)
276 {
277         struct sysfs_dirent *parent_sd;
278
279  repeat:
280         /* Moving/renaming is always done while holding reference.
281          * sd->s_parent won't change beneath us.
282          */
283         parent_sd = sd->s_parent;
284
285         if (sysfs_type(sd) == SYSFS_KOBJ_LINK)
286                 sysfs_put(sd->s_symlink.target_sd);
287         if (sysfs_type(sd) & SYSFS_COPY_NAME)
288                 kfree(sd->s_name);
289         if (sd->s_iattr && sd->s_iattr->ia_secdata)
290                 security_release_secctx(sd->s_iattr->ia_secdata,
291                                         sd->s_iattr->ia_secdata_len);
292         kfree(sd->s_iattr);
293         sysfs_free_ino(sd->s_ino);
294         kmem_cache_free(sysfs_dir_cachep, sd);
295
296         sd = parent_sd;
297         if (sd && atomic_dec_and_test(&sd->s_count))
298                 goto repeat;
299 }
300
301 static int sysfs_dentry_delete(struct dentry *dentry)
302 {
303         struct sysfs_dirent *sd = dentry->d_fsdata;
304         return !!(sd->s_flags & SYSFS_FLAG_REMOVED);
305 }
306
307 static int sysfs_dentry_revalidate(struct dentry *dentry, struct nameidata *nd)
308 {
309         struct sysfs_dirent *sd = dentry->d_fsdata;
310         int is_dir;
311
312         mutex_lock(&sysfs_mutex);
313
314         /* The sysfs dirent has been deleted */
315         if (sd->s_flags & SYSFS_FLAG_REMOVED)
316                 goto out_bad;
317
318         mutex_unlock(&sysfs_mutex);
319 out_valid:
320         return 1;
321 out_bad:
322         /* Remove the dentry from the dcache hashes.
323          * If this is a deleted dentry we use d_drop instead of d_delete
324          * so sysfs doesn't need to cope with negative dentries.
325          */
326         is_dir = (sysfs_type(sd) == SYSFS_DIR);
327         mutex_unlock(&sysfs_mutex);
328         if (is_dir) {
329                 /* If we have submounts we must allow the vfs caches
330                  * to lie about the state of the filesystem to prevent
331                  * leaks and other nasty things.
332                  */
333                 if (have_submounts(dentry))
334                         goto out_valid;
335                 shrink_dcache_parent(dentry);
336         }
337         d_drop(dentry);
338         return 0;
339 }
340
341 static void sysfs_dentry_iput(struct dentry *dentry, struct inode *inode)
342 {
343         struct sysfs_dirent * sd = dentry->d_fsdata;
344
345         sysfs_put(sd);
346         iput(inode);
347 }
348
349 static const struct dentry_operations sysfs_dentry_ops = {
350         .d_revalidate   = sysfs_dentry_revalidate,
351         .d_delete       = sysfs_dentry_delete,
352         .d_iput         = sysfs_dentry_iput,
353 };
354
355 struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
356 {
357         char *dup_name = NULL;
358         struct sysfs_dirent *sd;
359
360         if (type & SYSFS_COPY_NAME) {
361                 name = dup_name = kstrdup(name, GFP_KERNEL);
362                 if (!name)
363                         return NULL;
364         }
365
366         sd = kmem_cache_zalloc(sysfs_dir_cachep, GFP_KERNEL);
367         if (!sd)
368                 goto err_out1;
369
370         if (sysfs_alloc_ino(&sd->s_ino))
371                 goto err_out2;
372
373         atomic_set(&sd->s_count, 1);
374         atomic_set(&sd->s_active, 0);
375
376         sd->s_name = name;
377         sd->s_mode = mode;
378         sd->s_flags = type;
379
380         return sd;
381
382  err_out2:
383         kmem_cache_free(sysfs_dir_cachep, sd);
384  err_out1:
385         kfree(dup_name);
386         return NULL;
387 }
388
389 static int sysfs_ilookup_test(struct inode *inode, void *arg)
390 {
391         struct sysfs_dirent *sd = arg;
392         return inode->i_ino == sd->s_ino;
393 }
394
395 /**
396  *      sysfs_addrm_start - prepare for sysfs_dirent add/remove
397  *      @acxt: pointer to sysfs_addrm_cxt to be used
398  *      @parent_sd: parent sysfs_dirent
399  *
400  *      This function is called when the caller is about to add or
401  *      remove sysfs_dirent under @parent_sd.  This function acquires
402  *      sysfs_mutex, grabs inode for @parent_sd if available and lock
403  *      i_mutex of it.  @acxt is used to keep and pass context to
404  *      other addrm functions.
405  *
406  *      LOCKING:
407  *      Kernel thread context (may sleep).  sysfs_mutex is locked on
408  *      return.  i_mutex of parent inode is locked on return if
409  *      available.
410  */
411 void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
412                        struct sysfs_dirent *parent_sd)
413 {
414         struct inode *inode;
415
416         memset(acxt, 0, sizeof(*acxt));
417         acxt->parent_sd = parent_sd;
418
419         /* Lookup parent inode.  inode initialization is protected by
420          * sysfs_mutex, so inode existence can be determined by
421          * looking up inode while holding sysfs_mutex.
422          */
423         mutex_lock(&sysfs_mutex);
424
425         inode = ilookup5(sysfs_sb, parent_sd->s_ino, sysfs_ilookup_test,
426                          parent_sd);
427         if (inode) {
428                 WARN_ON(inode->i_state & I_NEW);
429
430                 /* parent inode available */
431                 acxt->parent_inode = inode;
432
433                 /* sysfs_mutex is below i_mutex in lock hierarchy.
434                  * First, trylock i_mutex.  If fails, unlock
435                  * sysfs_mutex and lock them in order.
436                  */
437                 if (!mutex_trylock(&inode->i_mutex)) {
438                         mutex_unlock(&sysfs_mutex);
439                         mutex_lock(&inode->i_mutex);
440                         mutex_lock(&sysfs_mutex);
441                 }
442         }
443 }
444
445 /**
446  *      __sysfs_add_one - add sysfs_dirent to parent without warning
447  *      @acxt: addrm context to use
448  *      @sd: sysfs_dirent to be added
449  *
450  *      Get @acxt->parent_sd and set sd->s_parent to it and increment
451  *      nlink of parent inode if @sd is a directory and link into the
452  *      children list of the parent.
453  *
454  *      This function should be called between calls to
455  *      sysfs_addrm_start() and sysfs_addrm_finish() and should be
456  *      passed the same @acxt as passed to sysfs_addrm_start().
457  *
458  *      LOCKING:
459  *      Determined by sysfs_addrm_start().
460  *
461  *      RETURNS:
462  *      0 on success, -EEXIST if entry with the given name already
463  *      exists.
464  */
465 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
466 {
467         struct sysfs_inode_attrs *ps_iattr;
468
469         if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
470                 return -EEXIST;
471
472         sd->s_parent = sysfs_get(acxt->parent_sd);
473
474         if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode)
475                 inc_nlink(acxt->parent_inode);
476
477         acxt->cnt++;
478
479         sysfs_link_sibling(sd);
480
481         /* Update timestamps on the parent */
482         ps_iattr = acxt->parent_sd->s_iattr;
483         if (ps_iattr) {
484                 struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
485                 ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
486         }
487
488         return 0;
489 }
490
491 /**
492  *      sysfs_pathname - return full path to sysfs dirent
493  *      @sd: sysfs_dirent whose path we want
494  *      @path: caller allocated buffer
495  *
496  *      Gives the name "/" to the sysfs_root entry; any path returned
497  *      is relative to wherever sysfs is mounted.
498  *
499  *      XXX: does no error checking on @path size
500  */
501 static char *sysfs_pathname(struct sysfs_dirent *sd, char *path)
502 {
503         if (sd->s_parent) {
504                 sysfs_pathname(sd->s_parent, path);
505                 strcat(path, "/");
506         }
507         strcat(path, sd->s_name);
508         return path;
509 }
510
511 /**
512  *      sysfs_add_one - add sysfs_dirent to parent
513  *      @acxt: addrm context to use
514  *      @sd: sysfs_dirent to be added
515  *
516  *      Get @acxt->parent_sd and set sd->s_parent to it and increment
517  *      nlink of parent inode if @sd is a directory and link into the
518  *      children list of the parent.
519  *
520  *      This function should be called between calls to
521  *      sysfs_addrm_start() and sysfs_addrm_finish() and should be
522  *      passed the same @acxt as passed to sysfs_addrm_start().
523  *
524  *      LOCKING:
525  *      Determined by sysfs_addrm_start().
526  *
527  *      RETURNS:
528  *      0 on success, -EEXIST if entry with the given name already
529  *      exists.
530  */
531 int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
532 {
533         int ret;
534
535         ret = __sysfs_add_one(acxt, sd);
536         if (ret == -EEXIST) {
537                 char *path = kzalloc(PATH_MAX, GFP_KERNEL);
538                 WARN(1, KERN_WARNING
539                      "sysfs: cannot create duplicate filename '%s'\n",
540                      (path == NULL) ? sd->s_name :
541                      strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"),
542                             sd->s_name));
543                 kfree(path);
544         }
545
546         return ret;
547 }
548
549 /**
550  *      sysfs_remove_one - remove sysfs_dirent from parent
551  *      @acxt: addrm context to use
552  *      @sd: sysfs_dirent to be removed
553  *
554  *      Mark @sd removed and drop nlink of parent inode if @sd is a
555  *      directory.  @sd is unlinked from the children list.
556  *
557  *      This function should be called between calls to
558  *      sysfs_addrm_start() and sysfs_addrm_finish() and should be
559  *      passed the same @acxt as passed to sysfs_addrm_start().
560  *
561  *      LOCKING:
562  *      Determined by sysfs_addrm_start().
563  */
564 void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
565 {
566         struct sysfs_inode_attrs *ps_iattr;
567
568         BUG_ON(sd->s_flags & SYSFS_FLAG_REMOVED);
569
570         sysfs_unlink_sibling(sd);
571
572         /* Update timestamps on the parent */
573         ps_iattr = acxt->parent_sd->s_iattr;
574         if (ps_iattr) {
575                 struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
576                 ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
577         }
578
579         sd->s_flags |= SYSFS_FLAG_REMOVED;
580         sd->s_sibling = acxt->removed;
581         acxt->removed = sd;
582
583         if (sysfs_type(sd) == SYSFS_DIR && acxt->parent_inode)
584                 drop_nlink(acxt->parent_inode);
585
586         acxt->cnt++;
587 }
588
589 /**
590  *      sysfs_dec_nlink - Decrement link count for the specified sysfs_dirent
591  *      @sd: target sysfs_dirent
592  *
593  *      Decrement nlink for @sd.  @sd must have been unlinked from its
594  *      parent on entry to this function such that it can't be looked
595  *      up anymore.
596  */
597 static void sysfs_dec_nlink(struct sysfs_dirent *sd)
598 {
599         struct inode *inode;
600
601         inode = ilookup(sysfs_sb, sd->s_ino);
602         if (!inode)
603                 return;
604
605         /* adjust nlink and update timestamp */
606         mutex_lock(&inode->i_mutex);
607
608         inode->i_ctime = CURRENT_TIME;
609         drop_nlink(inode);
610         if (sysfs_type(sd) == SYSFS_DIR)
611                 drop_nlink(inode);
612
613         mutex_unlock(&inode->i_mutex);
614
615         iput(inode);
616 }
617
618 /**
619  *      sysfs_addrm_finish - finish up sysfs_dirent add/remove
620  *      @acxt: addrm context to finish up
621  *
622  *      Finish up sysfs_dirent add/remove.  Resources acquired by
623  *      sysfs_addrm_start() are released and removed sysfs_dirents are
624  *      cleaned up.  Timestamps on the parent inode are updated.
625  *
626  *      LOCKING:
627  *      All mutexes acquired by sysfs_addrm_start() are released.
628  */
629 void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt)
630 {
631         /* release resources acquired by sysfs_addrm_start() */
632         mutex_unlock(&sysfs_mutex);
633         if (acxt->parent_inode) {
634                 struct inode *inode = acxt->parent_inode;
635
636                 /* if added/removed, update timestamps on the parent */
637                 if (acxt->cnt)
638                         inode->i_ctime = inode->i_mtime = CURRENT_TIME;
639
640                 mutex_unlock(&inode->i_mutex);
641                 iput(inode);
642         }
643
644         /* kill removed sysfs_dirents */
645         while (acxt->removed) {
646                 struct sysfs_dirent *sd = acxt->removed;
647
648                 acxt->removed = sd->s_sibling;
649                 sd->s_sibling = NULL;
650
651                 sysfs_dec_nlink(sd);
652                 sysfs_deactivate(sd);
653                 unmap_bin_file(sd);
654                 sysfs_put(sd);
655         }
656 }
657
658 /**
659  *      sysfs_find_dirent - find sysfs_dirent with the given name
660  *      @parent_sd: sysfs_dirent to search under
661  *      @name: name to look for
662  *
663  *      Look for sysfs_dirent with name @name under @parent_sd.
664  *
665  *      LOCKING:
666  *      mutex_lock(sysfs_mutex)
667  *
668  *      RETURNS:
669  *      Pointer to sysfs_dirent if found, NULL if not.
670  */
671 struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
672                                        const unsigned char *name)
673 {
674         struct sysfs_dirent *sd;
675
676         for (sd = parent_sd->s_dir.children; sd; sd = sd->s_sibling)
677                 if (!strcmp(sd->s_name, name))
678                         return sd;
679         return NULL;
680 }
681
682 /**
683  *      sysfs_get_dirent - find and get sysfs_dirent with the given name
684  *      @parent_sd: sysfs_dirent to search under
685  *      @name: name to look for
686  *
687  *      Look for sysfs_dirent with name @name under @parent_sd and get
688  *      it if found.
689  *
690  *      LOCKING:
691  *      Kernel thread context (may sleep).  Grabs sysfs_mutex.
692  *
693  *      RETURNS:
694  *      Pointer to sysfs_dirent if found, NULL if not.
695  */
696 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
697                                       const unsigned char *name)
698 {
699         struct sysfs_dirent *sd;
700
701         mutex_lock(&sysfs_mutex);
702         sd = sysfs_find_dirent(parent_sd, name);
703         sysfs_get(sd);
704         mutex_unlock(&sysfs_mutex);
705
706         return sd;
707 }
708 EXPORT_SYMBOL_GPL(sysfs_get_dirent);
709
710 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
711                       const char *name, struct sysfs_dirent **p_sd)
712 {
713         umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
714         struct sysfs_addrm_cxt acxt;
715         struct sysfs_dirent *sd;
716         int rc;
717
718         /* allocate */
719         sd = sysfs_new_dirent(name, mode, SYSFS_DIR);
720         if (!sd)
721                 return -ENOMEM;
722         sd->s_dir.kobj = kobj;
723
724         /* link in */
725         sysfs_addrm_start(&acxt, parent_sd);
726         rc = sysfs_add_one(&acxt, sd);
727         sysfs_addrm_finish(&acxt);
728
729         if (rc == 0)
730                 *p_sd = sd;
731         else
732                 sysfs_put(sd);
733
734         return rc;
735 }
736
737 int sysfs_create_subdir(struct kobject *kobj, const char *name,
738                         struct sysfs_dirent **p_sd)
739 {
740         return create_dir(kobj, kobj->sd, name, p_sd);
741 }
742
743 /**
744  *      sysfs_create_dir - create a directory for an object.
745  *      @kobj:          object we're creating directory for. 
746  */
747 int sysfs_create_dir(struct kobject * kobj)
748 {
749         struct sysfs_dirent *parent_sd, *sd;
750         int error = 0;
751
752         BUG_ON(!kobj);
753
754         if (kobj->parent)
755                 parent_sd = kobj->parent->sd;
756         else
757                 parent_sd = &sysfs_root;
758
759         error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd);
760         if (!error)
761                 kobj->sd = sd;
762         return error;
763 }
764
765 static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
766                                 struct nameidata *nd)
767 {
768         struct dentry *ret = NULL;
769         struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata;
770         struct sysfs_dirent *sd;
771         struct inode *inode;
772
773         mutex_lock(&sysfs_mutex);
774
775         sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);
776
777         /* no such entry */
778         if (!sd) {
779                 ret = ERR_PTR(-ENOENT);
780                 goto out_unlock;
781         }
782
783         /* attach dentry and inode */
784         inode = sysfs_get_inode(sd);
785         if (!inode) {
786                 ret = ERR_PTR(-ENOMEM);
787                 goto out_unlock;
788         }
789
790         /* instantiate and hash dentry */
791         dentry->d_op = &sysfs_dentry_ops;
792         dentry->d_fsdata = sysfs_get(sd);
793         d_instantiate(dentry, inode);
794         d_rehash(dentry);
795
796  out_unlock:
797         mutex_unlock(&sysfs_mutex);
798         return ret;
799 }
800
801 const struct inode_operations sysfs_dir_inode_operations = {
802         .lookup         = sysfs_lookup,
803         .permission     = sysfs_permission,
804         .setattr        = sysfs_setattr,
805         .getattr        = sysfs_getattr,
806         .setxattr       = sysfs_setxattr,
807 };
808
809 static void remove_dir(struct sysfs_dirent *sd)
810 {
811         struct sysfs_addrm_cxt acxt;
812
813         sysfs_addrm_start(&acxt, sd->s_parent);
814         sysfs_remove_one(&acxt, sd);
815         sysfs_addrm_finish(&acxt);
816 }
817
818 void sysfs_remove_subdir(struct sysfs_dirent *sd)
819 {
820         remove_dir(sd);
821 }
822
823
824 static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd)
825 {
826         struct sysfs_addrm_cxt acxt;
827         struct sysfs_dirent **pos;
828
829         if (!dir_sd)
830                 return;
831
832         pr_debug("sysfs %s: removing dir\n", dir_sd->s_name);
833         sysfs_addrm_start(&acxt, dir_sd);
834         pos = &dir_sd->s_dir.children;
835         while (*pos) {
836                 struct sysfs_dirent *sd = *pos;
837
838                 if (sysfs_type(sd) != SYSFS_DIR)
839                         sysfs_remove_one(&acxt, sd);
840                 else
841                         pos = &(*pos)->s_sibling;
842         }
843         sysfs_addrm_finish(&acxt);
844
845         remove_dir(dir_sd);
846 }
847
848 /**
849  *      sysfs_remove_dir - remove an object's directory.
850  *      @kobj:  object.
851  *
852  *      The only thing special about this is that we remove any files in
853  *      the directory before we remove the directory, and we've inlined
854  *      what used to be sysfs_rmdir() below, instead of calling separately.
855  */
856
857 void sysfs_remove_dir(struct kobject * kobj)
858 {
859         struct sysfs_dirent *sd = kobj->sd;
860
861         spin_lock(&sysfs_assoc_lock);
862         kobj->sd = NULL;
863         spin_unlock(&sysfs_assoc_lock);
864
865         __sysfs_remove_dir(sd);
866 }
867
868 int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
869 {
870         struct sysfs_dirent *sd = kobj->sd;
871         struct dentry *parent = NULL;
872         struct dentry *old_dentry = NULL, *new_dentry = NULL;
873         const char *dup_name = NULL;
874         int error;
875
876         mutex_lock(&sysfs_rename_mutex);
877
878         error = 0;
879         if (strcmp(sd->s_name, new_name) == 0)
880                 goto out;       /* nothing to rename */
881
882         /* get the original dentry */
883         old_dentry = sysfs_get_dentry(sd);
884         if (IS_ERR(old_dentry)) {
885                 error = PTR_ERR(old_dentry);
886                 old_dentry = NULL;
887                 goto out;
888         }
889
890         parent = old_dentry->d_parent;
891
892         /* lock parent and get dentry for new name */
893         mutex_lock(&parent->d_inode->i_mutex);
894         mutex_lock(&sysfs_mutex);
895
896         error = -EEXIST;
897         if (sysfs_find_dirent(sd->s_parent, new_name))
898                 goto out_unlock;
899
900         error = -ENOMEM;
901         new_dentry = d_alloc_name(parent, new_name);
902         if (!new_dentry)
903                 goto out_unlock;
904
905         /* rename sysfs_dirent */
906         error = -ENOMEM;
907         new_name = dup_name = kstrdup(new_name, GFP_KERNEL);
908         if (!new_name)
909                 goto out_unlock;
910
911         dup_name = sd->s_name;
912         sd->s_name = new_name;
913
914         /* rename */
915         d_add(new_dentry, NULL);
916         d_move(old_dentry, new_dentry);
917
918         error = 0;
919  out_unlock:
920         mutex_unlock(&sysfs_mutex);
921         mutex_unlock(&parent->d_inode->i_mutex);
922         kfree(dup_name);
923         dput(old_dentry);
924         dput(new_dentry);
925  out:
926         mutex_unlock(&sysfs_rename_mutex);
927         return error;
928 }
929
930 int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj)
931 {
932         struct sysfs_dirent *sd = kobj->sd;
933         struct sysfs_dirent *new_parent_sd;
934         struct dentry *old_parent, *new_parent = NULL;
935         struct dentry *old_dentry = NULL, *new_dentry = NULL;
936         int error;
937
938         mutex_lock(&sysfs_rename_mutex);
939         BUG_ON(!sd->s_parent);
940         new_parent_sd = (new_parent_kobj && new_parent_kobj->sd) ?
941                 new_parent_kobj->sd : &sysfs_root;
942
943         error = 0;
944         if (sd->s_parent == new_parent_sd)
945                 goto out;       /* nothing to move */
946
947         /* get dentries */
948         old_dentry = sysfs_get_dentry(sd);
949         if (IS_ERR(old_dentry)) {
950                 error = PTR_ERR(old_dentry);
951                 old_dentry = NULL;
952                 goto out;
953         }
954         old_parent = old_dentry->d_parent;
955
956         new_parent = sysfs_get_dentry(new_parent_sd);
957         if (IS_ERR(new_parent)) {
958                 error = PTR_ERR(new_parent);
959                 new_parent = NULL;
960                 goto out;
961         }
962
963 again:
964         mutex_lock(&old_parent->d_inode->i_mutex);
965         if (!mutex_trylock(&new_parent->d_inode->i_mutex)) {
966                 mutex_unlock(&old_parent->d_inode->i_mutex);
967                 goto again;
968         }
969         mutex_lock(&sysfs_mutex);
970
971         error = -EEXIST;
972         if (sysfs_find_dirent(new_parent_sd, sd->s_name))
973                 goto out_unlock;
974
975         error = -ENOMEM;
976         new_dentry = d_alloc_name(new_parent, sd->s_name);
977         if (!new_dentry)
978                 goto out_unlock;
979
980         error = 0;
981         d_add(new_dentry, NULL);
982         d_move(old_dentry, new_dentry);
983
984         /* Remove from old parent's list and insert into new parent's list. */
985         sysfs_unlink_sibling(sd);
986         sysfs_get(new_parent_sd);
987         drop_nlink(old_parent->d_inode);
988         sysfs_put(sd->s_parent);
989         sd->s_parent = new_parent_sd;
990         inc_nlink(new_parent->d_inode);
991         sysfs_link_sibling(sd);
992
993  out_unlock:
994         mutex_unlock(&sysfs_mutex);
995         mutex_unlock(&new_parent->d_inode->i_mutex);
996         mutex_unlock(&old_parent->d_inode->i_mutex);
997  out:
998         dput(new_parent);
999         dput(old_dentry);
1000         dput(new_dentry);
1001         mutex_unlock(&sysfs_rename_mutex);
1002         return error;
1003 }
1004
1005 /* Relationship between s_mode and the DT_xxx types */
1006 static inline unsigned char dt_type(struct sysfs_dirent *sd)
1007 {
1008         return (sd->s_mode >> 12) & 15;
1009 }
1010
1011 static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
1012 {
1013         struct dentry *dentry = filp->f_path.dentry;
1014         struct sysfs_dirent * parent_sd = dentry->d_fsdata;
1015         struct sysfs_dirent *pos;
1016         ino_t ino;
1017
1018         if (filp->f_pos == 0) {
1019                 ino = parent_sd->s_ino;
1020                 if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) == 0)
1021                         filp->f_pos++;
1022         }
1023         if (filp->f_pos == 1) {
1024                 if (parent_sd->s_parent)
1025                         ino = parent_sd->s_parent->s_ino;
1026                 else
1027                         ino = parent_sd->s_ino;
1028                 if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) == 0)
1029                         filp->f_pos++;
1030         }
1031         if ((filp->f_pos > 1) && (filp->f_pos < INT_MAX)) {
1032                 mutex_lock(&sysfs_mutex);
1033
1034                 /* Skip the dentries we have already reported */
1035                 pos = parent_sd->s_dir.children;
1036                 while (pos && (filp->f_pos > pos->s_ino))
1037                         pos = pos->s_sibling;
1038
1039                 for ( ; pos; pos = pos->s_sibling) {
1040                         const char * name;
1041                         int len;
1042
1043                         name = pos->s_name;
1044                         len = strlen(name);
1045                         filp->f_pos = ino = pos->s_ino;
1046
1047                         if (filldir(dirent, name, len, filp->f_pos, ino,
1048                                          dt_type(pos)) < 0)
1049                                 break;
1050                 }
1051                 if (!pos)
1052                         filp->f_pos = INT_MAX;
1053                 mutex_unlock(&sysfs_mutex);
1054         }
1055         return 0;
1056 }
1057
1058
1059 const struct file_operations sysfs_dir_operations = {
1060         .read           = generic_read_dir,
1061         .readdir        = sysfs_readdir,
1062         .llseek         = generic_file_llseek,
1063 };