Commit da23795e authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: thread_with_file: add f_ops.flush

Add a flush op, to return the exit code via close().

Also update bcachefs usage to use this to return fsck exit codes.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 6b333129
...@@ -155,14 +155,28 @@ static void bch2_fsck_thread_exit(struct thread_with_stdio *_thr) ...@@ -155,14 +155,28 @@ static void bch2_fsck_thread_exit(struct thread_with_stdio *_thr)
kfree(thr); kfree(thr);
} }
static void bch2_fsck_offline_thread_fn(struct thread_with_stdio *stdio) static int bch2_fsck_offline_thread_fn(struct thread_with_stdio *stdio)
{ {
struct fsck_thread *thr = container_of(stdio, struct fsck_thread, thr); struct fsck_thread *thr = container_of(stdio, struct fsck_thread, thr);
struct bch_fs *c = bch2_fs_open(thr->devs, thr->nr_devs, thr->opts); struct bch_fs *c = bch2_fs_open(thr->devs, thr->nr_devs, thr->opts);
thr->thr.thr.ret = PTR_ERR_OR_ZERO(c); if (IS_ERR(c))
if (!thr->thr.thr.ret) return PTR_ERR(c);
bch2_fs_stop(c);
int ret = 0;
if (test_bit(BCH_FS_errors_fixed, &c->flags))
ret |= 1;
if (test_bit(BCH_FS_error, &c->flags))
ret |= 4;
bch2_fs_stop(c);
if (ret & 1)
bch2_stdio_redirect_printf(&stdio->stdio, false, "%s: errors fixed\n", c->name);
if (ret & 4)
bch2_stdio_redirect_printf(&stdio->stdio, false, "%s: still has errors\n", c->name);
return ret;
} }
static const struct thread_with_stdio_ops bch2_offline_fsck_ops = { static const struct thread_with_stdio_ops bch2_offline_fsck_ops = {
...@@ -763,7 +777,7 @@ static long bch2_ioctl_disk_resize_journal(struct bch_fs *c, ...@@ -763,7 +777,7 @@ static long bch2_ioctl_disk_resize_journal(struct bch_fs *c,
return ret; return ret;
} }
static void bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio) static int bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio)
{ {
struct fsck_thread *thr = container_of(stdio, struct fsck_thread, thr); struct fsck_thread *thr = container_of(stdio, struct fsck_thread, thr);
struct bch_fs *c = thr->c; struct bch_fs *c = thr->c;
...@@ -795,6 +809,7 @@ static void bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio) ...@@ -795,6 +809,7 @@ static void bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio)
up(&c->online_fsck_mutex); up(&c->online_fsck_mutex);
bch2_ro_ref_put(c); bch2_ro_ref_put(c);
return ret;
} }
static const struct thread_with_stdio_ops bch2_online_fsck_ops = { static const struct thread_with_stdio_ops bch2_online_fsck_ops = {
......
...@@ -247,6 +247,14 @@ static __poll_t thread_with_stdout_poll(struct file *file, struct poll_table_str ...@@ -247,6 +247,14 @@ static __poll_t thread_with_stdout_poll(struct file *file, struct poll_table_str
return mask; return mask;
} }
static int thread_with_stdio_flush(struct file *file, fl_owner_t id)
{
struct thread_with_stdio *thr =
container_of(file->private_data, struct thread_with_stdio, thr);
return thr->thr.ret;
}
static long thread_with_stdio_ioctl(struct file *file, unsigned int cmd, unsigned long p) static long thread_with_stdio_ioctl(struct file *file, unsigned int cmd, unsigned long p)
{ {
struct thread_with_stdio *thr = struct thread_with_stdio *thr =
...@@ -262,6 +270,7 @@ static const struct file_operations thread_with_stdio_fops = { ...@@ -262,6 +270,7 @@ static const struct file_operations thread_with_stdio_fops = {
.read = thread_with_stdio_read, .read = thread_with_stdio_read,
.write = thread_with_stdio_write, .write = thread_with_stdio_write,
.poll = thread_with_stdio_poll, .poll = thread_with_stdio_poll,
.flush = thread_with_stdio_flush,
.release = thread_with_stdio_release, .release = thread_with_stdio_release,
.unlocked_ioctl = thread_with_stdio_ioctl, .unlocked_ioctl = thread_with_stdio_ioctl,
}; };
...@@ -270,6 +279,7 @@ static const struct file_operations thread_with_stdout_fops = { ...@@ -270,6 +279,7 @@ static const struct file_operations thread_with_stdout_fops = {
.llseek = no_llseek, .llseek = no_llseek,
.read = thread_with_stdio_read, .read = thread_with_stdio_read,
.poll = thread_with_stdout_poll, .poll = thread_with_stdout_poll,
.flush = thread_with_stdio_flush,
.release = thread_with_stdio_release, .release = thread_with_stdio_release,
.unlocked_ioctl = thread_with_stdio_ioctl, .unlocked_ioctl = thread_with_stdio_ioctl,
}; };
...@@ -278,7 +288,7 @@ static int thread_with_stdio_fn(void *arg) ...@@ -278,7 +288,7 @@ static int thread_with_stdio_fn(void *arg)
{ {
struct thread_with_stdio *thr = arg; struct thread_with_stdio *thr = arg;
thr->ops->fn(thr); thr->thr.ret = thr->ops->fn(thr);
thread_with_stdio_done(thr); thread_with_stdio_done(thr);
return 0; return 0;
......
...@@ -53,7 +53,7 @@ struct thread_with_stdio; ...@@ -53,7 +53,7 @@ struct thread_with_stdio;
struct thread_with_stdio_ops { struct thread_with_stdio_ops {
void (*exit)(struct thread_with_stdio *); void (*exit)(struct thread_with_stdio *);
void (*fn)(struct thread_with_stdio *); int (*fn)(struct thread_with_stdio *);
long (*unlocked_ioctl)(struct thread_with_stdio *, unsigned int, unsigned long); long (*unlocked_ioctl)(struct thread_with_stdio *, unsigned int, unsigned long);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment