Commit 5781ac2
ext4: fix deadlock between inline_data and ext4_expand_extra_isize_ea()
commit c755e251357a0cee0679081f08c3f4ba797a8009 upstream.
The xattr_sem deadlock problems fixed in commit 2e81a4eeedca: "ext4:
avoid deadlock when expanding inode size" didn't include the use of
xattr_sem in fs/ext4/inline.c. With the addition of project quota
which added a new extra inode field, this exposed deadlocks in the
inline_data code similar to the ones fixed by 2e81a4eeedca.
The deadlock can be reproduced via:
dmesg -n 7
mke2fs -t ext4 -O inline_data -Fq -I 256 /dev/vdc 32768
mount -t ext4 -o debug_want_extra_isize=24 /dev/vdc /vdc
mkdir /vdc/a
umount /vdc
mount -t ext4 /dev/vdc /vdc
echo foo > /vdc/a/foo
and looks like this:
[ 11.158815]
[ 11.160276] =============================================
[ 11.161960] [ INFO: possible recursive locking detected ]
[ 11.161960] 4.10.0-rc3-00015-g011b30a8a3cf #160 Tainted: G W
[ 11.161960] ---------------------------------------------
[ 11.161960] bash/2519 is trying to acquire lock:
[ 11.161960] (&ei->xattr_sem){++++..}, at: [<c1225a4b>] ext4_expand_extra_isize_ea+0x3d/0x4cd
[ 11.161960]
[ 11.161960] but task is already holding lock:
[ 11.161960] (&ei->xattr_sem){++++..}, at: [<c1227941>] ext4_try_add_inline_entry+0x3a/0x152
[ 11.161960]
[ 11.161960] other info that might help us debug this:
[ 11.161960] Possible unsafe locking scenario:
[ 11.161960]
[ 11.161960] CPU0
[ 11.161960] ----
[ 11.161960] lock(&ei->xattr_sem);
[ 11.161960] lock(&ei->xattr_sem);
[ 11.161960]
[ 11.161960] *** DEADLOCK ***
[ 11.161960]
[ 11.161960] May be due to missing lock nesting notation
[ 11.161960]
[ 11.161960] 4 locks held by bash/2519:
[ 11.161960] #0: (sb_writers#3){.+.+.+}, at: [<c11a2414>] mnt_want_write+0x1e/0x3e
[ 11.161960] #1: (&type->i_mutex_dir_key){++++++}, at: [<c119508b>] path_openat+0x338/0x67a
[ 11.161960] AOSP-JF-MM#2: (jbd2_handle){++++..}, at: [<c123314a>] start_this_handle+0x582/0x622
[ 11.161960] CyanogenMod#3: (&ei->xattr_sem){++++..}, at: [<c1227941>] ext4_try_add_inline_entry+0x3a/0x152
[ 11.161960]
[ 11.161960] stack backtrace:
[ 11.161960] CPU: 0 PID: 2519 Comm: bash Tainted: G W 4.10.0-rc3-00015-g011b30a8a3cf #160
[ 11.161960] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.1-1 04/01/2014
[ 11.161960] Call Trace:
[ 11.161960] dump_stack+0x72/0xa3
[ 11.161960] __lock_acquire+0xb7c/0xcb9
[ 11.161960] ? kvm_clock_read+0x1f/0x29
[ 11.161960] ? __lock_is_held+0x36/0x66
[ 11.161960] ? __lock_is_held+0x36/0x66
[ 11.161960] lock_acquire+0x106/0x18a
[ 11.161960] ? ext4_expand_extra_isize_ea+0x3d/0x4cd
[ 11.161960] down_write+0x39/0x72
[ 11.161960] ? ext4_expand_extra_isize_ea+0x3d/0x4cd
[ 11.161960] ext4_expand_extra_isize_ea+0x3d/0x4cd
[ 11.161960] ? _raw_read_unlock+0x22/0x2c
[ 11.161960] ? jbd2_journal_extend+0x1e2/0x262
[ 11.161960] ? __ext4_journal_get_write_access+0x3d/0x60
[ 11.161960] ext4_mark_inode_dirty+0x17d/0x26d
[ 11.161960] ? ext4_add_dirent_to_inline.isra.12+0xa5/0xb2
[ 11.161960] ext4_add_dirent_to_inline.isra.12+0xa5/0xb2
[ 11.161960] ext4_try_add_inline_entry+0x69/0x152
[ 11.161960] ext4_add_entry+0xa3/0x848
[ 11.161960] ? __brelse+0x14/0x2f
[ 11.161960] ? _raw_spin_unlock_irqrestore+0x44/0x4f
[ 11.161960] ext4_add_nondir+0x17/0x5b
[ 11.161960] ext4_create+0xcf/0x133
[ 11.161960] ? ext4_mknod+0x12f/0x12f
[ 11.161960] lookup_open+0x39e/0x3fb
[ 11.161960] ? __wake_up+0x1a/0x40
[ 11.161960] ? lock_acquire+0x11e/0x18a
[ 11.161960] path_openat+0x35c/0x67a
[ 11.161960] ? sched_clock_cpu+0xd7/0xf2
[ 11.161960] do_filp_open+0x36/0x7c
[ 11.161960] ? _raw_spin_unlock+0x22/0x2c
[ 11.161960] ? __alloc_fd+0x169/0x173
[ 11.161960] do_sys_open+0x59/0xcc
[ 11.161960] SyS_open+0x1d/0x1f
[ 11.161960] do_int80_syscall_32+0x4f/0x61
[ 11.161960] entry_INT80_32+0x2f/0x2f
[ 11.161960] EIP: 0xb76ad469
[ 11.161960] EFLAGS: 00000286 CPU: 0
[ 11.161960] EAX: ffffffda EBX: 08168ac8 ECX: 00008241 EDX: 000001b6
[ 11.161960] ESI: b75e46bc EDI: b7755000 EBP: bfbdb108 ESP: bfbdafc0
[ 11.161960] DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b
Cc: stable@vger.kernel.org # 3.10 (requires 2e81a4eeedca as a prereq)
Reported-by: George Spelvin <linux@sciencehorizons.net>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Harsh Shandilya <harsh@prjkt.io>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>1 parent 48bb699 commit 5781ac2
3 files changed
Lines changed: 74 additions & 54 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
374 | 374 | | |
375 | 375 | | |
376 | 376 | | |
377 | | - | |
| 377 | + | |
378 | 378 | | |
379 | 379 | | |
380 | 380 | | |
| |||
384 | 384 | | |
385 | 385 | | |
386 | 386 | | |
387 | | - | |
| 387 | + | |
388 | 388 | | |
389 | 389 | | |
390 | 390 | | |
391 | 391 | | |
392 | 392 | | |
393 | 393 | | |
394 | | - | |
395 | | - | |
| 394 | + | |
396 | 395 | | |
397 | 396 | | |
398 | 397 | | |
| |||
522 | 521 | | |
523 | 522 | | |
524 | 523 | | |
525 | | - | |
| 524 | + | |
526 | 525 | | |
527 | 526 | | |
528 | 527 | | |
| |||
562 | 561 | | |
563 | 562 | | |
564 | 563 | | |
565 | | - | |
| 564 | + | |
566 | 565 | | |
567 | 566 | | |
568 | 567 | | |
| |||
598 | 597 | | |
599 | 598 | | |
600 | 599 | | |
601 | | - | |
| 600 | + | |
602 | 601 | | |
603 | 602 | | |
604 | 603 | | |
| |||
624 | 623 | | |
625 | 624 | | |
626 | 625 | | |
627 | | - | |
| 626 | + | |
628 | 627 | | |
629 | 628 | | |
630 | 629 | | |
| |||
717 | 716 | | |
718 | 717 | | |
719 | 718 | | |
720 | | - | |
| 719 | + | |
721 | 720 | | |
722 | 721 | | |
723 | 722 | | |
| |||
735 | 734 | | |
736 | 735 | | |
737 | 736 | | |
738 | | - | |
| 737 | + | |
739 | 738 | | |
740 | 739 | | |
741 | 740 | | |
| |||
745 | 744 | | |
746 | 745 | | |
747 | 746 | | |
748 | | - | |
| 747 | + | |
749 | 748 | | |
750 | 749 | | |
751 | 750 | | |
| |||
756 | 755 | | |
757 | 756 | | |
758 | 757 | | |
759 | | - | |
| 758 | + | |
760 | 759 | | |
761 | 760 | | |
762 | 761 | | |
| |||
766 | 765 | | |
767 | 766 | | |
768 | 767 | | |
769 | | - | |
| 768 | + | |
770 | 769 | | |
771 | 770 | | |
772 | 771 | | |
773 | | - | |
| 772 | + | |
774 | 773 | | |
775 | 774 | | |
776 | 775 | | |
| |||
1245 | 1244 | | |
1246 | 1245 | | |
1247 | 1246 | | |
1248 | | - | |
| 1247 | + | |
1249 | 1248 | | |
1250 | 1249 | | |
1251 | 1250 | | |
| |||
1254 | 1253 | | |
1255 | 1254 | | |
1256 | 1255 | | |
1257 | | - | |
| 1256 | + | |
1258 | 1257 | | |
1259 | 1258 | | |
1260 | 1259 | | |
| |||
1299 | 1298 | | |
1300 | 1299 | | |
1301 | 1300 | | |
1302 | | - | |
| 1301 | + | |
1303 | 1302 | | |
1304 | 1303 | | |
1305 | 1304 | | |
| |||
1655 | 1654 | | |
1656 | 1655 | | |
1657 | 1656 | | |
1658 | | - | |
| 1657 | + | |
1659 | 1658 | | |
1660 | 1659 | | |
1661 | 1660 | | |
1662 | 1661 | | |
1663 | 1662 | | |
1664 | 1663 | | |
1665 | 1664 | | |
1666 | | - | |
| 1665 | + | |
1667 | 1666 | | |
1668 | 1667 | | |
1669 | 1668 | | |
| |||
1698 | 1697 | | |
1699 | 1698 | | |
1700 | 1699 | | |
1701 | | - | |
| 1700 | + | |
1702 | 1701 | | |
1703 | 1702 | | |
1704 | 1703 | | |
| |||
1797 | 1796 | | |
1798 | 1797 | | |
1799 | 1798 | | |
1800 | | - | |
| 1799 | + | |
1801 | 1800 | | |
1802 | | - | |
| 1801 | + | |
1803 | 1802 | | |
1804 | | - | |
| 1803 | + | |
1805 | 1804 | | |
1806 | 1805 | | |
1807 | 1806 | | |
| |||
1879 | 1878 | | |
1880 | 1879 | | |
1881 | 1880 | | |
1882 | | - | |
| 1881 | + | |
1883 | 1882 | | |
1884 | 1883 | | |
1885 | 1884 | | |
| |||
1896 | 1895 | | |
1897 | 1896 | | |
1898 | 1897 | | |
1899 | | - | |
| 1898 | + | |
1900 | 1899 | | |
1901 | 1900 | | |
1902 | 1901 | | |
| |||
1954 | 1953 | | |
1955 | 1954 | | |
1956 | 1955 | | |
1957 | | - | |
| 1956 | + | |
1958 | 1957 | | |
1959 | 1958 | | |
1960 | 1959 | | |
| |||
1970 | 1969 | | |
1971 | 1970 | | |
1972 | 1971 | | |
1973 | | - | |
| 1972 | + | |
1974 | 1973 | | |
1975 | 1974 | | |
1976 | 1975 | | |
| |||
1992 | 1991 | | |
1993 | 1992 | | |
1994 | 1993 | | |
1995 | | - | |
1996 | | - | |
1997 | | - | |
1998 | | - | |
1999 | | - | |
2000 | | - | |
2001 | | - | |
2002 | | - | |
2003 | | - | |
| 1994 | + | |
| 1995 | + | |
| 1996 | + | |
| 1997 | + | |
2004 | 1998 | | |
2005 | 1999 | | |
2006 | 2000 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1120 | 1120 | | |
1121 | 1121 | | |
1122 | 1122 | | |
1123 | | - | |
| 1123 | + | |
1124 | 1124 | | |
1125 | 1125 | | |
1126 | 1126 | | |
1127 | 1127 | | |
1128 | 1128 | | |
1129 | 1129 | | |
1130 | | - | |
1131 | | - | |
1132 | | - | |
| 1130 | + | |
1133 | 1131 | | |
1134 | 1132 | | |
1135 | 1133 | | |
| |||
1190 | 1188 | | |
1191 | 1189 | | |
1192 | 1190 | | |
1193 | | - | |
| 1191 | + | |
1194 | 1192 | | |
1195 | 1193 | | |
1196 | 1194 | | |
| |||
1204 | 1202 | | |
1205 | 1203 | | |
1206 | 1204 | | |
1207 | | - | |
1208 | | - | |
1209 | | - | |
| 1205 | + | |
1210 | 1206 | | |
1211 | 1207 | | |
1212 | 1208 | | |
| |||
1289 | 1285 | | |
1290 | 1286 | | |
1291 | 1287 | | |
| 1288 | + | |
| 1289 | + | |
| 1290 | + | |
| 1291 | + | |
1292 | 1292 | | |
1293 | | - | |
1294 | | - | |
1295 | | - | |
1296 | | - | |
1297 | | - | |
1298 | 1293 | | |
1299 | 1294 | | |
1300 | 1295 | | |
| |||
1487 | 1482 | | |
1488 | 1483 | | |
1489 | 1484 | | |
1490 | | - | |
1491 | | - | |
| 1485 | + | |
1492 | 1486 | | |
1493 | 1487 | | |
1494 | 1488 | | |
| |||
1500 | 1494 | | |
1501 | 1495 | | |
1502 | 1496 | | |
1503 | | - | |
1504 | | - | |
| 1497 | + | |
1505 | 1498 | | |
1506 | | - | |
| 1499 | + | |
| 1500 | + | |
1507 | 1501 | | |
1508 | 1502 | | |
1509 | 1503 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
101 | 133 | | |
102 | 134 | | |
103 | 135 | | |
| |||
0 commit comments