FastNetMon

Monday, 18 January 2010

2.6.32.3 kernel oops: dquot_transfer

Баг есть: http://bugzilla.kernel.org/show_bug.cgi?id=15051

Судя по жалобам, возникает в случае, если активированы квоты. Сейчас попробую на 33е апнуться, может поможет.

А теперь немного сыскной работы, Changelog 32 ядра (ссылка) и видим там такой патч:


commit bbf245072d81e512cc88535379ae6edb5d08f420
Author: Dmitry Monakhov
Date: Mon Dec 14 15:21:13 2009 +0300

quota: decouple fs reserved space from quota reservation

commit fd8fbfc1709822bd94247c5b2ab15a5f5041e103 upstream.

Currently inode_reservation is managed by fs itself and this
reservation is transfered on dquot_transfer(). This means what
inode_reservation must always be in sync with
dquot->dq_dqb.dqb_rsvspace. Otherwise dquot_transfer() will result
in incorrect quota(WARN_ON in dquot_claim_reserved_space() will be
triggered)
This is not easy because of complex locking order issues
for example http://bugzilla.kernel.org/show_bug.cgi?id=14739

The patch introduce quota reservation field for each fs-inode
(fs specific inode is used in order to prevent bloating generic
vfs inode). This reservation is managed by quota code internally
similar to i_blocks/i_bytes and may not be always in sync with
internal fs reservation.

Also perform some code rearrangement:
- Unify dquot_reserve_space() and dquot_reserve_space()
- Unify dquot_release_reserved_space() and dquot_free_space()
- Also this patch add missing warning update to release_rsv()
dquot_release_reserved_space() must call flush_warnings() as
dquot_free_space() does.



А теперь открываем Chagelog 33 ядра (ссылка) и видим там такой антипатч:


commit 05b5d898235401c489c68e1f3bc5706a29ad5713
Author: Jan Kara
Date: Wed Jan 6 18:03:36 2010 +0100

quota: Fix dquot_transfer for filesystems different from ext4

Commit fd8fbfc1 modified the way we find amount of reserved space
belonging to an inode. The amount of reserved space is checked
from dquot_transfer and thus inode_reserved_space gets called
even for filesystems that don't provide get_reserved_space callback
which results in a BUG.

Fix the problem by checking get_reserved_space callback and return 0 if
the filesystem does not provide it.

CC: Dmitry Monakhov
Signed-off-by: Jan Kara


Вот ссылка на патч от Jan Kara.

А вот и сам патч:

index dea86ab..3fc62b0 100644 (file)
--- a/fs/quota/dquot.c
+++ b/fs/quota/dquot.c
@@ -1377,6 +1377,9 @@ static void inode_sub_rsv_space(struct inode *inode, qsize_t number)
static qsize_t inode_get_rsv_space(struct inode *inode)
{
qsize_t ret;
+
+ if (!inode->i_sb->dq_op->get_reserved_space)
+ return 0;
spin_lock(&inode->i_lock);
ret = *inode_reserved_space(inode);
spin_unlock(&inode->i_lock);


Ани комментс? :) Так что осталось выдрать этот патч из 33 ветки и накатить на 32 ядро :)

Update: патч найден и накачен, все окей, проблема была именно в этом, по ссылке в багзилле ядра также дал ссылки на патч.

Update: фикс принят, но собстна он итак был в "next stable", но все равно очень приятно :)

Update: вышло 2.6.32.4, где баг испарвлен.

No comments :

Post a Comment

Note: only a member of this blog may post a comment.