sysfs: Gut sysfs_addrm_start and sysfs_addrm_finish
[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 /**
390  *      sysfs_addrm_start - prepare for sysfs_dirent add/remove
391  *      @acxt: pointer to sysfs_addrm_cxt to be used
392  *      @parent_sd: parent sysfs_dirent
393  *
394  *      This function is called when the caller is about to add or
395  *      remove sysfs_dirent under @parent_sd.  This function acquires
396  *      sysfs_mutex.  @acxt is used to keep and pass context to
397  *      other addrm functions.
398  *
399  *      LOCKING:
400  *      Kernel thread context (may sleep).  sysfs_mutex is locked on
401  *      return.
402  */
403 void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
404                        struct sysfs_dirent *parent_sd)
405 {
406         memset(acxt, 0, sizeof(*acxt));
407         acxt->parent_sd = parent_sd;
408
409         mutex_lock(&sysfs_mutex);
410 }
411
412 /**
413  *      __sysfs_add_one - add sysfs_dirent to parent without warning
414  *      @acxt: addrm context to use
415  *      @sd: sysfs_dirent to be added
416  *
417  *      Get @acxt->parent_sd and set sd->s_parent to it and increment
418  *      nlink of parent inode if @sd is a directory and link into the
419  *      children list of the parent.
420  *
421  *      This function should be called between calls to
422  *      sysfs_addrm_start() and sysfs_addrm_finish() and should be
423  *      passed the same @acxt as passed to sysfs_addrm_start().
424  *
425  *      LOCKING:
426  *      Determined by sysfs_addrm_start().
427  *
428  *      RETURNS:
429  *      0 on success, -EEXIST if entry with the given name already
430  *      exists.
431  */
432 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
433 {
434         struct sysfs_inode_attrs *ps_iattr;
435
436         if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
437                 return -EEXIST;
438
439         sd->s_parent = sysfs_get(acxt->parent_sd);
440
441         sysfs_link_sibling(sd);
442
443         /* Update timestamps on the parent */
444         ps_iattr = acxt->parent_sd->s_iattr;
445         if (ps_iattr) {
446                 struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
447                 ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
448         }
449
450         return 0;
451 }
452
453 /**
454  *      sysfs_pathname - return full path to sysfs dirent
455  *      @sd: sysfs_dirent whose path we want
456  *      @path: caller allocated buffer
457  *
458  *      Gives the name "/" to the sysfs_root entry; any path returned
459  *      is relative to wherever sysfs is mounted.
460  *
461  *      XXX: does no error checking on @path size
462  */
463 static char *sysfs_pathname(struct sysfs_dirent *sd, char *path)
464 {
465         if (sd->s_parent) {
466                 sysfs_pathname(sd->s_parent, path);
467                 strcat(path, "/");
468         }
469         strcat(path, sd->s_name);
470         return path;
471 }
472
473 /**
474  *      sysfs_add_one - add sysfs_dirent to parent
475  *      @acxt: addrm context to use
476  *      @sd: sysfs_dirent to be added
477  *
478  *      Get @acxt->parent_sd and set sd->s_parent to it and increment
479  *      nlink of parent inode if @sd is a directory and link into the
480  *      children list of the parent.
481  *
482  *      This function should be called between calls to
483  *      sysfs_addrm_start() and sysfs_addrm_finish() and should be
484  *      passed the same @acxt as passed to sysfs_addrm_start().
485  *
486  *      LOCKING:
487  *      Determined by sysfs_addrm_start().
488  *
489  *      RETURNS:
490  *      0 on success, -EEXIST if entry with the given name already
491  *      exists.
492  */
493 int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
494 {
495         int ret;
496
497         ret = __sysfs_add_one(acxt, sd);
498         if (ret == -EEXIST) {
499                 char *path = kzalloc(PATH_MAX, GFP_KERNEL);
500                 WARN(1, KERN_WARNING
501                      "sysfs: cannot create duplicate filename '%s'\n",
502                      (path == NULL) ? sd->s_name :
503                      strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"),
504                             sd->s_name));
505                 kfree(path);
506         }
507
508         return ret;
509 }
510
511 /**
512  *      sysfs_remove_one - remove sysfs_dirent from parent
513  *      @acxt: addrm context to use
514  *      @sd: sysfs_dirent to be removed
515  *
516  *      Mark @sd removed and drop nlink of parent inode if @sd is a
517  *      directory.  @sd is unlinked from the children list.
518  *
519  *      This function should be called between calls to
520  *      sysfs_addrm_start() and sysfs_addrm_finish() and should be
521  *      passed the same @acxt as passed to sysfs_addrm_start().
522  *
523  *      LOCKING:
524  *      Determined by sysfs_addrm_start().
525  */
526 void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
527 {
528         struct sysfs_inode_attrs *ps_iattr;
529
530         BUG_ON(sd->s_flags & SYSFS_FLAG_REMOVED);
531
532         sysfs_unlink_sibling(sd);
533
534         /* Update timestamps on the parent */
535         ps_iattr = acxt->parent_sd->s_iattr;
536         if (ps_iattr) {
537                 struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
538                 ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
539         }
540
541         sd->s_flags |= SYSFS_FLAG_REMOVED;
542         sd->s_sibling = acxt->removed;
543         acxt->removed = sd;
544 }
545
546 /**
547  *      sysfs_addrm_finish - finish up sysfs_dirent add/remove
548  *      @acxt: addrm context to finish up
549  *
550  *      Finish up sysfs_dirent add/remove.  Resources acquired by
551  *      sysfs_addrm_start() are released and removed sysfs_dirents are
552  *      cleaned up.
553  *
554  *      LOCKING:
555  *      sysfs_mutex is released.
556  */
557 void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt)
558 {
559         /* release resources acquired by sysfs_addrm_start() */
560         mutex_unlock(&sysfs_mutex);
561
562         /* kill removed sysfs_dirents */
563         while (acxt->removed) {
564                 struct sysfs_dirent *sd = acxt->removed;
565
566                 acxt->removed = sd->s_sibling;
567                 sd->s_sibling = NULL;
568
569                 sysfs_deactivate(sd);
570                 unmap_bin_file(sd);
571                 sysfs_put(sd);
572         }
573 }
574
575 /**
576  *      sysfs_find_dirent - find sysfs_dirent with the given name
577  *      @parent_sd: sysfs_dirent to search under
578  *      @name: name to look for
579  *
580  *      Look for sysfs_dirent with name @name under @parent_sd.
581  *
582  *      LOCKING:
583  *      mutex_lock(sysfs_mutex)
584  *
585  *      RETURNS:
586  *      Pointer to sysfs_dirent if found, NULL if not.
587  */
588 struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
589                                        const unsigned char *name)
590 {
591         struct sysfs_dirent *sd;
592
593         for (sd = parent_sd->s_dir.children; sd; sd = sd->s_sibling)
594                 if (!strcmp(sd->s_name, name))
595                         return sd;
596         return NULL;
597 }
598
599 /**
600  *      sysfs_get_dirent - find and get sysfs_dirent with the given name
601  *      @parent_sd: sysfs_dirent to search under
602  *      @name: name to look for
603  *
604  *      Look for sysfs_dirent with name @name under @parent_sd and get
605  *      it if found.
606  *
607  *      LOCKING:
608  *      Kernel thread context (may sleep).  Grabs sysfs_mutex.
609  *
610  *      RETURNS:
611  *      Pointer to sysfs_dirent if found, NULL if not.
612  */
613 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
614                                       const unsigned char *name)
615 {
616         struct sysfs_dirent *sd;
617
618         mutex_lock(&sysfs_mutex);
619         sd = sysfs_find_dirent(parent_sd, name);
620         sysfs_get(sd);
621         mutex_unlock(&sysfs_mutex);
622
623         return sd;
624 }
625 EXPORT_SYMBOL_GPL(sysfs_get_dirent);
626
627 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
628                       const char *name, struct sysfs_dirent **p_sd)
629 {
630         umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
631         struct sysfs_addrm_cxt acxt;
632         struct sysfs_dirent *sd;
633         int rc;
634
635         /* allocate */
636         sd = sysfs_new_dirent(name, mode, SYSFS_DIR);
637         if (!sd)
638                 return -ENOMEM;
639         sd->s_dir.kobj = kobj;
640
641         /* link in */
642         sysfs_addrm_start(&acxt, parent_sd);
643         rc = sysfs_add_one(&acxt, sd);
644         sysfs_addrm_finish(&acxt);
645
646         if (rc == 0)
647                 *p_sd = sd;
648         else
649                 sysfs_put(sd);
650
651         return rc;
652 }
653
654 int sysfs_create_subdir(struct kobject *kobj, const char *name,
655                         struct sysfs_dirent **p_sd)
656 {
657         return create_dir(kobj, kobj->sd, name, p_sd);
658 }
659
660 /**
661  *      sysfs_create_dir - create a directory for an object.
662  *      @kobj:          object we're creating directory for. 
663  */
664 int sysfs_create_dir(struct kobject * kobj)
665 {
666         struct sysfs_dirent *parent_sd, *sd;
667         int error = 0;
668
669         BUG_ON(!kobj);
670
671         if (kobj->parent)
672                 parent_sd = kobj->parent->sd;
673         else
674                 parent_sd = &sysfs_root;
675
676         error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd);
677         if (!error)
678                 kobj->sd = sd;
679         return error;
680 }
681
682 static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
683                                 struct nameidata *nd)
684 {
685         struct dentry *ret = NULL;
686         struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata;
687         struct sysfs_dirent *sd;
688         struct inode *inode;
689
690         mutex_lock(&sysfs_mutex);
691
692         sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);
693
694         /* no such entry */
695         if (!sd) {
696                 ret = ERR_PTR(-ENOENT);
697                 goto out_unlock;
698         }
699
700         /* attach dentry and inode */
701         inode = sysfs_get_inode(sd);
702         if (!inode) {
703                 ret = ERR_PTR(-ENOMEM);
704                 goto out_unlock;
705         }
706
707         /* instantiate and hash dentry */
708         dentry->d_op = &sysfs_dentry_ops;
709         dentry->d_fsdata = sysfs_get(sd);
710         d_instantiate(dentry, inode);
711         d_rehash(dentry);
712
713  out_unlock:
714         mutex_unlock(&sysfs_mutex);
715         return ret;
716 }
717
718 const struct inode_operations sysfs_dir_inode_operations = {
719         .lookup         = sysfs_lookup,
720         .permission     = sysfs_permission,
721         .setattr        = sysfs_setattr,
722         .getattr        = sysfs_getattr,
723         .setxattr       = sysfs_setxattr,
724 };
725
726 static void remove_dir(struct sysfs_dirent *sd)
727 {
728         struct sysfs_addrm_cxt acxt;
729
730         sysfs_addrm_start(&acxt, sd->s_parent);
731         sysfs_remove_one(&acxt, sd);
732         sysfs_addrm_finish(&acxt);
733 }
734
735 void sysfs_remove_subdir(struct sysfs_dirent *sd)
736 {
737         remove_dir(sd);
738 }
739
740
741 static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd)
742 {
743         struct sysfs_addrm_cxt acxt;
744         struct sysfs_dirent **pos;
745
746         if (!dir_sd)
747                 return;
748
749         pr_debug("sysfs %s: removing dir\n", dir_sd->s_name);
750         sysfs_addrm_start(&acxt, dir_sd);
751         pos = &dir_sd->s_dir.children;
752         while (*pos) {
753                 struct sysfs_dirent *sd = *pos;
754
755                 if (sysfs_type(sd) != SYSFS_DIR)
756                         sysfs_remove_one(&acxt, sd);
757                 else
758                         pos = &(*pos)->s_sibling;
759         }
760         sysfs_addrm_finish(&acxt);
761
762         remove_dir(dir_sd);
763 }
764
765 /**
766  *      sysfs_remove_dir - remove an object's directory.
767  *      @kobj:  object.
768  *
769  *      The only thing special about this is that we remove any files in
770  *      the directory before we remove the directory, and we've inlined
771  *      what used to be sysfs_rmdir() below, instead of calling separately.
772  */
773
774 void sysfs_remove_dir(struct kobject * kobj)
775 {
776         struct sysfs_dirent *sd = kobj->sd;
777
778         spin_lock(&sysfs_assoc_lock);
779         kobj->sd = NULL;
780         spin_unlock(&sysfs_assoc_lock);
781
782         __sysfs_remove_dir(sd);
783 }
784
785 int sysfs_rename_dir(struct kobject * kobj, const char *new_name)
786 {
787         struct sysfs_dirent *sd = kobj->sd;
788         struct dentry *parent = NULL;
789         struct dentry *old_dentry = NULL, *new_dentry = NULL;
790         const char *dup_name = NULL;
791         int error;
792
793         mutex_lock(&sysfs_rename_mutex);
794
795         error = 0;
796         if (strcmp(sd->s_name, new_name) == 0)
797                 goto out;       /* nothing to rename */
798
799         /* get the original dentry */
800         old_dentry = sysfs_get_dentry(sd);
801         if (IS_ERR(old_dentry)) {
802                 error = PTR_ERR(old_dentry);
803                 old_dentry = NULL;
804                 goto out;
805         }
806
807         parent = old_dentry->d_parent;
808
809         /* lock parent and get dentry for new name */
810         mutex_lock(&parent->d_inode->i_mutex);
811         mutex_lock(&sysfs_mutex);
812
813         error = -EEXIST;
814         if (sysfs_find_dirent(sd->s_parent, new_name))
815                 goto out_unlock;
816
817         error = -ENOMEM;
818         new_dentry = d_alloc_name(parent, new_name);
819         if (!new_dentry)
820                 goto out_unlock;
821
822         /* rename sysfs_dirent */
823         error = -ENOMEM;
824         new_name = dup_name = kstrdup(new_name, GFP_KERNEL);
825         if (!new_name)
826                 goto out_unlock;
827
828         dup_name = sd->s_name;
829         sd->s_name = new_name;
830
831         /* rename */
832         d_add(new_dentry, NULL);
833         d_move(old_dentry, new_dentry);
834
835         error = 0;
836  out_unlock:
837         mutex_unlock(&sysfs_mutex);
838         mutex_unlock(&parent->d_inode->i_mutex);
839         kfree(dup_name);
840         dput(old_dentry);
841         dput(new_dentry);
842  out:
843         mutex_unlock(&sysfs_rename_mutex);
844         return error;
845 }
846
847 int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj)
848 {
849         struct sysfs_dirent *sd = kobj->sd;
850         struct sysfs_dirent *new_parent_sd;
851         struct dentry *old_parent, *new_parent = NULL;
852         struct dentry *old_dentry = NULL, *new_dentry = NULL;
853         int error;
854
855         mutex_lock(&sysfs_rename_mutex);
856         BUG_ON(!sd->s_parent);
857         new_parent_sd = (new_parent_kobj && new_parent_kobj->sd) ?
858                 new_parent_kobj->sd : &sysfs_root;
859
860         error = 0;
861         if (sd->s_parent == new_parent_sd)
862                 goto out;       /* nothing to move */
863
864         /* get dentries */
865         old_dentry = sysfs_get_dentry(sd);
866         if (IS_ERR(old_dentry)) {
867                 error = PTR_ERR(old_dentry);
868                 old_dentry = NULL;
869                 goto out;
870         }
871         old_parent = old_dentry->d_parent;
872
873         new_parent = sysfs_get_dentry(new_parent_sd);
874         if (IS_ERR(new_parent)) {
875                 error = PTR_ERR(new_parent);
876                 new_parent = NULL;
877                 goto out;
878         }
879
880 again:
881         mutex_lock(&old_parent->d_inode->i_mutex);
882         if (!mutex_trylock(&new_parent->d_inode->i_mutex)) {
883                 mutex_unlock(&old_parent->d_inode->i_mutex);
884                 goto again;
885         }
886         mutex_lock(&sysfs_mutex);
887
888         error = -EEXIST;
889         if (sysfs_find_dirent(new_parent_sd, sd->s_name))
890                 goto out_unlock;
891
892         error = -ENOMEM;
893         new_dentry = d_alloc_name(new_parent, sd->s_name);
894         if (!new_dentry)
895                 goto out_unlock;
896
897         error = 0;
898         d_add(new_dentry, NULL);
899         d_move(old_dentry, new_dentry);
900
901         /* Remove from old parent's list and insert into new parent's list. */
902         sysfs_unlink_sibling(sd);
903         sysfs_get(new_parent_sd);
904         drop_nlink(old_parent->d_inode);
905         sysfs_put(sd->s_parent);
906         sd->s_parent = new_parent_sd;
907         inc_nlink(new_parent->d_inode);
908         sysfs_link_sibling(sd);
909
910  out_unlock:
911         mutex_unlock(&sysfs_mutex);
912         mutex_unlock(&new_parent->d_inode->i_mutex);
913         mutex_unlock(&old_parent->d_inode->i_mutex);
914  out:
915         dput(new_parent);
916         dput(old_dentry);
917         dput(new_dentry);
918         mutex_unlock(&sysfs_rename_mutex);
919         return error;
920 }
921
922 /* Relationship between s_mode and the DT_xxx types */
923 static inline unsigned char dt_type(struct sysfs_dirent *sd)
924 {
925         return (sd->s_mode >> 12) & 15;
926 }
927
928 static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
929 {
930         struct dentry *dentry = filp->f_path.dentry;
931         struct sysfs_dirent * parent_sd = dentry->d_fsdata;
932         struct sysfs_dirent *pos;
933         ino_t ino;
934
935         if (filp->f_pos == 0) {
936                 ino = parent_sd->s_ino;
937                 if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) == 0)
938                         filp->f_pos++;
939         }
940         if (filp->f_pos == 1) {
941                 if (parent_sd->s_parent)
942                         ino = parent_sd->s_parent->s_ino;
943                 else
944                         ino = parent_sd->s_ino;
945                 if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) == 0)
946                         filp->f_pos++;
947         }
948         if ((filp->f_pos > 1) && (filp->f_pos < INT_MAX)) {
949                 mutex_lock(&sysfs_mutex);
950
951                 /* Skip the dentries we have already reported */
952                 pos = parent_sd->s_dir.children;
953                 while (pos && (filp->f_pos > pos->s_ino))
954                         pos = pos->s_sibling;
955
956                 for ( ; pos; pos = pos->s_sibling) {
957                         const char * name;
958                         int len;
959
960                         name = pos->s_name;
961                         len = strlen(name);
962                         filp->f_pos = ino = pos->s_ino;
963
964                         if (filldir(dirent, name, len, filp->f_pos, ino,
965                                          dt_type(pos)) < 0)
966                                 break;
967                 }
968                 if (!pos)
969                         filp->f_pos = INT_MAX;
970                 mutex_unlock(&sysfs_mutex);
971         }
972         return 0;
973 }
974
975
976 const struct file_operations sysfs_dir_operations = {
977         .read           = generic_read_dir,
978         .readdir        = sysfs_readdir,
979         .llseek         = generic_file_llseek,
980 };