If we have enough aggressive DIO readers, truncate and other dio
waiters will wait forever inside inode_dio_wait(). It is reasonable
to disable nonlock DIO read optimization during truncate.
Reviewed-by: Jan Kara <jack@suse.cz>
Signed-off-by: Dmitry Monakhov <dmonakhov@openvz.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
        if (attr->ia_valid & ATTR_SIZE) {
                if (attr->ia_size != i_size_read(inode)) {
                        truncate_setsize(inode, attr->ia_size);
-                       /* Inode size will be reduced, wait for dio in flight */
-                       if (orphan)
+                       /* Inode size will be reduced, wait for dio in flight.
+                        * Temporarily disable dioread_nolock to prevent
+                        * livelock. */
+                       if (orphan) {
+                               ext4_inode_block_unlocked_dio(inode);
                                inode_dio_wait(inode);
+                               ext4_inode_resume_unlocked_dio(inode);
+                       }
                }
                ext4_truncate(inode);
        }