summaryrefslogtreecommitdiff
path: root/fs/bcachefs/io.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-08-21 20:16:42 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2020-06-09 21:32:29 -0400
commit7d11c5681b71897d6aa87beebae9be7accf736dd (patch)
tree68d8118860b72e83326968d30cff5a8fa182b6fb /fs/bcachefs/io.c
parente177ec4f8c9699ec921e443f3000ec46f4b8113c (diff)
bcachefs: Check alignment in write path
Also - fix alignment in bch2_set_page_dirty() Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Diffstat (limited to 'fs/bcachefs/io.c')
-rw-r--r--fs/bcachefs/io.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/bcachefs/io.c b/fs/bcachefs/io.c
index 0515b9b2bbf3..7b469b20e970 100644
--- a/fs/bcachefs/io.c
+++ b/fs/bcachefs/io.c
@@ -911,30 +911,39 @@ flush_io:
void bch2_write(struct closure *cl)
{
struct bch_write_op *op = container_of(cl, struct bch_write_op, cl);
+ struct bio *bio = &op->wbio.bio;
struct bch_fs *c = op->c;
BUG_ON(!op->nr_replicas);
BUG_ON(!op->write_point.v);
BUG_ON(!bkey_cmp(op->pos, POS_MAX));
+ if (bio_sectors(bio) & (c->opts.block_size - 1)) {
+ __bcache_io_error(c, "misaligned write");
+ op->error = -EIO;
+ goto err;
+ }
+
op->start_time = local_clock();
bch2_keylist_init(&op->insert_keys, op->inline_keys);
- wbio_init(&op->wbio.bio)->put_bio = false;
+ wbio_init(bio)->put_bio = false;
if (c->opts.nochanges ||
!percpu_ref_tryget(&c->writes)) {
__bcache_io_error(c, "read only");
op->error = -EROFS;
- if (!(op->flags & BCH_WRITE_NOPUT_RESERVATION))
- bch2_disk_reservation_put(c, &op->res);
- closure_return(cl);
- return;
+ goto err;
}
- bch2_increment_clock(c, bio_sectors(&op->wbio.bio), WRITE);
+ bch2_increment_clock(c, bio_sectors(bio), WRITE);
continue_at_nobarrier(cl, __bch2_write, NULL);
+ return;
+err:
+ if (!(op->flags & BCH_WRITE_NOPUT_RESERVATION))
+ bch2_disk_reservation_put(c, &op->res);
+ closure_return(cl);
}
/* Cache promotion on read */