mtd/fs/jffs2 nodemgmt.c,1.100,1.101
David Woodhouse
dwmw2 at infradead.org
Wed Oct 8 07:47:22 EDT 2003
Update of /home/cvs/mtd/fs/jffs2
In directory phoenix.infradead.org:/tmp/cvs-serv18091
Modified Files:
nodemgmt.c
Log Message:
Eat up space to resv_space_deletion only if we would otherwise have returned -ENOSPC; don't avoid GC unconditionally for deletia.
Index: nodemgmt.c
===================================================================
RCS file: /home/cvs/mtd/fs/jffs2/nodemgmt.c,v
retrieving revision 1.100
retrieving revision 1.101
diff -u -r1.100 -r1.101
--- nodemgmt.c 4 Oct 2003 08:33:06 -0000 1.100
+++ nodemgmt.c 8 Oct 2003 11:47:19 -0000 1.101
@@ -47,9 +47,6 @@
/* align it */
minsize = PAD(minsize);
- if (prio == ALLOC_DELETION)
- blocksneeded = c->resv_blocks_deletion;
-
D1(printk(KERN_DEBUG "jffs2_reserve_space(): Requested 0x%x bytes\n", minsize));
down(&c->alloc_sem);
@@ -63,8 +60,6 @@
int ret;
uint32_t dirty, avail;
- up(&c->alloc_sem);
-
/* calculate real dirty size
* dirty_size contains blocks on erase_pending_list
* those blocks are counted in c->nr_erasing_blocks.
@@ -78,10 +73,16 @@
* of nodes.
*/
dirty = c->dirty_size + c->erasing_size - c->nr_erasing_blocks * c->sector_size + c->unchecked_size;
- if (dirty < c->sector_size) {
- D1(printk(KERN_DEBUG "dirty size 0x%08x + unchecked_size 0x%08x < sector size 0x%08x, returning -ENOSPC\n",
+ if (dirty < c->nospc_dirty_size) {
+ if (prio == ALLOC_DELETION && c->nr_free_blocks + c->nr_erasing_blocks < c->resv_blocks_deletion) {
+ printk(KERN_NOTICE "jffs2_reserve_space(): Low on dirty space to GC, but it's a deletion. Allowing...\n");
+ break;
+ }
+ D1(printk(KERN_DEBUG "dirty size 0x%08x + unchecked_size 0x%08x < nospc_dirty_size 0x%08x, returning -ENOSPC\n",
dirty, c->unchecked_size, c->sector_size));
+
spin_unlock(&c->erase_completion_lock);
+ up(&c->alloc_sem);
return -ENOSPC;
}
@@ -96,12 +97,20 @@
*/
avail = c->free_size + c->dirty_size + c->erasing_size + c->unchecked_size;
if ( (avail / c->sector_size) <= blocksneeded) {
+ if (prio == ALLOC_DELETION && c->nr_free_blocks + c->nr_erasing_blocks < c->resv_blocks_deletion) {
+ printk(KERN_NOTICE "jffs2_reserve_space(): Low on possibly available space, but it's a deletion. Allowing...\n");
+ break;
+ }
+
D1(printk(KERN_DEBUG "max. available size 0x%08x < blocksneeded * sector_size 0x%08x, returning -ENOSPC\n",
avail, blocksneeded * c->sector_size));
spin_unlock(&c->erase_completion_lock);
+ up(&c->alloc_sem);
return -ENOSPC;
}
-
+
+ up(&c->alloc_sem);
+
D1(printk(KERN_DEBUG "Triggering GC pass. nr_free_blocks %d, nr_erasing_blocks %d, free_size 0x%08x, dirty_size 0x%08x, wasted_size 0x%08x, used_size 0x%08x, erasing_size 0x%08x, bad_size 0x%08x (total 0x%08x of 0x%08x)\n",
c->nr_free_blocks, c->nr_erasing_blocks, c->free_size, c->dirty_size, c->wasted_size, c->used_size, c->erasing_size, c->bad_size,
c->free_size + c->dirty_size + c->wasted_size + c->used_size + c->erasing_size + c->bad_size, c->flash_size));
More information about the linux-mtd-cvs
mailing list