xref: /linux/fs/sysfs/dir.c (revision 0ab66088c855eca68513bdd7442a426c4b374ced)
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 };
809