aboutsummaryrefslogtreecommitdiffstats
path: root/fs/hppfs/hppfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/hppfs/hppfs.c')
-rw-r--r--fs/hppfs/hppfs.c44
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
544struct hppfs_dirent { 545struct 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
562static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir) 563static 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
583static const struct file_operations hppfs_dir_fops = { 579static 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,