memset(io, 0, sizeof *io);
io->u.ci_rw.crw_nonblock = file->f_flags & O_NONBLOCK;
if (write)
- io->u.ci_wr.wr_append = file->f_flags & O_APPEND;
+ io->u.ci_wr.wr_append = !!(file->f_flags & O_APPEND);
io->ci_obj = ll_i2info(inode)->lli_clob;
io->ci_lockreq = CILR_MAYBE;
if (ll_file_nolock(file)) {
}
case CIT_READ:
case CIT_WRITE: {
- io->u.ci_rw.crw_pos = start;
- io->u.ci_rw.crw_count = end - start;
+ if (cl_io_is_append(parent)) {
+ io->u.ci_wr.wr_append = 1;
+ } else {
+ io->u.ci_rw.crw_pos = start;
+ io->u.ci_rw.crw_count = end - start;
+ }
break;
}
default:
*/
static int cl_page_in_io(const struct cl_page *page, const struct cl_io *io)
{
- int result;
+ int result = 1;
loff_t start;
loff_t end;
pgoff_t idx;
* check that [start, end) and [pos, pos + count) extents
* overlap.
*/
- start = cl_offset(page->cp_obj, idx);
- end = cl_offset(page->cp_obj, idx + 1);
- result = io->u.ci_rw.crw_pos < end &&
- start < io->u.ci_rw.crw_pos + io->u.ci_rw.crw_count;
+ if (!cl_io_is_append(io)) {
+ const struct cl_io_rw_common *crw = &(io->u.ci_rw);
+ start = cl_offset(page->cp_obj, idx);
+ end = cl_offset(page->cp_obj, idx + 1);
+ result = crw->crw_pos < end &&
+ start < crw->crw_pos + crw->crw_count;
+ }
break;
case CIT_FAULT:
result = io->u.ci_fault.ft_index == idx;