@@ -2456,6 +2456,11 @@ int cl_io_lru_reserve(const struct lu_env *env, struct cl_io *io,
int cl_io_read_ahead(const struct lu_env *env, struct cl_io *io,
pgoff_t start, struct cl_read_ahead *ra);
+static inline int cl_io_is_fault_writable(const struct cl_io *io)
+{
+ return io->ci_type == CIT_FAULT && io->u.ci_fault.ft_writable;
+}
+
/**
* True, if @io is an O_APPEND write(2).
*/
@@ -117,6 +117,9 @@ struct vm_area_struct *our_vma(struct mm_struct *mm, unsigned long addr,
else if (vma->vm_flags & VM_RAND_READ)
io->ci_rand_read = 1;
+ if (vma->vm_flags & VM_WRITE)
+ fio->ft_writable = 1;
+
rc = cl_io_init(env, io, CIT_FAULT, io->ci_obj);
if (rc == 0) {
struct vvp_io *vio = vvp_env_io(env);
@@ -128,7 +131,6 @@ struct vm_area_struct *our_vma(struct mm_struct *mm, unsigned long addr,
io->ci_lockreq = CILR_MANDATORY;
vio->vui_fd = fd;
} else {
- LASSERT(rc < 0);
cl_io_fini(env, io);
if (io->ci_need_restart)
goto restart;
@@ -363,7 +363,8 @@ static void vvp_io_fini(const struct lu_env *env, const struct cl_io_slice *ios)
io->ci_need_write_intent = 0;
LASSERT(io->ci_type == CIT_WRITE || cl_io_is_fallocate(io) ||
- cl_io_is_trunc(io) || cl_io_is_mkwrite(io));
+ cl_io_is_trunc(io) || cl_io_is_mkwrite(io) ||
+ cl_io_is_fault_writable(io));
CDEBUG(D_VFSTRACE, DFID" write layout, type %u " DEXT "\n",
PFID(lu_object_fid(&obj->co_lu)), io->ci_type,
@@ -221,8 +221,9 @@ static int lov_io_mirror_write_intent(struct lov_io *lio,
*ext = (typeof(*ext)) { lio->lis_pos, lio->lis_endpos };
io->ci_need_write_intent = 0;
- if (!(io->ci_type == CIT_WRITE || cl_io_is_trunc(io) ||
- cl_io_is_mkwrite(io)))
+ if (!(io->ci_type == CIT_WRITE || cl_io_is_mkwrite(io) ||
+ cl_io_is_fallocate(io) || cl_io_is_trunc(io) ||
+ cl_io_is_fault_writable(io)))
return 0;
/* FLR: check if it needs to send a write intent RPC to server.
@@ -574,7 +575,8 @@ static int lov_io_slice_init(struct lov_io *lio, struct lov_object *obj,
/* check if it needs to instantiate layout */
if (!(io->ci_type == CIT_WRITE || cl_io_is_mkwrite(io) ||
cl_io_is_fallocate(io) ||
- (cl_io_is_trunc(io) && io->u.ci_setattr.sa_attr.lvb_size > 0))) {
+ (cl_io_is_trunc(io) && io->u.ci_setattr.sa_attr.lvb_size > 0)) ||
+ cl_io_is_fault_writable(io)) {
result = 0;
goto out;
}