diff options
Diffstat (limited to 'fs/hppfs/hppfs.c')
-rw-r--r-- | fs/hppfs/hppfs.c | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c index cd3e38972c86..4338ff32959d 100644 --- a/fs/hppfs/hppfs.c +++ b/fs/hppfs/hppfs.c | |||
@@ -69,7 +69,7 @@ static char *dentry_name(struct dentry *dentry, int extra) | |||
69 | struct dentry *parent; | 69 | struct dentry *parent; |
70 | char *root, *name; | 70 | char *root, *name; |
71 | const char *seg_name; | 71 | const char *seg_name; |
72 | int len, seg_len; | 72 | int len, seg_len, root_len; |
73 | 73 | ||
74 | len = 0; | 74 | len = 0; |
75 | parent = dentry; | 75 | parent = dentry; |
@@ -81,7 +81,8 @@ static char *dentry_name(struct dentry *dentry, int extra) | |||
81 | } | 81 | } |
82 | 82 | ||
83 | root = "proc"; | 83 | root = "proc"; |
84 | len += strlen(root); | 84 | root_len = strlen(root); |
85 | len += root_len; | ||
85 | name = kmalloc(len + extra + 1, GFP_KERNEL); | 86 | name = kmalloc(len + extra + 1, GFP_KERNEL); |
86 | if (name == NULL) | 87 | if (name == NULL) |
87 | return NULL; | 88 | return NULL; |
@@ -91,7 +92,7 @@ static char *dentry_name(struct dentry *dentry, int extra) | |||
91 | while (parent->d_parent != parent) { | 92 | while (parent->d_parent != parent) { |
92 | if (is_pid(parent)) { | 93 | if (is_pid(parent)) { |
93 | seg_name = "pid"; | 94 | seg_name = "pid"; |
94 | seg_len = strlen("pid"); | 95 | seg_len = strlen(seg_name); |
95 | } | 96 | } |
96 | else { | 97 | else { |
97 | seg_name = parent->d_name.name; | 98 | seg_name = parent->d_name.name; |
@@ -100,10 +101,10 @@ static char *dentry_name(struct dentry *dentry, int extra) | |||
100 | 101 | ||
101 | len -= seg_len + 1; | 102 | len -= seg_len + 1; |
102 | name[len] = '/'; | 103 | name[len] = '/'; |
103 | strncpy(&name[len + 1], seg_name, seg_len); | 104 | memcpy(&name[len + 1], seg_name, seg_len); |
104 | parent = parent->d_parent; | 105 | parent = parent->d_parent; |
105 | } | 106 | } |
106 | strncpy(name, root, strlen(root)); | 107 | memcpy(name, root, root_len); |
107 | return name; | 108 | return name; |
108 | } | 109 | } |
109 | 110 | ||
@@ -542,8 +543,8 @@ static const struct file_operations hppfs_file_fops = { | |||
542 | }; | 543 | }; |
543 | 544 | ||
544 | struct hppfs_dirent { | 545 | struct hppfs_dirent { |
545 | void *vfs_dirent; | 546 | struct dir_context ctx; |
546 | filldir_t filldir; | 547 | struct dir_context *caller; |
547 | struct dentry *dentry; | 548 | struct dentry *dentry; |
548 | }; | 549 | }; |
549 | 550 | ||
@@ -555,34 +556,29 @@ static int hppfs_filldir(void *d, const char *name, int size, | |||
555 | if (file_removed(dirent->dentry, name)) | 556 | if (file_removed(dirent->dentry, name)) |
556 | return 0; | 557 | return 0; |
557 | 558 | ||
558 | return (*dirent->filldir)(dirent->vfs_dirent, name, size, offset, | 559 | dirent->caller->pos = dirent->ctx.pos; |
559 | inode, type); | 560 | return !dir_emit(dirent->caller, name, size, inode, type); |
560 | } | 561 | } |
561 | 562 | ||
562 | static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir) | 563 | static int hppfs_readdir(struct file *file, struct dir_context *ctx) |
563 | { | 564 | { |
564 | struct hppfs_private *data = file->private_data; | 565 | struct hppfs_private *data = file->private_data; |
565 | struct file *proc_file = data->proc_file; | 566 | struct file *proc_file = data->proc_file; |
566 | int (*readdir)(struct file *, void *, filldir_t); | 567 | struct hppfs_dirent d = { |
567 | struct hppfs_dirent dirent = ((struct hppfs_dirent) | 568 | .ctx.actor = hppfs_filldir, |
568 | { .vfs_dirent = ent, | 569 | .caller = ctx, |
569 | .filldir = filldir, | 570 | .dentry = file->f_path.dentry |
570 | .dentry = file->f_path.dentry | 571 | }; |
571 | }); | ||
572 | int err; | 572 | int err; |
573 | 573 | proc_file->f_pos = ctx->pos; | |
574 | readdir = file_inode(proc_file)->i_fop->readdir; | 574 | err = iterate_dir(proc_file, &d.ctx); |
575 | 575 | ctx->pos = d.ctx.pos; | |
576 | proc_file->f_pos = file->f_pos; | ||
577 | err = (*readdir)(proc_file, &dirent, hppfs_filldir); | ||
578 | file->f_pos = proc_file->f_pos; | ||
579 | |||
580 | return err; | 576 | return err; |
581 | } | 577 | } |
582 | 578 | ||
583 | static const struct file_operations hppfs_dir_fops = { | 579 | static const struct file_operations hppfs_dir_fops = { |
584 | .owner = NULL, | 580 | .owner = NULL, |
585 | .readdir = hppfs_readdir, | 581 | .iterate = hppfs_readdir, |
586 | .open = hppfs_dir_open, | 582 | .open = hppfs_dir_open, |
587 | .llseek = default_llseek, | 583 | .llseek = default_llseek, |
588 | .release = hppfs_release, | 584 | .release = hppfs_release, |