Update of /cvsroot/linuxcompressed/linux/fs/proc
In directory usw-pr-cvs1:/tmp/cvs-serv26313/fs/proc
Modified Files:
proc_misc.c
Log Message:
Features
o First page cache support for preempted kernels is implemented.
o Fragments have a "count" field that stores the number of references
to the fragment, so we don't have to worry about it getting freed in
the middle of an operation. That tries to fix a highly potential
source of bugs.
Bug fixes
o Fix memory accountancy for double page sizes. Meminfo was broken for
8K pages.
o truncate_list_comp_pages() could try to truncate fragments that were
in locked_comp_pages list, which is bogus. Only swap buffers list are
on this list, and are listed there only for wait_comp_pages().
o when writing out fragments, we didn't pay attention to the return
value, so we may end up freeing a fragment (when refilling swap
buffer) even if the writepage failed. In particular, ramfs, ramdisk
and other memory file systems always fail to write out its pages. Now
we check if the swap buffer page has been set dirty (the writepage()
usually does that after failing to write a page), moving back the
fragment to the dirty list (and of course not freeing the fragment).
o fixed bug that would corrupt the swap buffer list. A bug in the
variable that returned the error code could return error even if a
fragment was found afterall, so the caller function would backout the
writeout operation, leaving the swap buffer locked on the used list,
and it wouldn't never get unlocked.
o account writeout stats only for pages that have been actually
submitted to IO operation.
o fixed bug that would deadlock a system with comp_cache that has page
cache support. The lookup_comp_pages() function may be called from the
following code path: __sync_one() -> filemap_fdatasync(). This code
path tries to sync an inode (and keeps it locked while it is
syncing). However, that very inode can be also in the clear path
(clear_inode() function, called in the exit process path) which will
lock the super block and then wait for inode if it is locked (what
happens with an inode syncing). Since the allocation path may write
pages, which may need to lock the same super block, it will deadlock,
because the super block is locked by the exit path explained
above. So, we end up not being able to allocate the page (in order to
finish this function and unlock the inode) _and_ the super block won't
be unlocked since the inode doesn't get unlocked either. The fix was
to allocate pages with GFP_NOFS mask.
Cleanups
o Some functions were renamed.
o Compression algorithms (removed unnecessary data structures that
were allocated, made some structures to be allocated statically in the
algorithms, some data statically allocated are now kmalloc())
o Removed /proc/sys/vm/comp_cache/actual_size, it doesn't make sense
with resizing on demand.
Others
o Compressed cache only resizes on demand.
Index: proc_misc.c
===================================================================
RCS file: /cvsroot/linuxcompressed/linux/fs/proc/proc_misc.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -C2 -r1.6 -r1.7
*** proc_misc.c 11 Jul 2002 19:08:10 -0000 1.6
--- proc_misc.c 28 Jul 2002 15:47:04 -0000 1.7
***************
*** 183,187 ****
#ifdef CONFIG_COMP_CACHE
K(pg_size + num_swapper_fragments - swapper_space.nrpages),
! K(num_comp_pages),
comp_cache_used_space/1024,
K(swapper_space.nrpages - num_swapper_fragments),
--- 183,187 ----
#ifdef CONFIG_COMP_CACHE
K(pg_size + num_swapper_fragments - swapper_space.nrpages),
! K(num_comp_pages << comp_page_order),
comp_cache_used_space/1024,
K(swapper_space.nrpages - num_swapper_fragments),
|