···121121122122 trace_ext4_evict_inode(inode);123123124124- mutex_lock(&inode->i_mutex);125125- ext4_flush_completed_IO(inode);126126- mutex_unlock(&inode->i_mutex);127124 ext4_ioend_wait(inode);128125129126 if (inode->i_nlink) {
+17-1
fs/ext4/page-io.c
···142142 unsigned long flags;143143 int ret;144144145145- mutex_lock(&inode->i_mutex);145145+ if (!mutex_trylock(&inode->i_mutex)) {146146+ /*147147+ * Requeue the work instead of waiting so that the work148148+ * items queued after this can be processed.149149+ */150150+ queue_work(EXT4_SB(inode->i_sb)->dio_unwritten_wq, &io->work);151151+ /*152152+ * To prevent the ext4-dio-unwritten thread from keeping153153+ * requeueing end_io requests and occupying cpu for too long,154154+ * yield the cpu if it sees an end_io request that has already155155+ * been requeued.156156+ */157157+ if (io->flag & EXT4_IO_END_QUEUED)158158+ yield();159159+ io->flag |= EXT4_IO_END_QUEUED;160160+ return;161161+ }146162 ret = ext4_end_io_nolock(io);147163 if (ret < 0) {148164 mutex_unlock(&inode->i_mutex);