/* "If nbyte is 0, read() will return 0 and have no other
* results." -- Single Unix Spec */
if (count == 0)
- return 1;
- /* "If nbyte is 0, read() will return 0 and have no other
- * results." -- Single Unix Spec */
- if (count == 0)
result = 1;
else {
vio->cui_tot_count = count;
}
}
- return 0;
+ return result;
}
static int slp_attr_get(const struct lu_env *env, struct cl_object *obj,
*
*/
-static int slp_io_rw_lock(const struct lu_env *env, struct cl_io *io,
- enum cl_lock_mode mode, loff_t start, loff_t end)
-{
- int result;
-
- LASSERT(io->ci_type == CIT_READ || io->ci_type == CIT_WRITE);
-
- if (!io->u.ci_wr.wr_append) { // No lock without O_APPEND in liblustre
- return 0;
- }
-
- result = ccc_io_one_lock(env, io, 0, mode, start, end);
-
- return result;
-}
-
-static int slp_io_write_lock(const struct lu_env *env,
+static int slp_io_rw_lock(const struct lu_env *env,
const struct cl_io_slice *ios)
{
struct cl_io *io = ios->cis_io;
loff_t start;
loff_t end;
- if (io->u.ci_wr.wr_append) {
+ if (cl_io_is_append(io)) {
start = 0;
end = OBD_OBJECT_EOF;
} else {
start = io->u.ci_wr.wr.crw_pos;
end = start + io->u.ci_wr.wr.crw_count - 1;
}
-
- return slp_io_rw_lock(env, io, CLM_WRITE, start, end);
+ /*
+ * This acquires real DLM lock only in O_APPEND case, because of
+ * the io->ci_lockreq setting in llu_io_init().
+ */
+ LASSERT(ergo(cl_io_is_append(io), io->ci_lockreq == CILR_MANDATORY));
+ LASSERT(ergo(!cl_io_is_append(io), io->ci_lockreq == CILR_NEVER));
+ return ccc_io_one_lock(env, io, 0,
+ io->ci_type == CIT_READ ? CLM_READ : CLM_WRITE,
+ start, end);
}
.op = {
[CIT_READ] = {
.cio_fini = ccc_io_fini,
+ .cio_lock = slp_io_rw_lock,
.cio_start = slp_io_start,
.cio_end = ccc_io_end
},
[CIT_WRITE] = {
.cio_fini = ccc_io_fini,
- .cio_lock = slp_io_write_lock,
+ .cio_lock = slp_io_rw_lock,
.cio_start = slp_io_start,
.cio_end = ccc_io_end
},
io->u.ci_wr.wr_append = lli->lli_open_flags & O_APPEND;
io->ci_obj = llu_i2info(inode)->lli_clob;
- if (lli->lli_open_flags & O_APPEND)
+ if ((lli->lli_open_flags & O_APPEND) && write)
io->ci_lockreq = CILR_MANDATORY;
else
io->ci_lockreq = CILR_NEVER;
-
}
int llu_iop_read(struct inode *ino,
ENTER("make sure O_APPEND take effect");
snprintf(file, MAX_PATH_LENGTH, "%s/test_t22_file", lustre_path);
- fd = open(file, O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
+ fd = open(file, O_TRUNC|O_RDWR|O_CREAT|O_APPEND, (mode_t)0666);
if (fd < 0) {
printf("error open file: %s\n", strerror(errno));
return(-1);
opg = osc_cl_page_osc(apage);
apage = opg->ops_cl.cpl_page; /* now apage is a sub-page */
lock = cl_lock_at_page(env, apage->cp_obj, apage, NULL, 1, 1);
- if (lock != NULL) {
- olck = osc_lock_at(lock);
- LASSERT(olck != NULL);
- /* check for lockless io. */
- if (olck->ols_lock != NULL) {
- oa->o_handle = olck->ols_lock->l_remote_handle;
- oa->o_valid |= OBD_MD_FLHANDLE;
- }
- cl_lock_put(env, lock);
- } else {
- /* Should only be possible with liblustre */
- LASSERT(LIBLUSTRE_CLIENT);
+ LASSERT(lock != NULL);
+ olck = osc_lock_at(lock);
+ LASSERT(olck != NULL);
+ /* check for lockless io. */
+ if (olck->ols_lock != NULL) {
+ oa->o_handle = olck->ols_lock->l_remote_handle;
+ oa->o_valid |= OBD_MD_FLHANDLE;
}
+ cl_lock_put(env, lock);
}
}
pc->pc_recurred++;
if (pc->pc_recurred == 1) {
- lu_context_enter(&pc->pc_env.le_ctx);
- rc = ptlrpcd_check(&pc->pc_env, pc);
- lu_context_exit(&pc->pc_env.le_ctx);
- if (!rc)
- ptlrpc_expired_set(pc->pc_set);
- /*
- * XXX: send replay requests.
- */
- if (test_bit(LIOD_RECOVERY, &pc->pc_flags))
+ rc = lu_env_refill(&pc->pc_env);
+ if (rc == 0) {
+ lu_context_enter(&pc->pc_env.le_ctx);
rc = ptlrpcd_check(&pc->pc_env, pc);
+ lu_context_exit(&pc->pc_env.le_ctx);
+ if (!rc)
+ ptlrpc_expired_set(pc->pc_set);
+ /*
+ * XXX: send replay requests.
+ */
+ if (test_bit(LIOD_RECOVERY, &pc->pc_flags))
+ rc = ptlrpcd_check(&pc->pc_env, pc);
+ }
}
pc->pc_recurred--;