xref: /linux/fs/sysfs/dir.c (revision 7755726fe90a8b253659756e6de68c1a55aa427f)
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_SPINLOCK(sysfs_assoc_lock);
29 
30 static DEFINE_SPINLOCK(sysfs_ino_lock);
31 static DEFINE_IDA(sysfs_ino_ida);
32 
33 /**
34  *	sysfs_link_sibling - link sysfs_dirent into sibling list
35  *	@sd: sysfs_dirent of interest
36  *
37  *	Link @sd into its sibling list which starts from
38  *	sd->s_parent->s_dir.children.
39  *
40  *	Locking:
41  *	mutex_lock(sysfs_mutex)
42  */
43 static void sysfs_link_sibling(struct sysfs_dirent *sd)
44 {
45 	struct sysfs_dirent *parent_sd = sd->s_parent;
46 	struct sysfs_dirent **pos;
47 
48 	BUG_ON(sd->s_sibling);
49 
50 	/* Store directory entries in order by ino.  This allows
51 	 * readdir to properly restart without having to add a
52 	 * cursor into the s_dir.children list.
53 	 */
54 	for (pos = &parent_sd->s_dir.children; *pos; pos = &(*pos)->s_sibling) {
55 		if (sd->s_ino < (*pos)->s_ino)
56 			break;
57 	}
58 	sd->s_sibling = *pos;
59 	*pos = sd;
60 }
61 
62 /**
63  *	sysfs_unlink_sibling - unlink sysfs_dirent from sibling list
64  *	@sd: sysfs_dirent of interest
65  *
66  *	Unlink @sd from its sibling list which starts from
67  *	sd->s_parent->s_dir.children.
68  *
69  *	Locking:
70  *	mutex_lock(sysfs_mutex)
71  */
72 static void sysfs_unlink_sibling(struct sysfs_dirent *sd)
73 {
74 	struct sysfs_dirent **pos;
75 
76 	for (pos = &sd->s_parent->s_dir.children; *pos;
77 	     pos = &(*pos)->s_sibling) {
78 		if (*pos == sd) {
79 			*pos = sd->s_sibling;
80 			sd->s_sibling = NULL;
81 			break;
82 		}
83 	}
84 }
85 
86 /**
87  *	sysfs_get_active - get an active reference to sysfs_dirent
88  *	@sd: sysfs_dirent to get an active reference to
89  *
90  *	Get an active reference of @sd.  This function is noop if @sd
91  *	is NULL.
92  *
93  *	RETURNS:
94  *	Pointer to @sd on success, NULL on failure.
95  */
96 static struct sysfs_dirent *sysfs_get_active(struct sysfs_dirent *sd)
97 {
98 	if (unlikely(!sd))
99 		return NULL;
100 
101 	while (1) {
102 		int v, t;
103 
104 		v = atomic_read(&sd->s_active);
105 		if (unlikely(v < 0))
106 			return NULL;
107 
108 		t = atomic_cmpxchg(&sd->s_active, v, v + 1);
109 		if (likely(t == v)) {
110 			rwsem_acquire_read(&sd->dep_map, 0, 1, _RET_IP_);
111 			return sd;
112 		}
113 		if (t < 0)
114 			return NULL;
115 
116 		cpu_relax();
117 	}
118 }
119 
120 /**
121  *	sysfs_put_active - put an active reference to sysfs_dirent
122  *	@sd: sysfs_dirent to put an active reference to
123  *
124  *	Put an active reference to @sd.  This function is noop if @sd
125  *	is NULL.
126  */
127 static void sysfs_put_active(struct sysfs_dirent *sd)
128 {
129 	struct completion *cmpl;
130 	int v;
131 
132 	if (unlikely(!sd))
133 		return;
134 
135 	rwsem_release(&sd->dep_map, 1, _RET_IP_);
136 	v = atomic_dec_return(&sd->s_active);
137 	if (likely(v != SD_DEACTIVATED_BIAS))
138 		return;
139 
140 	/* atomic_dec_return() is a mb(), we'll always see the updated
141 	 * sd->s_sibling.
142 	 */
143 	cmpl = (void *)sd->s_sibling;
144 	complete(cmpl);
145 }
146 
147 /**
148  *	sysfs_get_active_two - get active references to sysfs_dirent and parent
149  *	@sd: sysfs_dirent of interest
150  *
151  *	Get active reference to @sd and its parent.  Parent's active
152  *	reference is grabbed first.  This function is noop if @sd is
153  *	NULL.
154  *
155  *	RETURNS:
156  *	Pointer to @sd on success, NULL on failure.
157  */
158 struct sysfs_dirent *sysfs_get_active_two(struct sysfs_dirent *sd)
159 {
160 	if (sd) {
161 		if (sd->s_parent && unlikely(!sysfs_get_active(sd->s_parent)))
162 			return NULL;
163 		if (unlikely(!sysfs_get_active(sd))) {
164 			sysfs_put_active(sd->s_parent);
165 			return NULL;
166 		}
167 	}
168 	return sd;
169 }
170 
171 /**
172  *	sysfs_put_active_two - put active references to sysfs_dirent and parent
173  *	@sd: sysfs_dirent of interest
174  *
175  *	Put active references to @sd and its parent.  This function is
176  *	noop if @sd is NULL.
177  */
178 void sysfs_put_active_two(struct sysfs_dirent *sd)
179 {
180 	if (sd) {
181 		sysfs_put_active(sd);
182 		sysfs_put_active(sd->s_parent);
183 	}
184 }
185 
186 /**
187  *	sysfs_deactivate - deactivate sysfs_dirent
188  *	@sd: sysfs_dirent to deactivate
189  *
190  *	Deny new active references and drain existing ones.
191  */
192 static void sysfs_deactivate(struct sysfs_dirent *sd)
193 {
194 	DECLARE_COMPLETION_ONSTACK(wait);
195 	int v;
196 
197 	BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));
198 	sd->s_sibling = (void *)&wait;
199 
200 	rwsem_acquire(&sd->dep_map, 0, 0, _RET_IP_);
201 	/* atomic_add_return() is a mb(), put_active() will always see
202 	 * the updated sd->s_sibling.
203 	 */
204 	v = atomic_add_return(SD_DEACTIVATED_BIAS, &sd->s_active);
205 
206 	if (v != SD_DEACTIVATED_BIAS) {
207 		lock_contended(&sd->dep_map, _RET_IP_);
208 		wait_for_completion(&wait);
209 	}
210 
211 	sd->s_sibling = NULL;
212 
213 	lock_acquired(&sd->dep_map, _RET_IP_);
214 	rwsem_release(&sd->dep_map, 1, _RET_IP_);
215 }
216 
217 static int sysfs_alloc_ino(ino_t *pino)
218 {
219 	int ino, rc;
220 
221  retry:
222 	spin_lock(&sysfs_ino_lock);
223 	rc = ida_get_new_above(&sysfs_ino_ida, 2, &ino);
224 	spin_unlock(&sysfs_ino_lock);
225 
226 	if (rc == -EAGAIN) {
227 		if (ida_pre_get(&sysfs_ino_ida, GFP_KERNEL))
228 			goto retry;
229 		rc = -ENOMEM;
230 	}
231 
232 	*pino = ino;
233 	return rc;
234 }
235 
236 static void sysfs_free_ino(ino_t ino)
237 {
238 	spin_lock(&sysfs_ino_lock);
239 	ida_remove(&sysfs_ino_ida, ino);
240 	spin_unlock(&sysfs_ino_lock);
241 }
242 
243 void release_sysfs_dirent(struct sysfs_dirent * sd)
244 {
245 	struct sysfs_dirent *parent_sd;
246 
247  repeat:
248 	/* Moving/renaming is always done while holding reference.
249 	 * sd->s_parent won't change beneath us.
250 	 */
251 	parent_sd = sd->s_parent;
252 
253 	if (sysfs_type(sd) == SYSFS_KOBJ_LINK)
254 		sysfs_put(sd->s_symlink.target_sd);
255 	if (sysfs_type(sd) & SYSFS_COPY_NAME)
256 		kfree(sd->s_name);
257 	if (sd->s_iattr && sd->s_iattr->ia_secdata)
258 		security_release_secctx(sd->s_iattr->ia_secdata,
259 					sd->s_iattr->ia_secdata_len);
260 	kfree(sd->s_iattr);
261 	sysfs_free_ino(sd->s_ino);
262 	kmem_cache_free(sysfs_dir_cachep, sd);
263 
264 	sd = parent_sd;
265 	if (sd && atomic_dec_and_test(&sd->s_count))
266 		goto repeat;
267 }
268 
269 static int sysfs_dentry_delete(struct dentry *dentry)
270 {
271 	struct sysfs_dirent *sd = dentry->d_fsdata;
272 	return !!(sd->s_flags & SYSFS_FLAG_REMOVED);
273 }
274 
275 static int sysfs_dentry_revalidate(struct dentry *dentry, struct nameidata *nd)
276 {
277 	struct sysfs_dirent *sd = dentry->d_fsdata;
278 	int is_dir;
279 
280 	mutex_lock(&sysfs_mutex);
281 
282 	/* The sysfs dirent has been deleted */
283 	if (sd->s_flags & SYSFS_FLAG_REMOVED)
284 		goto out_bad;
285 
286 	/* The sysfs dirent has been moved? */
287 	if (dentry->d_parent->d_fsdata != sd->s_parent)
288 		goto out_bad;
289 
290 	/* The sysfs dirent has been renamed */
291 	if (strcmp(dentry->d_name.name, sd->s_name) != 0)
292 		goto out_bad;
293 
294 	mutex_unlock(&sysfs_mutex);
295 out_valid:
296 	return 1;
297 out_bad:
298 	/* Remove the dentry from the dcache hashes.
299 	 * If this is a deleted dentry we use d_drop instead of d_delete
300 	 * so sysfs doesn't need to cope with negative dentries.
301 	 *
302 	 * If this is a dentry that has simply been renamed we
303 	 * use d_drop to remove it from the dcache lookup on its
304 	 * old parent.  If this dentry persists later when a lookup
305 	 * is performed at its new name the dentry will be readded
306 	 * to the dcache hashes.
307 	 */
308 	is_dir = (sysfs_type(sd) == SYSFS_DIR);
309 	mutex_unlock(&sysfs_mutex);
310 	if (is_dir) {
311 		/* If we have submounts we must allow the vfs caches
312 		 * to lie about the state of the filesystem to prevent
313 		 * leaks and other nasty things.
314 		 */
315 		if (have_submounts(dentry))
316 			goto out_valid;
317 		shrink_dcache_parent(dentry);
318 	}
319 	d_drop(dentry);
320 	return 0;
321 }
322 
323 static void sysfs_dentry_iput(struct dentry *dentry, struct inode *inode)
324 {
325 	struct sysfs_dirent * sd = dentry->d_fsdata;
326 
327 	sysfs_put(sd);
328 	iput(inode);
329 }
330 
331 static const struct dentry_operations sysfs_dentry_ops = {
332 	.d_revalidate	= sysfs_dentry_revalidate,
333 	.d_delete	= sysfs_dentry_delete,
334 	.d_iput		= sysfs_dentry_iput,
335 };
336 
337 struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)
338 {
339 	char *dup_name = NULL;
340 	struct sysfs_dirent *sd;
341 
342 	if (type & SYSFS_COPY_NAME) {
343 		name = dup_name = kstrdup(name, GFP_KERNEL);
344 		if (!name)
345 			return NULL;
346 	}
347 
348 	sd = kmem_cache_zalloc(sysfs_dir_cachep, GFP_KERNEL);
349 	if (!sd)
350 		goto err_out1;
351 
352 	if (sysfs_alloc_ino(&sd->s_ino))
353 		goto err_out2;
354 
355 	atomic_set(&sd->s_count, 1);
356 	atomic_set(&sd->s_active, 0);
357 	sysfs_dirent_init_lockdep(sd);
358 
359 	sd->s_name = name;
360 	sd->s_mode = mode;
361 	sd->s_flags = type;
362 
363 	return sd;
364 
365  err_out2:
366 	kmem_cache_free(sysfs_dir_cachep, sd);
367  err_out1:
368 	kfree(dup_name);
369 	return NULL;
370 }
371 
372 /**
373  *	sysfs_addrm_start - prepare for sysfs_dirent add/remove
374  *	@acxt: pointer to sysfs_addrm_cxt to be used
375  *	@parent_sd: parent sysfs_dirent
376  *
377  *	This function is called when the caller is about to add or
378  *	remove sysfs_dirent under @parent_sd.  This function acquires
379  *	sysfs_mutex.  @acxt is used to keep and pass context to
380  *	other addrm functions.
381  *
382  *	LOCKING:
383  *	Kernel thread context (may sleep).  sysfs_mutex is locked on
384  *	return.
385  */
386 void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
387 		       struct sysfs_dirent *parent_sd)
388 {
389 	memset(acxt, 0, sizeof(*acxt));
390 	acxt->parent_sd = parent_sd;
391 
392 	mutex_lock(&sysfs_mutex);
393 }
394 
395 /**
396  *	__sysfs_add_one - add sysfs_dirent to parent without warning
397  *	@acxt: addrm context to use
398  *	@sd: sysfs_dirent to be added
399  *
400  *	Get @acxt->parent_sd and set sd->s_parent to it and increment
401  *	nlink of parent inode if @sd is a directory and link into the
402  *	children list of the parent.
403  *
404  *	This function should be called between calls to
405  *	sysfs_addrm_start() and sysfs_addrm_finish() and should be
406  *	passed the same @acxt as passed to sysfs_addrm_start().
407  *
408  *	LOCKING:
409  *	Determined by sysfs_addrm_start().
410  *
411  *	RETURNS:
412  *	0 on success, -EEXIST if entry with the given name already
413  *	exists.
414  */
415 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
416 {
417 	struct sysfs_inode_attrs *ps_iattr;
418 
419 	if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
420 		return -EEXIST;
421 
422 	sd->s_parent = sysfs_get(acxt->parent_sd);
423 
424 	sysfs_link_sibling(sd);
425 
426 	/* Update timestamps on the parent */
427 	ps_iattr = acxt->parent_sd->s_iattr;
428 	if (ps_iattr) {
429 		struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
430 		ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
431 	}
432 
433 	return 0;
434 }
435 
436 /**
437  *	sysfs_pathname - return full path to sysfs dirent
438  *	@sd: sysfs_dirent whose path we want
439  *	@path: caller allocated buffer
440  *
441  *	Gives the name "/" to the sysfs_root entry; any path returned
442  *	is relative to wherever sysfs is mounted.
443  *
444  *	XXX: does no error checking on @path size
445  */
446 static char *sysfs_pathname(struct sysfs_dirent *sd, char *path)
447 {
448 	if (sd->s_parent) {
449 		sysfs_pathname(sd->s_parent, path);
450 		strcat(path, "/");
451 	}
452 	strcat(path, sd->s_name);
453 	return path;
454 }
455 
456 /**
457  *	sysfs_add_one - add sysfs_dirent to parent
458  *	@acxt: addrm context to use
459  *	@sd: sysfs_dirent to be added
460  *
461  *	Get @acxt->parent_sd and set sd->s_parent to it and increment
462  *	nlink of parent inode if @sd is a directory and link into the
463  *	children list of the parent.
464  *
465  *	This function should be called between calls to
466  *	sysfs_addrm_start() and sysfs_addrm_finish() and should be
467  *	passed the same @acxt as passed to sysfs_addrm_start().
468  *
469  *	LOCKING:
470  *	Determined by sysfs_addrm_start().
471  *
472  *	RETURNS:
473  *	0 on success, -EEXIST if entry with the given name already
474  *	exists.
475  */
476 int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
477 {
478 	int ret;
479 
480 	ret = __sysfs_add_one(acxt, sd);
481 	if (ret == -EEXIST) {
482 		char *path = kzalloc(PATH_MAX, GFP_KERNEL);
483 		WARN(1, KERN_WARNING
484 		     "sysfs: cannot create duplicate filename '%s'\n",
485 		     (path == NULL) ? sd->s_name :
486 		     strcat(strcat(sysfs_pathname(acxt->parent_sd, path), "/"),
487 		            sd->s_name));
488 		kfree(path);
489 	}
490 
491 	return ret;
492 }
493 
494 /**
495  *	sysfs_remove_one - remove sysfs_dirent from parent
496  *	@acxt: addrm context to use
497  *	@sd: sysfs_dirent to be removed
498  *
499  *	Mark @sd removed and drop nlink of parent inode if @sd is a
500  *	directory.  @sd is unlinked from the children list.
501  *
502  *	This function should be called between calls to
503  *	sysfs_addrm_start() and sysfs_addrm_finish() and should be
504  *	passed the same @acxt as passed to sysfs_addrm_start().
505  *
506  *	LOCKING:
507  *	Determined by sysfs_addrm_start().
508  */
509 void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
510 {
511 	struct sysfs_inode_attrs *ps_iattr;
512 
513 	BUG_ON(sd->s_flags & SYSFS_FLAG_REMOVED);
514 
515 	sysfs_unlink_sibling(sd);
516 
517 	/* Update timestamps on the parent */
518 	ps_iattr = acxt->parent_sd->s_iattr;
519 	if (ps_iattr) {
520 		struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
521 		ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
522 	}
523 
524 	sd->s_flags |= SYSFS_FLAG_REMOVED;
525 	sd->s_sibling = acxt->removed;
526 	acxt->removed = sd;
527 }
528 
529 /**
530  *	sysfs_addrm_finish - finish up sysfs_dirent add/remove
531  *	@acxt: addrm context to finish up
532  *
533  *	Finish up sysfs_dirent add/remove.  Resources acquired by
534  *	sysfs_addrm_start() are released and removed sysfs_dirents are
535  *	cleaned up.
536  *
537  *	LOCKING:
538  *	sysfs_mutex is released.
539  */
540 void sysfs_addrm_finish(struct sysfs_addrm_cxt *acxt)
541 {
542 	/* release resources acquired by sysfs_addrm_start() */
543 	mutex_unlock(&sysfs_mutex);
544 
545 	/* kill removed sysfs_dirents */
546 	while (acxt->removed) {
547 		struct sysfs_dirent *sd = acxt->removed;
548 
549 		acxt->removed = sd->s_sibling;
550 		sd->s_sibling = NULL;
551 
552 		sysfs_deactivate(sd);
553 		unmap_bin_file(sd);
554 		sysfs_put(sd);
555 	}
556 }
557 
558 /**
559  *	sysfs_find_dirent - find sysfs_dirent with the given name
560  *	@parent_sd: sysfs_dirent to search under
561  *	@name: name to look for
562  *
563  *	Look for sysfs_dirent with name @name under @parent_sd.
564  *
565  *	LOCKING:
566  *	mutex_lock(sysfs_mutex)
567  *
568  *	RETURNS:
569  *	Pointer to sysfs_dirent if found, NULL if not.
570  */
571 struct sysfs_dirent *sysfs_find_dirent(struct sysfs_dirent *parent_sd,
572 				       const unsigned char *name)
573 {
574 	struct sysfs_dirent *sd;
575 
576 	for (sd = parent_sd->s_dir.children; sd; sd = sd->s_sibling)
577 		if (!strcmp(sd->s_name, name))
578 			return sd;
579 	return NULL;
580 }
581 
582 /**
583  *	sysfs_get_dirent - find and get sysfs_dirent with the given name
584  *	@parent_sd: sysfs_dirent to search under
585  *	@name: name to look for
586  *
587  *	Look for sysfs_dirent with name @name under @parent_sd and get
588  *	it if found.
589  *
590  *	LOCKING:
591  *	Kernel thread context (may sleep).  Grabs sysfs_mutex.
592  *
593  *	RETURNS:
594  *	Pointer to sysfs_dirent if found, NULL if not.
595  */
596 struct sysfs_dirent *sysfs_get_dirent(struct sysfs_dirent *parent_sd,
597 				      const unsigned char *name)
598 {
599 	struct sysfs_dirent *sd;
600 
601 	mutex_lock(&sysfs_mutex);
602 	sd = sysfs_find_dirent(parent_sd, name);
603 	sysfs_get(sd);
604 	mutex_unlock(&sysfs_mutex);
605 
606 	return sd;
607 }
608 EXPORT_SYMBOL_GPL(sysfs_get_dirent);
609 
610 static int create_dir(struct kobject *kobj, struct sysfs_dirent *parent_sd,
611 		      const char *name, struct sysfs_dirent **p_sd)
612 {
613 	umode_t mode = S_IFDIR| S_IRWXU | S_IRUGO | S_IXUGO;
614 	struct sysfs_addrm_cxt acxt;
615 	struct sysfs_dirent *sd;
616 	int rc;
617 
618 	/* allocate */
619 	sd = sysfs_new_dirent(name, mode, SYSFS_DIR);
620 	if (!sd)
621 		return -ENOMEM;
622 	sd->s_dir.kobj = kobj;
623 
624 	/* link in */
625 	sysfs_addrm_start(&acxt, parent_sd);
626 	rc = sysfs_add_one(&acxt, sd);
627 	sysfs_addrm_finish(&acxt);
628 
629 	if (rc == 0)
630 		*p_sd = sd;
631 	else
632 		sysfs_put(sd);
633 
634 	return rc;
635 }
636 
637 int sysfs_create_subdir(struct kobject *kobj, const char *name,
638 			struct sysfs_dirent **p_sd)
639 {
640 	return create_dir(kobj, kobj->sd, name, p_sd);
641 }
642 
643 /**
644  *	sysfs_create_dir - create a directory for an object.
645  *	@kobj:		object we're creating directory for.
646  */
647 int sysfs_create_dir(struct kobject * kobj)
648 {
649 	struct sysfs_dirent *parent_sd, *sd;
650 	int error = 0;
651 
652 	BUG_ON(!kobj);
653 
654 	if (kobj->parent)
655 		parent_sd = kobj->parent->sd;
656 	else
657 		parent_sd = &sysfs_root;
658 
659 	error = create_dir(kobj, parent_sd, kobject_name(kobj), &sd);
660 	if (!error)
661 		kobj->sd = sd;
662 	return error;
663 }
664 
665 static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry,
666 				struct nameidata *nd)
667 {
668 	struct dentry *ret = NULL;
669 	struct sysfs_dirent *parent_sd = dentry->d_parent->d_fsdata;
670 	struct sysfs_dirent *sd;
671 	struct inode *inode;
672 
673 	mutex_lock(&sysfs_mutex);
674 
675 	sd = sysfs_find_dirent(parent_sd, dentry->d_name.name);
676 
677 	/* no such entry */
678 	if (!sd) {
679 		ret = ERR_PTR(-ENOENT);
680 		goto out_unlock;
681 	}
682 
683 	/* attach dentry and inode */
684 	inode = sysfs_get_inode(sd);
685 	if (!inode) {
686 		ret = ERR_PTR(-ENOMEM);
687 		goto out_unlock;
688 	}
689 
690 	/* instantiate and hash dentry */
691 	ret = d_find_alias(inode);
692 	if (!ret) {
693 		dentry->d_op = &sysfs_dentry_ops;
694 		dentry->d_fsdata = sysfs_get(sd);
695 		d_add(dentry, inode);
696 	} else {
697 		d_move(ret, dentry);
698 		iput(inode);
699 	}
700 
701  out_unlock:
702 	mutex_unlock(&sysfs_mutex);
703 	return ret;
704 }
705 
706 const struct inode_operations sysfs_dir_inode_operations = {
707 	.lookup		= sysfs_lookup,
708 	.permission	= sysfs_permission,
709 	.setattr	= sysfs_setattr,
710 	.getattr	= sysfs_getattr,
711 	.setxattr	= sysfs_setxattr,
712 };
713 
714 static void remove_dir(struct sysfs_dirent *sd)
715 {
716 	struct sysfs_addrm_cxt acxt;
717 
718 	sysfs_addrm_start(&acxt, sd->s_parent);
719 	sysfs_remove_one(&acxt, sd);
720 	sysfs_addrm_finish(&acxt);
721 }
722 
723 void sysfs_remove_subdir(struct sysfs_dirent *sd)
724 {
725 	remove_dir(sd);
726 }
727 
728 
729 static void __sysfs_remove_dir(struct sysfs_dirent *dir_sd)
730 {
731 	struct sysfs_addrm_cxt acxt;
732 	struct sysfs_dirent **pos;
733 
734 	if (!dir_sd)
735 		return;
736 
737 	pr_debug("sysfs %s: removing dir\n", dir_sd->s_name);
738 	sysfs_addrm_start(&acxt, dir_sd);
739 	pos = &dir_sd->s_dir.children;
740 	while (*pos) {
741 		struct sysfs_dirent *sd = *pos;
742 
743 		if (sysfs_type(sd) != SYSFS_DIR)
744 			sysfs_remove_one(&acxt, sd);
745 		else
746 			pos = &(*pos)->s_sibling;
747 	}
748 	sysfs_addrm_finish(&acxt);
749 
750 	remove_dir(dir_sd);
751 }
752 
753 /**
754  *	sysfs_remove_dir - remove an object's directory.
755  *	@kobj:	object.
756  *
757  *	The only thing special about this is that we remove any files in
758  *	the directory before we remove the directory, and we've inlined
759  *	what used to be sysfs_rmdir() below, instead of calling separately.
760  */
761 
762 void sysfs_remove_dir(struct kobject * kobj)
763 {
764 	struct sysfs_dirent *sd = kobj->sd;
765 
766 	spin_lock(&sysfs_assoc_lock);
767 	kobj->sd = NULL;
768 	spin_unlock(&sysfs_assoc_lock);
769 
770 	__sysfs_remove_dir(sd);
771 }
772 
773 int sysfs_rename(struct sysfs_dirent *sd,
774 	struct sysfs_dirent *new_parent_sd, const char *new_name)
775 {
776 	const char *dup_name = NULL;
777 	int error;
778 
779 	mutex_lock(&sysfs_mutex);
780 
781 	error = 0;
782 	if ((sd->s_parent == new_parent_sd) &&
783 	    (strcmp(sd->s_name, new_name) == 0))
784 		goto out;	/* nothing to rename */
785 
786 	error = -EEXIST;
787 	if (sysfs_find_dirent(new_parent_sd, new_name))
788 		goto out;
789 
790 	/* rename sysfs_dirent */
791 	if (strcmp(sd->s_name, new_name) != 0) {
792 		error = -ENOMEM;
793 		new_name = dup_name = kstrdup(new_name, GFP_KERNEL);
794 		if (!new_name)
795 			goto out;
796 
797 		dup_name = sd->s_name;
798 		sd->s_name = new_name;
799 	}
800 
801 	/* Remove from old parent's list and insert into new parent's list. */
802 	if (sd->s_parent != new_parent_sd) {
803 		sysfs_unlink_sibling(sd);
804 		sysfs_get(new_parent_sd);
805 		sysfs_put(sd->s_parent);
806 		sd->s_parent = new_parent_sd;
807 		sysfs_link_sibling(sd);
808 	}
809 
810 	error = 0;
811  out:
812 	mutex_unlock(&sysfs_mutex);
813 	kfree(dup_name);
814 	return error;
815 }
816 
817 int sysfs_rename_dir(struct kobject *kobj, const char *new_name)
818 {
819 	return sysfs_rename(kobj->sd, kobj->sd->s_parent, new_name);
820 }
821 
822 int sysfs_move_dir(struct kobject *kobj, struct kobject *new_parent_kobj)
823 {
824 	struct sysfs_dirent *sd = kobj->sd;
825 	struct sysfs_dirent *new_parent_sd;
826 
827 	BUG_ON(!sd->s_parent);
828 	new_parent_sd = new_parent_kobj && new_parent_kobj->sd ?
829 		new_parent_kobj->sd : &sysfs_root;
830 
831 	return sysfs_rename(sd, new_parent_sd, sd->s_name);
832 }
833 
834 /* Relationship between s_mode and the DT_xxx types */
835 static inline unsigned char dt_type(struct sysfs_dirent *sd)
836 {
837 	return (sd->s_mode >> 12) & 15;
838 }
839 
840 static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)
841 {
842 	struct dentry *dentry = filp->f_path.dentry;
843 	struct sysfs_dirent * parent_sd = dentry->d_fsdata;
844 	struct sysfs_dirent *pos;
845 	ino_t ino;
846 
847 	if (filp->f_pos == 0) {
848 		ino = parent_sd->s_ino;
849 		if (filldir(dirent, ".", 1, filp->f_pos, ino, DT_DIR) == 0)
850 			filp->f_pos++;
851 	}
852 	if (filp->f_pos == 1) {
853 		if (parent_sd->s_parent)
854 			ino = parent_sd->s_parent->s_ino;
855 		else
856 			ino = parent_sd->s_ino;
857 		if (filldir(dirent, "..", 2, filp->f_pos, ino, DT_DIR) == 0)
858 			filp->f_pos++;
859 	}
860 	if ((filp->f_pos > 1) && (filp->f_pos < INT_MAX)) {
861 		mutex_lock(&sysfs_mutex);
862 
863 		/* Skip the dentries we have already reported */
864 		pos = parent_sd->s_dir.children;
865 		while (pos && (filp->f_pos > pos->s_ino))
866 			pos = pos->s_sibling;
867 
868 		for ( ; pos; pos = pos->s_sibling) {
869 			const char * name;
870 			int len;
871 
872 			name = pos->s_name;
873 			len = strlen(name);
874 			filp->f_pos = ino = pos->s_ino;
875 
876 			if (filldir(dirent, name, len, filp->f_pos, ino,
877 					 dt_type(pos)) < 0)
878 				break;
879 		}
880 		if (!pos)
881 			filp->f_pos = INT_MAX;
882 		mutex_unlock(&sysfs_mutex);
883 	}
884 	return 0;
885 }
886 
887 
888 const struct file_operations sysfs_dir_operations = {
889 	.read		= generic_read_dir,
890 	.readdir	= sysfs_readdir,
891 	.llseek		= generic_file_llseek,
892 };
893