ext4: endless truncate due to nonlocked dio readers
authorDmitry Monakhov <dmonakhov@openvz.org>
Sat, 29 Sep 2012 04:56:15 +0000 (00:56 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Sat, 29 Sep 2012 04:56:15 +0000 (00:56 -0400)
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>
fs/ext4/inode.c

index 0bfc633..05ab70d 100644 (file)
@@ -4333,9 +4333,14 @@ int ext4_setattr(struct dentry *dentry, struct iattr *attr)
        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);
        }