diff options
| -rw-r--r-- | fs/debugfs/inode.c | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index b765c04eba20..61e9a6815a19 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
| @@ -34,37 +34,12 @@ static struct vfsmount *debugfs_mount; | |||
| 34 | static int debugfs_mount_count; | 34 | static int debugfs_mount_count; |
| 35 | static bool debugfs_registered; | 35 | static bool debugfs_registered; |
| 36 | 36 | ||
| 37 | static struct inode *debugfs_get_inode(struct super_block *sb, umode_t mode, dev_t dev, | 37 | static struct inode *debugfs_get_inode(struct super_block *sb) |
| 38 | void *data, const struct file_operations *fops) | ||
| 39 | |||
| 40 | { | 38 | { |
| 41 | struct inode *inode = new_inode(sb); | 39 | struct inode *inode = new_inode(sb); |
| 42 | |||
| 43 | if (inode) { | 40 | if (inode) { |
| 44 | inode->i_ino = get_next_ino(); | 41 | inode->i_ino = get_next_ino(); |
| 45 | inode->i_mode = mode; | ||
| 46 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; | 42 | inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; |
| 47 | switch (mode & S_IFMT) { | ||
| 48 | default: | ||
| 49 | init_special_inode(inode, mode, dev); | ||
| 50 | break; | ||
| 51 | case S_IFREG: | ||
| 52 | inode->i_fop = fops ? fops : &debugfs_file_operations; | ||
| 53 | inode->i_private = data; | ||
| 54 | break; | ||
| 55 | case S_IFLNK: | ||
| 56 | inode->i_op = &debugfs_link_operations; | ||
| 57 | inode->i_private = data; | ||
| 58 | break; | ||
| 59 | case S_IFDIR: | ||
| 60 | inode->i_op = &simple_dir_inode_operations; | ||
| 61 | inode->i_fop = &simple_dir_operations; | ||
| 62 | |||
| 63 | /* directory inodes start off with i_nlink == 2 | ||
| 64 | * (for "." entry) */ | ||
| 65 | inc_nlink(inode); | ||
| 66 | break; | ||
| 67 | } | ||
| 68 | } | 43 | } |
| 69 | return inode; | 44 | return inode; |
| 70 | } | 45 | } |
| @@ -334,10 +309,13 @@ struct dentry *debugfs_create_file(const char *name, umode_t mode, | |||
| 334 | if (IS_ERR(dentry)) | 309 | if (IS_ERR(dentry)) |
| 335 | return NULL; | 310 | return NULL; |
| 336 | 311 | ||
| 337 | inode = debugfs_get_inode(dentry->d_sb, mode, 0, data, fops); | 312 | inode = debugfs_get_inode(dentry->d_sb); |
| 338 | if (unlikely(!inode)) | 313 | if (unlikely(!inode)) |
| 339 | return end_creating(dentry, -ENOMEM); | 314 | return end_creating(dentry, -ENOMEM); |
| 340 | 315 | ||
| 316 | inode->i_mode = mode; | ||
| 317 | inode->i_fop = fops ? fops : &debugfs_file_operations; | ||
| 318 | inode->i_private = data; | ||
| 341 | d_instantiate(dentry, inode); | 319 | d_instantiate(dentry, inode); |
| 342 | dget(dentry); | 320 | dget(dentry); |
| 343 | fsnotify_create(dentry->d_parent->d_inode, dentry); | 321 | fsnotify_create(dentry->d_parent->d_inode, dentry); |
| @@ -371,12 +349,16 @@ struct dentry *debugfs_create_dir(const char *name, struct dentry *parent) | |||
| 371 | if (IS_ERR(dentry)) | 349 | if (IS_ERR(dentry)) |
| 372 | return NULL; | 350 | return NULL; |
| 373 | 351 | ||
| 374 | inode = debugfs_get_inode(dentry->d_sb, | 352 | inode = debugfs_get_inode(dentry->d_sb); |
| 375 | S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO, | ||
| 376 | 0, NULL, NULL); | ||
| 377 | if (unlikely(!inode)) | 353 | if (unlikely(!inode)) |
| 378 | return end_creating(dentry, -ENOMEM); | 354 | return end_creating(dentry, -ENOMEM); |
| 379 | 355 | ||
| 356 | inode->i_mode = S_IFDIR | S_IRWXU | S_IRUGO | S_IXUGO; | ||
| 357 | inode->i_op = &simple_dir_inode_operations; | ||
| 358 | inode->i_fop = &simple_dir_operations; | ||
| 359 | |||
| 360 | /* directory inodes start off with i_nlink == 2 (for "." entry) */ | ||
| 361 | inc_nlink(inode); | ||
| 380 | d_instantiate(dentry, inode); | 362 | d_instantiate(dentry, inode); |
| 381 | dget(dentry); | 363 | dget(dentry); |
| 382 | inc_nlink(dentry->d_parent->d_inode); | 364 | inc_nlink(dentry->d_parent->d_inode); |
| @@ -423,12 +405,14 @@ struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent, | |||
| 423 | return NULL; | 405 | return NULL; |
| 424 | } | 406 | } |
| 425 | 407 | ||
| 426 | inode = debugfs_get_inode(dentry->d_sb, S_IFLNK | S_IRWXUGO, 0, | 408 | inode = debugfs_get_inode(dentry->d_sb); |
| 427 | link, NULL); | ||
| 428 | if (unlikely(!inode)) { | 409 | if (unlikely(!inode)) { |
| 429 | kfree(link); | 410 | kfree(link); |
| 430 | return end_creating(dentry, -ENOMEM); | 411 | return end_creating(dentry, -ENOMEM); |
| 431 | } | 412 | } |
| 413 | inode->i_mode = S_IFLNK | S_IRWXUGO; | ||
| 414 | inode->i_op = &debugfs_link_operations; | ||
| 415 | inode->i_private = link; | ||
| 432 | d_instantiate(dentry, inode); | 416 | d_instantiate(dentry, inode); |
| 433 | dget(dentry); | 417 | dget(dentry); |
| 434 | return end_creating(dentry, 0); | 418 | return end_creating(dentry, 0); |
