free(buf);
}
-static int write_set_inode(struct bch_fs *c, fuse_ino_t inum, off_t new_size)
+static int inode_update_times(struct bch_fs *c, fuse_ino_t inum)
{
struct btree_trans trans;
struct btree_iter *iter;
if (ret)
goto err;
- inode_u.bi_size = max_t(u64, inode_u.bi_size, new_size);
inode_u.bi_mtime = now;
inode_u.bi_ctime = now;
static int write_aligned(struct bch_fs *c, fuse_ino_t inum,
struct bch_io_opts io_opts, void *buf,
size_t aligned_size, off_t aligned_offset,
- size_t *written_out)
+ off_t new_i_size, size_t *written_out)
{
struct bch_write_op op = { 0 };
struct bio_vec bv;
op.nr_replicas = io_opts.data_replicas;
op.target = io_opts.foreground_target;
op.pos = POS(inum, aligned_offset >> 9);
+ op.new_i_size = new_i_size;
userbio_init(&op.wbio.bio, &bv, buf, aligned_size);
bio_set_op_attrs(&op.wbio.bio, REQ_OP_WRITE, REQ_SYNC);
/* Actually write. */
ret = write_aligned(c, inum, io_opts, aligned_buf,
- align.size, align.start, &aligned_written);
+ align.size, align.start,
+ offset + size, &aligned_written);
/* Figure out how many unaligned bytes were written. */
size_t written = align_fix_up_bytes(&align, aligned_written);
ret = 0;
/*
- * Update inode data.
+ * Update inode times.
* TODO: Integrate with bch2_extent_update()
*/
if (!ret)
- ret = write_set_inode(c, inum, offset + written);
+ ret = inode_update_times(c, inum);
if (!ret) {
BUG_ON(written == 0);
size_t aligned_written;
ret = write_aligned(c, new_inode.bi_inum, io_opts, aligned_buf,
- align.size, align.start, &aligned_written);
+ align.size, align.start, link_len + 1,
+ &aligned_written);
free(aligned_buf);
if (ret)
size_t written = align_fix_up_bytes(&align, aligned_written);
BUG_ON(written != link_len + 1); // TODO: handle short
- ret = write_set_inode(c, new_inode.bi_inum, written);
+ ret = inode_update_times(c, new_inode.bi_inum);
if (ret)
goto err;