ENTRY;
- lock = cl_lock_request(env, io, &link->cill_descr, link->cill_enq_flags,
- "io", io);
+ lock = cl_lock_request(env, io, &link->cill_descr, "io", io);
if (!IS_ERR(lock)) {
link->cill_lock = lock;
list_move(&link->cill_linkage, &set->cls_curr);
- if (!(link->cill_enq_flags & CEF_ASYNC)) {
+ if (!(link->cill_descr.cld_enq_flags & CEF_ASYNC)) {
result = cl_wait(env, lock);
if (result == 0)
list_move(&link->cill_linkage, &set->cls_done);
* Allocates new lock link, and uses it to add a lock to a lockset.
*/
int cl_io_lock_alloc_add(const struct lu_env *env, struct cl_io *io,
- struct cl_lock_descr *descr, int enqflags)
+ struct cl_lock_descr *descr)
{
struct cl_io_lock_link *link;
int result;
OBD_ALLOC_PTR(link);
if (link != NULL) {
link->cill_descr = *descr;
- link->cill_enq_flags = enqflags;
link->cill_fini = cl_free_io_lock_link;
result = cl_io_lock_add(env, io, link);
if (result) /* lock match */
*/
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;
atomic_read(&anchor->csi_sync_nr) == 0,
&lwi);
if (rc < 0) {
- int rc2;
-
CERROR("SYNC IO failed with error: %d, try to cancel "
- "the remaining page\n", rc);
-
- rc2 = cl_io_cancel(env, io, queue);
- if (rc2 < 0) {
- lwi = (struct l_wait_info) { 0 };
- /* Too bad, some pages are still in IO. */
- CERROR("Failed to cancel transfer error: %d, mostly "
- "because of they are still being transferred, "
- "waiting for %i pages\n",
- rc2, atomic_read(&anchor->csi_sync_nr));
- (void)l_wait_event(anchor->csi_waitq,
- atomic_read(&anchor->csi_sync_nr) == 0,
- &lwi);
- }
+ "%d remaining pages\n",
+ rc, atomic_read(&anchor->csi_sync_nr));
+
+ (void)cl_io_cancel(env, io, queue);
+
+ lwi = (struct l_wait_info) { 0 };
+ (void)l_wait_event(anchor->csi_waitq,
+ atomic_read(&anchor->csi_sync_nr) == 0,
+ &lwi);
} else {
rc = anchor->csi_sync_rc;
}
* ->{prepare,commit}_write(). Completion is used to signal the end of
* IO.
*/
+ LASSERT(atomic_read(&anchor->csi_sync_nr) > 0);
if (atomic_dec_and_test(&anchor->csi_sync_nr))
cfs_waitq_broadcast(&anchor->csi_waitq);
EXIT;