2 * dir.c - Operations for sysfs directories.
8 #include <linux/mount.h>
9 #include <linux/module.h>
10 #include <linux/kobject.h>
11 #include <linux/namei.h>
12 #include <asm/semaphore.h>
15 DECLARE_RWSEM(sysfs_rename_sem
);
17 static void sysfs_d_iput(struct dentry
* dentry
, struct inode
* inode
)
19 struct sysfs_dirent
* sd
= dentry
->d_fsdata
;
22 BUG_ON(sd
->s_dentry
!= dentry
);
29 static struct dentry_operations sysfs_dentry_ops
= {
30 .d_iput
= sysfs_d_iput
,
33 static unsigned int sysfs_inode_counter
;
34 ino_t
sysfs_get_inum(void)
36 if (unlikely(sysfs_inode_counter
< 3))
37 sysfs_inode_counter
= 3;
38 return sysfs_inode_counter
++;
42 * Allocates a new sysfs_dirent and links it to the parent sysfs_dirent
44 static struct sysfs_dirent
* __sysfs_new_dirent(void * element
)
46 struct sysfs_dirent
* sd
;
48 sd
= kmem_cache_zalloc(sysfs_dir_cachep
, GFP_KERNEL
);
52 sd
->s_ino
= sysfs_get_inum();
53 atomic_set(&sd
->s_count
, 1);
54 atomic_set(&sd
->s_event
, 1);
55 INIT_LIST_HEAD(&sd
->s_children
);
56 INIT_LIST_HEAD(&sd
->s_sibling
);
57 sd
->s_element
= element
;
62 static void __sysfs_list_dirent(struct sysfs_dirent
*parent_sd
,
63 struct sysfs_dirent
*sd
)
66 list_add(&sd
->s_sibling
, &parent_sd
->s_children
);
69 static struct sysfs_dirent
* sysfs_new_dirent(struct sysfs_dirent
*parent_sd
,
72 struct sysfs_dirent
*sd
;
73 sd
= __sysfs_new_dirent(element
);
74 __sysfs_list_dirent(parent_sd
, sd
);
80 * Return -EEXIST if there is already a sysfs element with the same name for
83 * called with parent inode's i_mutex held
85 int sysfs_dirent_exist(struct sysfs_dirent
*parent_sd
,
86 const unsigned char *new)
88 struct sysfs_dirent
* sd
;
90 list_for_each_entry(sd
, &parent_sd
->s_children
, s_sibling
) {
92 const unsigned char *existing
= sysfs_get_name(sd
);
93 if (strcmp(existing
, new))
104 static struct sysfs_dirent
*
105 __sysfs_make_dirent(struct dentry
*dentry
, void *element
, mode_t mode
, int type
)
107 struct sysfs_dirent
* sd
;
109 sd
= __sysfs_new_dirent(element
);
115 sd
->s_dentry
= dentry
;
117 dentry
->d_fsdata
= sysfs_get(sd
);
118 dentry
->d_op
= &sysfs_dentry_ops
;
125 int sysfs_make_dirent(struct sysfs_dirent
* parent_sd
, struct dentry
* dentry
,
126 void * element
, umode_t mode
, int type
)
128 struct sysfs_dirent
*sd
;
130 sd
= __sysfs_make_dirent(dentry
, element
, mode
, type
);
131 __sysfs_list_dirent(parent_sd
, sd
);
133 return sd
? 0 : -ENOMEM
;
136 static int init_dir(struct inode
* inode
)
138 inode
->i_op
= &sysfs_dir_inode_operations
;
139 inode
->i_fop
= &sysfs_dir_operations
;
141 /* directory inodes start off with i_nlink == 2 (for "." entry) */
146 static int init_file(struct inode
* inode
)
148 inode
->i_size
= PAGE_SIZE
;
149 inode
->i_fop
= &sysfs_file_operations
;
153 static int init_symlink(struct inode
* inode
)
155 inode
->i_op
= &sysfs_symlink_inode_operations
;
159 static int create_dir(struct kobject
* k
, struct dentry
* p
,
160 const char * n
, struct dentry
** d
)
163 umode_t mode
= S_IFDIR
| S_IRWXU
| S_IRUGO
| S_IXUGO
;
165 mutex_lock(&p
->d_inode
->i_mutex
);
166 *d
= lookup_one_len(n
, p
, strlen(n
));
168 if (sysfs_dirent_exist(p
->d_fsdata
, n
))
171 error
= sysfs_make_dirent(p
->d_fsdata
, *d
, k
, mode
,
174 error
= sysfs_create(*d
, mode
, init_dir
);
176 inc_nlink(p
->d_inode
);
177 (*d
)->d_op
= &sysfs_dentry_ops
;
181 if (error
&& (error
!= -EEXIST
)) {
182 struct sysfs_dirent
*sd
= (*d
)->d_fsdata
;
184 list_del_init(&sd
->s_sibling
);
192 mutex_unlock(&p
->d_inode
->i_mutex
);
197 int sysfs_create_subdir(struct kobject
* k
, const char * n
, struct dentry
** d
)
199 return create_dir(k
,k
->dentry
,n
,d
);
203 * sysfs_create_dir - create a directory for an object.
204 * @kobj: object we're creating directory for.
205 * @shadow_parent: parent parent object.
208 int sysfs_create_dir(struct kobject
* kobj
, struct dentry
*shadow_parent
)
210 struct dentry
* dentry
= NULL
;
211 struct dentry
* parent
;
217 parent
= shadow_parent
;
218 else if (kobj
->parent
)
219 parent
= kobj
->parent
->dentry
;
220 else if (sysfs_mount
&& sysfs_mount
->mnt_sb
)
221 parent
= sysfs_mount
->mnt_sb
->s_root
;
225 error
= create_dir(kobj
,parent
,kobject_name(kobj
),&dentry
);
227 kobj
->dentry
= dentry
;
231 /* attaches attribute's sysfs_dirent to the dentry corresponding to the
234 static int sysfs_attach_attr(struct sysfs_dirent
* sd
, struct dentry
* dentry
)
236 struct attribute
* attr
= NULL
;
237 struct bin_attribute
* bin_attr
= NULL
;
238 int (* init
) (struct inode
*) = NULL
;
241 if (sd
->s_type
& SYSFS_KOBJ_BIN_ATTR
) {
242 bin_attr
= sd
->s_element
;
243 attr
= &bin_attr
->attr
;
245 attr
= sd
->s_element
;
249 dentry
->d_fsdata
= sysfs_get(sd
);
250 sd
->s_dentry
= dentry
;
251 error
= sysfs_create(dentry
, (attr
->mode
& S_IALLUGO
) | S_IFREG
, init
);
258 dentry
->d_inode
->i_size
= bin_attr
->size
;
259 dentry
->d_inode
->i_fop
= &bin_fops
;
261 dentry
->d_op
= &sysfs_dentry_ops
;
267 static int sysfs_attach_link(struct sysfs_dirent
* sd
, struct dentry
* dentry
)
271 dentry
->d_fsdata
= sysfs_get(sd
);
272 sd
->s_dentry
= dentry
;
273 err
= sysfs_create(dentry
, S_IFLNK
|S_IRWXUGO
, init_symlink
);
275 dentry
->d_op
= &sysfs_dentry_ops
;
283 static struct dentry
* sysfs_lookup(struct inode
*dir
, struct dentry
*dentry
,
284 struct nameidata
*nd
)
286 struct sysfs_dirent
* parent_sd
= dentry
->d_parent
->d_fsdata
;
287 struct sysfs_dirent
* sd
;
290 list_for_each_entry(sd
, &parent_sd
->s_children
, s_sibling
) {
291 if (sd
->s_type
& SYSFS_NOT_PINNED
) {
292 const unsigned char * name
= sysfs_get_name(sd
);
294 if (strcmp(name
, dentry
->d_name
.name
))
297 if (sd
->s_type
& SYSFS_KOBJ_LINK
)
298 err
= sysfs_attach_link(sd
, dentry
);
300 err
= sysfs_attach_attr(sd
, dentry
);
308 const struct inode_operations sysfs_dir_inode_operations
= {
309 .lookup
= sysfs_lookup
,
310 .setattr
= sysfs_setattr
,
313 static void remove_dir(struct dentry
* d
)
315 struct dentry
* parent
= dget(d
->d_parent
);
316 struct sysfs_dirent
* sd
;
318 mutex_lock(&parent
->d_inode
->i_mutex
);
321 list_del_init(&sd
->s_sibling
);
324 simple_rmdir(parent
->d_inode
,d
);
326 pr_debug(" o %s removing done (%d)\n",d
->d_name
.name
,
327 atomic_read(&d
->d_count
));
329 mutex_unlock(&parent
->d_inode
->i_mutex
);
333 void sysfs_remove_subdir(struct dentry
* d
)
339 static void __sysfs_remove_dir(struct dentry
*dentry
)
341 struct sysfs_dirent
* parent_sd
;
342 struct sysfs_dirent
* sd
, * tmp
;
348 pr_debug("sysfs %s: removing dir\n",dentry
->d_name
.name
);
349 mutex_lock(&dentry
->d_inode
->i_mutex
);
350 parent_sd
= dentry
->d_fsdata
;
351 list_for_each_entry_safe(sd
, tmp
, &parent_sd
->s_children
, s_sibling
) {
352 if (!sd
->s_element
|| !(sd
->s_type
& SYSFS_NOT_PINNED
))
354 list_del_init(&sd
->s_sibling
);
355 sysfs_drop_dentry(sd
, dentry
);
358 mutex_unlock(&dentry
->d_inode
->i_mutex
);
362 * Drop reference from dget() on entrance.
368 * sysfs_remove_dir - remove an object's directory.
371 * The only thing special about this is that we remove any files in
372 * the directory before we remove the directory, and we've inlined
373 * what used to be sysfs_rmdir() below, instead of calling separately.
376 void sysfs_remove_dir(struct kobject
* kobj
)
378 __sysfs_remove_dir(kobj
->dentry
);
382 int sysfs_rename_dir(struct kobject
* kobj
, struct dentry
*new_parent
,
383 const char *new_name
)
386 struct dentry
* new_dentry
;
391 down_write(&sysfs_rename_sem
);
392 mutex_lock(&new_parent
->d_inode
->i_mutex
);
394 new_dentry
= lookup_one_len(new_name
, new_parent
, strlen(new_name
));
395 if (!IS_ERR(new_dentry
)) {
396 /* By allowing two different directories with the
397 * same d_parent we allow this routine to move
398 * between different shadows of the same directory
400 if (kobj
->dentry
->d_parent
->d_inode
!= new_parent
->d_inode
)
402 else if (new_dentry
->d_parent
->d_inode
!= new_parent
->d_inode
)
404 else if (new_dentry
== kobj
->dentry
)
406 else if (!new_dentry
->d_inode
) {
407 error
= kobject_set_name(kobj
, "%s", new_name
);
409 struct sysfs_dirent
*sd
, *parent_sd
;
411 d_add(new_dentry
, NULL
);
412 d_move(kobj
->dentry
, new_dentry
);
414 sd
= kobj
->dentry
->d_fsdata
;
415 parent_sd
= new_parent
->d_fsdata
;
417 list_del_init(&sd
->s_sibling
);
418 list_add(&sd
->s_sibling
, &parent_sd
->s_children
);
426 mutex_unlock(&new_parent
->d_inode
->i_mutex
);
427 up_write(&sysfs_rename_sem
);
432 int sysfs_move_dir(struct kobject
*kobj
, struct kobject
*new_parent
)
434 struct dentry
*old_parent_dentry
, *new_parent_dentry
, *new_dentry
;
435 struct sysfs_dirent
*new_parent_sd
, *sd
;
438 old_parent_dentry
= kobj
->parent
?
439 kobj
->parent
->dentry
: sysfs_mount
->mnt_sb
->s_root
;
440 new_parent_dentry
= new_parent
?
441 new_parent
->dentry
: sysfs_mount
->mnt_sb
->s_root
;
443 if (old_parent_dentry
->d_inode
== new_parent_dentry
->d_inode
)
444 return 0; /* nothing to move */
446 mutex_lock(&old_parent_dentry
->d_inode
->i_mutex
);
447 if (!mutex_trylock(&new_parent_dentry
->d_inode
->i_mutex
)) {
448 mutex_unlock(&old_parent_dentry
->d_inode
->i_mutex
);
452 new_parent_sd
= new_parent_dentry
->d_fsdata
;
453 sd
= kobj
->dentry
->d_fsdata
;
455 new_dentry
= lookup_one_len(kobj
->name
, new_parent_dentry
,
457 if (IS_ERR(new_dentry
)) {
458 error
= PTR_ERR(new_dentry
);
462 d_add(new_dentry
, NULL
);
463 d_move(kobj
->dentry
, new_dentry
);
466 /* Remove from old parent's list and insert into new parent's list. */
467 list_del_init(&sd
->s_sibling
);
468 list_add(&sd
->s_sibling
, &new_parent_sd
->s_children
);
471 mutex_unlock(&new_parent_dentry
->d_inode
->i_mutex
);
472 mutex_unlock(&old_parent_dentry
->d_inode
->i_mutex
);
477 static int sysfs_dir_open(struct inode
*inode
, struct file
*file
)
479 struct dentry
* dentry
= file
->f_path
.dentry
;
480 struct sysfs_dirent
* parent_sd
= dentry
->d_fsdata
;
482 mutex_lock(&dentry
->d_inode
->i_mutex
);
483 file
->private_data
= sysfs_new_dirent(parent_sd
, NULL
);
484 mutex_unlock(&dentry
->d_inode
->i_mutex
);
486 return file
->private_data
? 0 : -ENOMEM
;
490 static int sysfs_dir_close(struct inode
*inode
, struct file
*file
)
492 struct dentry
* dentry
= file
->f_path
.dentry
;
493 struct sysfs_dirent
* cursor
= file
->private_data
;
495 mutex_lock(&dentry
->d_inode
->i_mutex
);
496 list_del_init(&cursor
->s_sibling
);
497 mutex_unlock(&dentry
->d_inode
->i_mutex
);
499 release_sysfs_dirent(cursor
);
504 /* Relationship between s_mode and the DT_xxx types */
505 static inline unsigned char dt_type(struct sysfs_dirent
*sd
)
507 return (sd
->s_mode
>> 12) & 15;
510 static int sysfs_readdir(struct file
* filp
, void * dirent
, filldir_t filldir
)
512 struct dentry
*dentry
= filp
->f_path
.dentry
;
513 struct sysfs_dirent
* parent_sd
= dentry
->d_fsdata
;
514 struct sysfs_dirent
*cursor
= filp
->private_data
;
515 struct list_head
*p
, *q
= &cursor
->s_sibling
;
521 ino
= parent_sd
->s_ino
;
522 if (filldir(dirent
, ".", 1, i
, ino
, DT_DIR
) < 0)
528 ino
= parent_ino(dentry
);
529 if (filldir(dirent
, "..", 2, i
, ino
, DT_DIR
) < 0)
535 if (filp
->f_pos
== 2)
536 list_move(q
, &parent_sd
->s_children
);
538 for (p
=q
->next
; p
!= &parent_sd
->s_children
; p
=p
->next
) {
539 struct sysfs_dirent
*next
;
543 next
= list_entry(p
, struct sysfs_dirent
,
545 if (!next
->s_element
)
548 name
= sysfs_get_name(next
);
552 if (filldir(dirent
, name
, len
, filp
->f_pos
, ino
,
564 static loff_t
sysfs_dir_lseek(struct file
* file
, loff_t offset
, int origin
)
566 struct dentry
* dentry
= file
->f_path
.dentry
;
568 mutex_lock(&dentry
->d_inode
->i_mutex
);
571 offset
+= file
->f_pos
;
576 mutex_unlock(&file
->f_path
.dentry
->d_inode
->i_mutex
);
579 if (offset
!= file
->f_pos
) {
580 file
->f_pos
= offset
;
581 if (file
->f_pos
>= 2) {
582 struct sysfs_dirent
*sd
= dentry
->d_fsdata
;
583 struct sysfs_dirent
*cursor
= file
->private_data
;
585 loff_t n
= file
->f_pos
- 2;
587 list_del(&cursor
->s_sibling
);
588 p
= sd
->s_children
.next
;
589 while (n
&& p
!= &sd
->s_children
) {
590 struct sysfs_dirent
*next
;
591 next
= list_entry(p
, struct sysfs_dirent
,
597 list_add_tail(&cursor
->s_sibling
, p
);
600 mutex_unlock(&dentry
->d_inode
->i_mutex
);
606 * sysfs_make_shadowed_dir - Setup so a directory can be shadowed
607 * @kobj: object we're creating shadow of.
610 int sysfs_make_shadowed_dir(struct kobject
*kobj
,
611 void * (*follow_link
)(struct dentry
*, struct nameidata
*))
614 struct inode_operations
*i_op
;
616 inode
= kobj
->dentry
->d_inode
;
617 if (inode
->i_op
!= &sysfs_dir_inode_operations
)
620 i_op
= kmalloc(sizeof(*i_op
), GFP_KERNEL
);
624 memcpy(i_op
, &sysfs_dir_inode_operations
, sizeof(*i_op
));
625 i_op
->follow_link
= follow_link
;
627 /* Locking of inode->i_op?
628 * Since setting i_op is a single word write and they
629 * are atomic we should be ok here.
636 * sysfs_create_shadow_dir - create a shadow directory for an object.
637 * @kobj: object we're creating directory for.
639 * sysfs_make_shadowed_dir must already have been called on this
643 struct dentry
*sysfs_create_shadow_dir(struct kobject
*kobj
)
645 struct sysfs_dirent
*sd
;
646 struct dentry
*parent
, *dir
, *shadow
;
650 inode
= dir
->d_inode
;
651 parent
= dir
->d_parent
;
652 shadow
= ERR_PTR(-EINVAL
);
653 if (!sysfs_is_shadowed_inode(inode
))
656 shadow
= d_alloc(parent
, &dir
->d_name
);
660 sd
= __sysfs_make_dirent(shadow
, kobj
, inode
->i_mode
, SYSFS_DIR
);
664 d_instantiate(shadow
, igrab(inode
));
666 inc_nlink(parent
->d_inode
);
667 shadow
->d_op
= &sysfs_dentry_ops
;
669 dget(shadow
); /* Extra count - pin the dentry in core */
675 shadow
= ERR_PTR(-ENOMEM
);
680 * sysfs_remove_shadow_dir - remove an object's directory.
681 * @shadow: dentry of shadow directory
683 * The only thing special about this is that we remove any files in
684 * the directory before we remove the directory, and we've inlined
685 * what used to be sysfs_rmdir() below, instead of calling separately.
688 void sysfs_remove_shadow_dir(struct dentry
*shadow
)
690 __sysfs_remove_dir(shadow
);
693 const struct file_operations sysfs_dir_operations
= {
694 .open
= sysfs_dir_open
,
695 .release
= sysfs_dir_close
,
696 .llseek
= sysfs_dir_lseek
,
697 .read
= generic_read_dir
,
698 .readdir
= sysfs_readdir
,