summaryrefslogtreecommitdiff
path: root/ANDROID_3.4.5/fs/omfs/bitmap.c
diff options
context:
space:
mode:
authorSrikant Patnaik2015-01-11 12:28:04 +0530
committerSrikant Patnaik2015-01-11 12:28:04 +0530
commit871480933a1c28f8a9fed4c4d34d06c439a7a422 (patch)
tree8718f573808810c2a1e8cb8fb6ac469093ca2784 /ANDROID_3.4.5/fs/omfs/bitmap.c
parent9d40ac5867b9aefe0722bc1f110b965ff294d30d (diff)
downloadFOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.gz
FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.tar.bz2
FOSSEE-netbook-kernel-source-871480933a1c28f8a9fed4c4d34d06c439a7a422.zip
Moved, renamed, and deleted files
The original directory structure was scattered and unorganized. Changes are basically to make it look like kernel structure.
Diffstat (limited to 'ANDROID_3.4.5/fs/omfs/bitmap.c')
-rw-r--r--ANDROID_3.4.5/fs/omfs/bitmap.c193
1 files changed, 0 insertions, 193 deletions
diff --git a/ANDROID_3.4.5/fs/omfs/bitmap.c b/ANDROID_3.4.5/fs/omfs/bitmap.c
deleted file mode 100644
index 08223458..00000000
--- a/ANDROID_3.4.5/fs/omfs/bitmap.c
+++ /dev/null
@@ -1,193 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/fs.h>
-#include <linux/buffer_head.h>
-#include <asm/div64.h>
-#include "omfs.h"
-
-unsigned long omfs_count_free(struct super_block *sb)
-{
- unsigned int i;
- unsigned long sum = 0;
- struct omfs_sb_info *sbi = OMFS_SB(sb);
- int nbits = sb->s_blocksize * 8;
-
- for (i = 0; i < sbi->s_imap_size; i++)
- sum += nbits - bitmap_weight(sbi->s_imap[i], nbits);
-
- return sum;
-}
-
-/*
- * Counts the run of zero bits starting at bit up to max.
- * It handles the case where a run might spill over a buffer.
- * Called with bitmap lock.
- */
-static int count_run(unsigned long **addr, int nbits,
- int addrlen, int bit, int max)
-{
- int count = 0;
- int x;
-
- for (; addrlen > 0; addrlen--, addr++) {
- x = find_next_bit(*addr, nbits, bit);
- count += x - bit;
-
- if (x < nbits || count > max)
- return min(count, max);
-
- bit = 0;
- }
- return min(count, max);
-}
-
-/*
- * Sets or clears the run of count bits starting with bit.
- * Called with bitmap lock.
- */
-static int set_run(struct super_block *sb, int map,
- int nbits, int bit, int count, int set)
-{
- int i;
- int err;
- struct buffer_head *bh;
- struct omfs_sb_info *sbi = OMFS_SB(sb);
-
- err = -ENOMEM;
- bh = sb_bread(sb, clus_to_blk(sbi, sbi->s_bitmap_ino) + map);
- if (!bh)
- goto out;
-
- for (i = 0; i < count; i++, bit++) {
- if (bit >= nbits) {
- bit = 0;
- map++;
-
- mark_buffer_dirty(bh);
- brelse(bh);
- bh = sb_bread(sb,
- clus_to_blk(sbi, sbi->s_bitmap_ino) + map);
- if (!bh)
- goto out;
- }
- if (set) {
- set_bit(bit, sbi->s_imap[map]);
- set_bit(bit, (unsigned long *)bh->b_data);
- } else {
- clear_bit(bit, sbi->s_imap[map]);
- clear_bit(bit, (unsigned long *)bh->b_data);
- }
- }
- mark_buffer_dirty(bh);
- brelse(bh);
- err = 0;
-out:
- return err;
-}
-
-/*
- * Tries to allocate exactly one block. Returns true if successful.
- */
-int omfs_allocate_block(struct super_block *sb, u64 block)
-{
- struct buffer_head *bh;
- struct omfs_sb_info *sbi = OMFS_SB(sb);
- int bits_per_entry = 8 * sb->s_blocksize;
- unsigned int map, bit;
- int ret = 0;
- u64 tmp;
-
- tmp = block;
- bit = do_div(tmp, bits_per_entry);
- map = tmp;
-
- mutex_lock(&sbi->s_bitmap_lock);
- if (map >= sbi->s_imap_size || test_and_set_bit(bit, sbi->s_imap[map]))
- goto out;
-
- if (sbi->s_bitmap_ino > 0) {
- bh = sb_bread(sb, clus_to_blk(sbi, sbi->s_bitmap_ino) + map);
- if (!bh)
- goto out;
-
- set_bit(bit, (unsigned long *)bh->b_data);
- mark_buffer_dirty(bh);
- brelse(bh);
- }
- ret = 1;
-out:
- mutex_unlock(&sbi->s_bitmap_lock);
- return ret;
-}
-
-
-/*
- * Tries to allocate a set of blocks. The request size depends on the
- * type: for inodes, we must allocate sbi->s_mirrors blocks, and for file
- * blocks, we try to allocate sbi->s_clustersize, but can always get away
- * with just one block.
- */
-int omfs_allocate_range(struct super_block *sb,
- int min_request,
- int max_request,
- u64 *return_block,
- int *return_size)
-{
- struct omfs_sb_info *sbi = OMFS_SB(sb);
- int bits_per_entry = 8 * sb->s_blocksize;
- int ret = 0;
- int i, run, bit;
-
- mutex_lock(&sbi->s_bitmap_lock);
- for (i = 0; i < sbi->s_imap_size; i++) {
- bit = 0;
- while (bit < bits_per_entry) {
- bit = find_next_zero_bit(sbi->s_imap[i], bits_per_entry,
- bit);
-
- if (bit == bits_per_entry)
- break;
-
- run = count_run(&sbi->s_imap[i], bits_per_entry,
- sbi->s_imap_size-i, bit, max_request);
-
- if (run >= min_request)
- goto found;
- bit += run;
- }
- }
- ret = -ENOSPC;
- goto out;
-
-found:
- *return_block = i * bits_per_entry + bit;
- *return_size = run;
- ret = set_run(sb, i, bits_per_entry, bit, run, 1);
-
-out:
- mutex_unlock(&sbi->s_bitmap_lock);
- return ret;
-}
-
-/*
- * Clears count bits starting at a given block.
- */
-int omfs_clear_range(struct super_block *sb, u64 block, int count)
-{
- struct omfs_sb_info *sbi = OMFS_SB(sb);
- int bits_per_entry = 8 * sb->s_blocksize;
- u64 tmp;
- unsigned int map, bit;
- int ret;
-
- tmp = block;
- bit = do_div(tmp, bits_per_entry);
- map = tmp;
-
- if (map >= sbi->s_imap_size)
- return 0;
-
- mutex_lock(&sbi->s_bitmap_lock);
- ret = set_run(sb, map, bits_per_entry, bit, count, 0);
- mutex_unlock(&sbi->s_bitmap_lock);
- return ret;
-}