]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
bcachefs: thread_with_file: add f_ops.flush
authorKent Overstreet <kent.overstreet@linux.dev>
Sun, 18 Feb 2024 01:49:11 +0000 (20:49 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Thu, 14 Mar 2024 01:22:20 +0000 (21:22 -0400)
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: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/chardev.c
fs/bcachefs/thread_with_file.c
fs/bcachefs/thread_with_file.h

index b1a460729a4b4116fd441f3a338640ecba88cd87..b584d78cb39cc6cccab565f2abed217930c567de 100644 (file)
@@ -155,14 +155,28 @@ static void bch2_fsck_thread_exit(struct thread_with_stdio *_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 bch_fs *c = bch2_fs_open(thr->devs, thr->nr_devs, thr->opts);
 
-       thr->thr.thr.ret = PTR_ERR_OR_ZERO(c);
-       if (!thr->thr.thr.ret)
-               bch2_fs_stop(c);
+       if (IS_ERR(c))
+               return PTR_ERR(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 = {
@@ -763,7 +777,7 @@ static long bch2_ioctl_disk_resize_journal(struct bch_fs *c,
        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 bch_fs *c = thr->c;
@@ -795,6 +809,7 @@ static void bch2_fsck_online_thread_fn(struct thread_with_stdio *stdio)
 
        up(&c->online_fsck_mutex);
        bch2_ro_ref_put(c);
+       return ret;
 }
 
 static const struct thread_with_stdio_ops bch2_online_fsck_ops = {
index 60d701f33f85be18c830b64e3fe00de78aea229b..940db15d6a939bf93281627e9759904e4a6531f3 100644 (file)
@@ -247,6 +247,14 @@ static __poll_t thread_with_stdout_poll(struct file *file, struct poll_table_str
        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)
 {
        struct thread_with_stdio *thr =
@@ -262,6 +270,7 @@ static const struct file_operations thread_with_stdio_fops = {
        .read           = thread_with_stdio_read,
        .write          = thread_with_stdio_write,
        .poll           = thread_with_stdio_poll,
+       .flush          = thread_with_stdio_flush,
        .release        = thread_with_stdio_release,
        .unlocked_ioctl = thread_with_stdio_ioctl,
 };
@@ -270,6 +279,7 @@ static const struct file_operations thread_with_stdout_fops = {
        .llseek         = no_llseek,
        .read           = thread_with_stdio_read,
        .poll           = thread_with_stdout_poll,
+       .flush          = thread_with_stdio_flush,
        .release        = thread_with_stdio_release,
        .unlocked_ioctl = thread_with_stdio_ioctl,
 };
@@ -278,7 +288,7 @@ static int thread_with_stdio_fn(void *arg)
 {
        struct thread_with_stdio *thr = arg;
 
-       thr->ops->fn(thr);
+       thr->thr.ret = thr->ops->fn(thr);
 
        thread_with_stdio_done(thr);
        return 0;
index f0b8c04ed4a47de537788e908775f98d0ca0c874..af54ea8f5b0ff85871c915e275187c29b7b0c6f1 100644 (file)
@@ -53,7 +53,7 @@ struct thread_with_stdio;
 
 struct thread_with_stdio_ops {
        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);
 };