|
@@ -142,7 +142,23 @@ static void ext4_end_io_work(struct work_struct *work)
|
|
|
unsigned long flags;
|
|
|
int ret;
|
|
|
|
|
|
- mutex_lock(&inode->i_mutex);
|
|
|
+ if (!mutex_trylock(&inode->i_mutex)) {
|
|
|
+ /*
|
|
|
+ * Requeue the work instead of waiting so that the work
|
|
|
+ * items queued after this can be processed.
|
|
|
+ */
|
|
|
+ queue_work(EXT4_SB(inode->i_sb)->dio_unwritten_wq, &io->work);
|
|
|
+ /*
|
|
|
+ * To prevent the ext4-dio-unwritten thread from keeping
|
|
|
+ * requeueing end_io requests and occupying cpu for too long,
|
|
|
+ * yield the cpu if it sees an end_io request that has already
|
|
|
+ * been requeued.
|
|
|
+ */
|
|
|
+ if (io->flag & EXT4_IO_END_QUEUED)
|
|
|
+ yield();
|
|
|
+ io->flag |= EXT4_IO_END_QUEUED;
|
|
|
+ return;
|
|
|
+ }
|
|
|
ret = ext4_end_io_nolock(io);
|
|
|
if (ret < 0) {
|
|
|
mutex_unlock(&inode->i_mutex);
|