Declare the seq_operations and the size of the session state and let
procfs open and free the seq_file of /proc/fs/jbd2/<dev>/info.
->proc_open() only takes the snapshot of the statistics now and
->proc_release() frees it. Reading the file then no longer holds up its
removal when the journal goes away.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/jbd2/journal.c | 33 +++++++++------------------------
1 file changed, 9 insertions(+), 24 deletions(-)
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index 3a4f3f613ead..1e4f4e95a00e 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -1173,51 +1173,36 @@ static const struct seq_operations jbd2_seq_info_ops = {
.show = jbd2_seq_info_show,
};
+/* procfs opened the seq_file and allocated @s */
static int jbd2_seq_info_open(struct inode *inode, struct file *file)
{
journal_t *journal = pde_data(inode);
- struct jbd2_stats_proc_session *s;
- int rc, size;
+ struct jbd2_stats_proc_session *s = ((struct seq_file *)file->private_data)->private;
+ int size = sizeof(struct transaction_stats_s);
- s = kmalloc_obj(*s);
- if (s == NULL)
- return -ENOMEM;
- size = sizeof(struct transaction_stats_s);
s->stats = kmalloc(size, GFP_KERNEL);
- if (s->stats == NULL) {
- kfree(s);
+ if (s->stats == NULL)
return -ENOMEM;
- }
spin_lock(&journal->j_history_lock);
memcpy(s->stats, &journal->j_stats, size);
s->journal = journal;
spin_unlock(&journal->j_history_lock);
-
- rc = seq_open(file, &jbd2_seq_info_ops);
- if (rc == 0) {
- struct seq_file *m = file->private_data;
- m->private = s;
- } else {
- kfree(s->stats);
- kfree(s);
- }
- return rc;
-
+ return 0;
}
static int jbd2_seq_info_release(struct inode *inode, struct file *file)
{
struct seq_file *seq = file->private_data;
struct jbd2_stats_proc_session *s = seq->private;
+
kfree(s->stats);
- kfree(s);
- return seq_release(inode, file);
+ return 0;
}
static const struct proc_ops jbd2_info_proc_ops = {
+ .proc_seq_ops = &jbd2_seq_info_ops,
+ .proc_state_size = sizeof(struct jbd2_stats_proc_session),
.proc_open = jbd2_seq_info_open,
- .proc_read = seq_read,
- .proc_lseek = seq_lseek,
.proc_release = jbd2_seq_info_release,
};
--
2.53.0