spin_lock(&lcq->lcq_lock);
- if (lcq->lcq_head.next == NULL)
- lli = ERR_PTR(-1);
- else if (!list_empty(&lcq->lcq_head)) {
+ if (!list_empty(&lcq->lcq_head)) {
lli = list_entry(lcq->lcq_head.next, struct ll_inode_info,
lli_close_list);
list_del_init(&lli->lli_close_list);
- }
+ } else if (atomic_read(&lcq->lcq_stop))
+ lli = ERR_PTR(-1);
spin_unlock(&lcq->lcq_lock);
return lli;
void ll_close_thread_shutdown(struct ll_close_queue *lcq)
{
init_completion(&lcq->lcq_comp);
- lcq->lcq_head.next = NULL;
+ atomic_inc(&lcq->lcq_stop);
wake_up(&lcq->lcq_waitq);
wait_for_completion(&lcq->lcq_comp);
OBD_FREE(lcq, sizeof(*lcq));
struct list_head lcq_head;
wait_queue_head_t lcq_waitq;
struct completion lcq_comp;
+ atomic_t lcq_stop;
};
void llap_write_pending(struct inode *inode, struct ll_async_page *llap);
}
llap->llap_write_queued = 0;
-
+ /* Do not pass llap here as it is sync write. */
+ llap_write_pending(inode, NULL);
+
rc = oig_init(&oig);
if (rc)
GOTO(out, rc);
* skip setattr. */
next = mdt_object_child(mo);
if (som_update && (info->mti_epoch->ioepoch != mo->mot_ioepoch))
- GOTO(out, rc = 0);
+ GOTO(out, rc = 0);
next = mdt_object_child(mo);
if (lu_object_assert_not_exists(&mo->mot_obj.mo_lu))