X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fosd-ldiskfs%2Fosd_io.c;h=35e08f8f7a56f2272143c3847dc097a1bec7d27a;hb=80ad9c5cb2419899ed4bab8a5d6eb7fa58729073;hp=9adc20f9c14191a9d6ac1b788ceaf8888ae3299f;hpb=cb1a6851d0815c82fbc48550c49bac4a88cee056;p=fs%2Flustre-release.git diff --git a/lustre/osd-ldiskfs/osd_io.c b/lustre/osd-ldiskfs/osd_io.c index 9adc20f..35e08f8 100644 --- a/lustre/osd-ldiskfs/osd_io.c +++ b/lustre/osd-ldiskfs/osd_io.c @@ -351,6 +351,7 @@ static int osd_do_bio(struct osd_device *osd, struct inode *inode, 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; @@ -691,6 +692,7 @@ static int osd_write_commit(const struct lu_env *env, struct dt_object *dt, 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 && @@ -970,7 +972,7 @@ static int osd_ldiskfs_writelink(struct inode *inode, char *buffer, int buflen) } int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, - loff_t *offs, handle_t *handle) + int write_NUL, loff_t *offs, handle_t *handle) { struct buffer_head *bh = NULL; loff_t offset = *offs; @@ -982,6 +984,15 @@ int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, 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); @@ -1020,6 +1031,8 @@ int osd_ldiskfs_write_record(struct inode *inode, void *buf, int bufsize, 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); @@ -1044,12 +1057,13 @@ static ssize_t osd_write(const struct lu_env *env, struct dt_object *dt, 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)); @@ -1069,16 +1083,18 @@ static ssize_t osd_write(const struct lu_env *env, struct dt_object *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