* [Linux-ia64] 2.4.16 and truncating a file on open()
@ 2001-12-07 22:43 Stephane Eranian
0 siblings, 0 replies; only message in thread
From: Stephane Eranian @ 2001-12-07 22:43 UTC (permalink / raw)
To: linux-ia64
Hi,
I am struggling with a problem with open() on 2.4.16-011128. I don't
think that the bug is IA-64 specific but I post it here in case someone
has seen this one before. I'll post it to lkm later.
--------------------------------------------------------------------------
I am running a multithreaded program in which each of the to "slave"
thread opens a different file via a fopen(myfile, "w"). Because I run
this program several times in a row, the file is almost always in the buffer
cache. The open will truncate the content of the file.
Now I get a kernel panic due to a failed sanity check in __free_pages_ok()
because the page that the kernel tries to free is still locked. Using KDB
I captured the following stack trace. This is with kernel-2.4.16 release +
IA-64 patche (011128). I do not think that this problem is IA-64 related
however.
I looked at the code path and sure enough, by the time the free_pages_ok()
routine is called, the page will always be locked due to the TryLockPage()
that is in truncate_list_pages(). This seems to be required to perform the
remove_inode_page() operation but this is treated as a failure by
free_pages_ok() which immedialely follows in this case.
My question is: Is there a missing UnlockPage() somewhere on this code path?
If not then, how did I get into this situation?
Here is the stack trace obtained with KDB/ia64:
sys_open+0xa0
args (0x20000000008077c0, 0x241, 0x1b6, 0xc000000000000690, 0xc000000000000308)
filp_open+0x60
args (0xe000000004293000, 0x8241, 0x1b6, 0xe00000000453cfe0, 0x813)
open_namei+0xb90
args (0xe00000003dfbc248, 0x8242, 0x1b6, 0xe00000003e88fe40, 0x0)
do_truncate+0x90
args (0xe00000003c5d89c0, 0x0, 0xe00000003b6ae578, 0xe00000000455c470, 0x711)
notify_change+0x2a0
args (0xe00000003c5d89c0, 0xe00000003e88fdf0, 0x0, 0xe00000003b6ae4c0, 0x48)
inode_setattr+0x50
args (0xe00000003b6ae4c0, 0xe00000003e88fdf0, 0x48, 0x0, 0xe0000000045774e0)
vmtruncate+0x160
args (0xe00000003b6ae4c0, 0x0, 0xe00000003b6ae648, 0xe00000003b6ae650, 0xe00000003b6ae5f8)
truncate_inode_pages+0xc0
args (0xe00000003b6ae5f8, 0x0, 0xe0000000044971e0, 0x0, 0xe00000003b6ae618)
truncate_list_pages+0x2e0
args (0xe00000003b6ae5f8, 0x0, 0xe00000003e88fde0, 0xe00000000085ca00, 0x0)
truncate_complete_page+0x110
args (0xe00000000085ca00, 0xe000000004518f40, 0x60f)
page_cache_release+0x80
args (0xe00000000085ca00, 0xe000000004518c30, 0x185)
__free_pages_ok+0x1e0
args (0xe00000000085ca00, 0x0, 0xe00000000085ca30, 0xe00000000085ca30, 0x0)
Failed in __free_pages_ok() (mm/page_alloc.c): if (PageLocked(page)) BUG()
ia64_leave_kernel
args (0xe00000003e88fc30, 0x80200000000, 0xe00000003e88fc40)
ia64_do_page_fault+0x810
args (0xe00000003e88fc30, 0x80200000000, 0xe00000003e88fc40, 0x0, 0xe00000003d6bcc00)
die+0x220
args (0xe0000000049ddab8, 0xe00000003e88fc40, 0x80200000000, 0xe0000000044c59f0, 0x58f)
--
-Stephane
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2001-12-07 22:43 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-12-07 22:43 [Linux-ia64] 2.4.16 and truncating a file on open() Stephane Eranian
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.