diff options
author | David Howells <dhowells@redhat.com> | 2013-04-12 06:17:06 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2013-05-01 17:29:43 -0400 |
commit | e42270a19e357d7808890bdbeb0cae97f2a2d234 (patch) | |
tree | 9d8716ba61855be0479e9bd8ef859dbec79c3e05 /fs/reiserfs | |
parent | 4a520d2769beb736ba2bd084b8293ce148a1a7ae (diff) |
reiserfs: Don't access the proc_dir_entry in r_open(), r_start() r_show()
Don't access the proc_dir_entry in ReiserFS's r_open(), r_start() r_show()
procfs interface functions.
ReiserFS stores the ->show() method pointer in PDE->data and the super_block
pointer in PDE->parent->data. This isn't changing.
Currently, ReiserFS passes the PDE pointer into seq_file::private from
r_open() so that r_start() and r_show() can then access it. Instead, use
seq_open_private() to allocate a two-pointer struct that's passed through
seq_file::private and put the ->show() method and the sb pointers in there.
Signed-off-by: David Howells <dhowells@redhat.com>
cc: reiserfs-devel@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/reiserfs')
-rw-r--r-- | fs/reiserfs/procfs.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c index 07c2162ef556..33532f79b4f7 100644 --- a/fs/reiserfs/procfs.c +++ b/fs/reiserfs/procfs.c | |||
@@ -394,20 +394,24 @@ static int set_sb(struct super_block *sb, void *data) | |||
394 | return -ENOENT; | 394 | return -ENOENT; |
395 | } | 395 | } |
396 | 396 | ||
397 | struct reiserfs_seq_private { | ||
398 | struct super_block *sb; | ||
399 | int (*show) (struct seq_file *, struct super_block *); | ||
400 | }; | ||
401 | |||
397 | static void *r_start(struct seq_file *m, loff_t * pos) | 402 | static void *r_start(struct seq_file *m, loff_t * pos) |
398 | { | 403 | { |
399 | struct proc_dir_entry *de = m->private; | 404 | struct reiserfs_seq_private *priv = m->private; |
400 | struct super_block *s = de->parent->data; | ||
401 | loff_t l = *pos; | 405 | loff_t l = *pos; |
402 | 406 | ||
403 | if (l) | 407 | if (l) |
404 | return NULL; | 408 | return NULL; |
405 | 409 | ||
406 | if (IS_ERR(sget(&reiserfs_fs_type, test_sb, set_sb, 0, s))) | 410 | if (IS_ERR(sget(&reiserfs_fs_type, test_sb, set_sb, 0, priv->sb))) |
407 | return NULL; | 411 | return NULL; |
408 | 412 | ||
409 | up_write(&s->s_umount); | 413 | up_write(&priv->sb->s_umount); |
410 | return s; | 414 | return priv->sb; |
411 | } | 415 | } |
412 | 416 | ||
413 | static void *r_next(struct seq_file *m, void *v, loff_t * pos) | 417 | static void *r_next(struct seq_file *m, void *v, loff_t * pos) |
@@ -426,9 +430,8 @@ static void r_stop(struct seq_file *m, void *v) | |||
426 | 430 | ||
427 | static int r_show(struct seq_file *m, void *v) | 431 | static int r_show(struct seq_file *m, void *v) |
428 | { | 432 | { |
429 | struct proc_dir_entry *de = m->private; | 433 | struct reiserfs_seq_private *priv = m->private; |
430 | int (*show) (struct seq_file *, struct super_block *) = de->data; | 434 | return priv->show(m, v); |
431 | return show(m, v); | ||
432 | } | 435 | } |
433 | 436 | ||
434 | static const struct seq_operations r_ops = { | 437 | static const struct seq_operations r_ops = { |
@@ -440,11 +443,15 @@ static const struct seq_operations r_ops = { | |||
440 | 443 | ||
441 | static int r_open(struct inode *inode, struct file *file) | 444 | static int r_open(struct inode *inode, struct file *file) |
442 | { | 445 | { |
443 | int ret = seq_open(file, &r_ops); | 446 | struct reiserfs_seq_private *priv; |
447 | int ret = seq_open_private(file, &r_ops, | ||
448 | sizeof(struct reiserfs_seq_private)); | ||
444 | 449 | ||
445 | if (!ret) { | 450 | if (!ret) { |
446 | struct seq_file *m = file->private_data; | 451 | struct seq_file *m = file->private_data; |
447 | m->private = PDE(inode); | 452 | priv = m->private; |
453 | priv->sb = proc_get_parent_data(inode); | ||
454 | priv->show = PDE_DATA(inode); | ||
448 | } | 455 | } |
449 | return ret; | 456 | return ret; |
450 | } | 457 | } |
@@ -453,7 +460,7 @@ static const struct file_operations r_file_operations = { | |||
453 | .open = r_open, | 460 | .open = r_open, |
454 | .read = seq_read, | 461 | .read = seq_read, |
455 | .llseek = seq_lseek, | 462 | .llseek = seq_lseek, |
456 | .release = seq_release, | 463 | .release = seq_release_private, |
457 | .owner = THIS_MODULE, | 464 | .owner = THIS_MODULE, |
458 | }; | 465 | }; |
459 | 466 | ||