struct cl_2queue *queue = &info->clt_queue;
struct cl_lock_descr *descr = &lock->cll_descr;
long page_count;
+ int nonblock = 1, resched;
int result;
LINVRNT(cl_lock_invariant(env, lock));
io->ci_obj = cl_object_top(descr->cld_obj);
result = cl_io_init(env, io, CIT_MISC, io->ci_obj);
- if (result == 0) {
- int nonblock = 1;
+ if (result != 0)
+ GOTO(out, result);
-restart:
+ do {
cl_2queue_init(queue);
cl_page_gang_lookup(env, descr->cld_obj, io, descr->cld_start,
- descr->cld_end, &queue->c2_qin, nonblock);
+ descr->cld_end, &queue->c2_qin, nonblock,
+ &resched);
page_count = queue->c2_qin.pl_nr;
if (page_count > 0) {
result = cl_page_list_unmap(env, io, &queue->c2_qin);
}
cl_2queue_fini(env, queue);
- if (nonblock) {
- nonblock = 0;
- goto restart;
- }
- }
+ if (resched)
+ cfs_cond_resched();
+ } while (resched || nonblock--);
+out:
cl_io_fini(env, io);
RETURN(result);
}
const char *scope, const void *source)
{
struct cl_lock *lock;
- const struct lu_fid *fid;
int rc;
- int iter;
__u32 enqflags = need->cld_enq_flags;
ENTRY;
- fid = lu_object_fid(&io->ci_obj->co_lu);
- iter = 0;
do {
lock = cl_lock_hold_mutex(env, io, need, scope, source);
if (!IS_ERR(lock)) {
lock = ERR_PTR(rc);
} else
rc = PTR_ERR(lock);
- iter++;
} while (rc == 0);
RETURN(lock);
}