diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-08-21 20:16:42 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2020-06-09 21:32:29 -0400 |
commit | 7d11c5681b71897d6aa87beebae9be7accf736dd (patch) | |
tree | 68d8118860b72e83326968d30cff5a8fa182b6fb /fs/bcachefs/io.c | |
parent | e177ec4f8c9699ec921e443f3000ec46f4b8113c (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.c | 21 |
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 */ |