* Copyright (c) 2005-2008 Joern Engel <joern@logfs.org>
*/
#include "logfs.h"
-
+#include <linux/slab.h>
/*
* Atomic dir operations
*/
static pgoff_t hash_index(u32 hash, int round)
{
+ u32 i0_blocks = I0_BLOCKS;
+ u32 i1_blocks = I1_BLOCKS;
+ u32 i2_blocks = I2_BLOCKS;
+ u32 i3_blocks = I3_BLOCKS;
+
switch (round) {
case 0:
- return hash % I0_BLOCKS;
+ return hash % i0_blocks;
case 1:
- return I0_BLOCKS + hash % (I1_BLOCKS - I0_BLOCKS);
+ return i0_blocks + hash % (i1_blocks - i0_blocks);
case 2:
- return I1_BLOCKS + hash % (I2_BLOCKS - I1_BLOCKS);
+ return i1_blocks + hash % (i2_blocks - i1_blocks);
case 3:
- return I2_BLOCKS + hash % (I3_BLOCKS - I2_BLOCKS);
+ return i2_blocks + hash % (i3_blocks - i2_blocks);
case 4 ... 19:
- return I3_BLOCKS + 16 * (hash % (((1<<31) - I3_BLOCKS) / 16))
+ return i3_blocks + 16 * (hash % (((1<<31) - i3_blocks) / 16))
+ round - 4;
}
BUG();
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
page = logfs_get_dd_page(dir, dentry);
- if (!page)
+ if (!page) {
+ kfree(ta);
return -ENOENT;
- if (IS_ERR(page))
+ }
+ if (IS_ERR(page)) {
+ kfree(ta);
return PTR_ERR(page);
+ }
index = page->index;
page_cache_release(page);
(filler_t *)logfs_readpage, NULL);
if (IS_ERR(page))
return PTR_ERR(page);
- dd = kmap_atomic(page, KM_USER0);
+ dd = kmap(page);
BUG_ON(dd->namelen == 0);
full = filldir(buf, (char *)dd->name, be16_to_cpu(dd->namelen),
pos, be64_to_cpu(dd->ino), dd->type);
- kunmap_atomic(dd, KM_USER0);
+ kunmap(page);
page_cache_release(page);
if (full)
break;