bio->bi_bdev = inode->i_sb->s_bdev;
bio->bi_sector = sector;
+ bio->bi_rw = (iobuf->dr_rw == 0) ? READ : WRITE;
bio->bi_end_io = dio_complete_routine;
bio->bi_private = iobuf;
osd_init_iobuf(osd, iobuf, 1);
isize = i_size_read(inode);
+ ll_vfs_dq_init(inode);
for (i = 0; i < npages; i++) {
if (lnb[i].rc == -ENOSPC &&
return 0;
}
-static int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize,
- loff_t *offs, handle_t *handle)
+int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize,
+ int write_NUL, loff_t *offs, handle_t *handle)
{
struct buffer_head *bh = NULL;
loff_t offset = *offs;
int boffs;
int dirty_inode = 0;
+ if (write_NUL) {
+ /*
+ * long symlink write does not count the NUL terminator in
+ * bufsize, we write it, and the inode's file size does not
+ * count the NUL terminator as well.
+ */
+ ((char *)buf)[bufsize] = '\0';
+ ++bufsize;
+ }
while (bufsize > 0) {
if (bh != NULL)
brelse(bh);
if (bh)
brelse(bh);
+ if (write_NUL)
+ --new_size;
/* correct in-core and on-disk sizes */
if (new_size > i_size_read(inode)) {
cfs_spin_lock(&inode->i_lock);
struct thandle *handle, struct lustre_capa *capa,
int ignore_quota)
{
- struct inode *inode = osd_dt_obj(dt)->oo_inode;
- struct osd_thandle *oh;
- ssize_t result;
+ struct inode *inode = osd_dt_obj(dt)->oo_inode;
+ struct osd_thandle *oh;
+ ssize_t result;
#ifdef HAVE_QUOTA_SUPPORT
- cfs_cap_t save = cfs_curproc_cap_pack();
+ cfs_cap_t save = cfs_curproc_cap_pack();
#endif
+ int is_link;
LASSERT(dt_object_exists(dt));
else
cfs_cap_lower(CFS_CAP_SYS_RESOURCE);
#endif
- /* Write small symlink to inode body as we need to maintain correct
- * on-disk symlinks for ldiskfs.
- */
- if (S_ISLNK(dt->do_lu.lo_header->loh_attr) &&
- (buf->lb_len < sizeof(LDISKFS_I(inode)->i_data)))
- result = osd_ldiskfs_writelink(inode, buf->lb_buf, buf->lb_len);
- else
- result = osd_ldiskfs_write_record(inode, buf->lb_buf,
- buf->lb_len, pos,
- oh->ot_handle);
+ /* Write small symlink to inode body as we need to maintain correct
+ * on-disk symlinks for ldiskfs.
+ * Note: the buf->lb_buf contains a NUL terminator while buf->lb_len
+ * does not count it in.
+ */
+ is_link = S_ISLNK(dt->do_lu.lo_header->loh_attr);
+ if (is_link && (buf->lb_len < sizeof(LDISKFS_I(inode)->i_data)))
+ result = osd_ldiskfs_writelink(inode, buf->lb_buf, buf->lb_len);
+ else
+ result = osd_ldiskfs_write_record(inode, buf->lb_buf,
+ buf->lb_len, is_link, pos,
+ oh->ot_handle);
#ifdef HAVE_QUOTA_SUPPORT
cfs_curproc_cap_unpack(save);
#endif