diff options
Diffstat (limited to 'debian')
-rw-r--r-- | debian/changelog | 2 | ||||
-rw-r--r-- | debian/patches/thread-throttle.patch | 65 |
2 files changed, 67 insertions, 0 deletions
diff --git a/debian/changelog b/debian/changelog index 93fbe98b..90af51fe 100644 --- a/debian/changelog +++ b/debian/changelog @@ -14,6 +14,8 @@ hurd (20071119-2) UNRELEASED; urgency=low [ Samuel Thibault] * debian/patches/mmx.patch: New patch to align the stack of created threads. + * debian/thread-throttle.patch: Add a fix for ext2fs to keep the superblock + in memory so as to avoid a thread creation dead lock. -- Michael Banck <mbanck@debian.org> Tue, 08 Jan 2008 15:54:52 +0100 diff --git a/debian/patches/thread-throttle.patch b/debian/patches/thread-throttle.patch index 9cf10399..7c6269d0 100644 --- a/debian/patches/thread-throttle.patch +++ b/debian/patches/thread-throttle.patch @@ -1,3 +1,7 @@ +Avoid creating too many threads by limiting them to 250. +Work around a problem in ext2 where this would case a deadlock since we would +sometimes not create the thread needed for reading the superblock... + --- libports/manage-multithread.c.orig 2005-08-10 13:38:18.000000000 +0200 +++ libports/manage-multithread.c 2005-08-10 13:34:30.000000000 +0200 @@ -23,6 +23,19 @@ @@ -96,3 +100,64 @@ { spin_lock (&lock); if (totalthreads != 1) +--- ext2fs/hyper.c 2008-03-10 01:14:16.643969000 +0000 ++++ ext2fs/hyper.c 2008-03-01 23:41:53.227511000 +0000 +@@ -55,17 +55,22 @@ + + static int ext2fs_clean; /* fs clean before we started writing? */ + ++struct ext2_super_block *__sblock = NULL; + void + get_hypermetadata (void) + { + error_t err; + size_t read; ++ static struct ext2_super_block _sblock; + + assert (! sblock); + err = store_read (store, SBLOCK_OFFS >> store->log2_block_size, +- SBLOCK_SIZE, (void **)&sblock, &read); ++ SBLOCK_SIZE, (void **)&__sblock, &read); + if (err || read != SBLOCK_SIZE) + ext2_panic ("Cannot read hypermetadata"); ++ ++ sblock = &_sblock; ++ *sblock = *__sblock; + + if (sblock->s_magic != EXT2_SUPER_MAGIC + #ifdef EXT2FS_PRE_02B_COMPAT +@@ -159,18 +164,18 @@ + if (zeroblock == 0) + zeroblock = (vm_address_t) mmap (0, block_size, PROT_READ, MAP_ANON, 0, 0); + +- munmap (sblock, SBLOCK_SIZE); +- sblock = NULL; ++ munmap (__sblock, SBLOCK_SIZE); ++ __sblock = NULL; + } + + void + map_hypermetadata (void) + { +- sblock = (struct ext2_super_block *) boffs_ptr (SBLOCK_OFFS); ++ __sblock = (struct ext2_super_block *) boffs_ptr (SBLOCK_OFFS); + + /* Cache a convenient pointer to the block group descriptors for allocation. + These are stored in the filesystem blocks following the superblock. */ +- group_desc_image = (struct ext2_group_desc *) bptr (bptr_block (sblock) + 1); ++ group_desc_image = (struct ext2_group_desc *) bptr (bptr_block (__sblock) + 1); + } + + error_t +@@ -193,8 +198,9 @@ + if (sblock_dirty) + { + sblock_dirty = 0; +- disk_cache_block_ref_ptr (sblock); +- record_global_poke (sblock); ++ *__sblock = *sblock; ++ disk_cache_block_ref_ptr (__sblock); ++ record_global_poke (__sblock); + } + + sync_global (wait); |