diff options
Diffstat (limited to 'ANDROID_3.4.5/fs/omfs')
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/Kconfig | 13 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/Makefile | 4 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/bitmap.c | 193 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/dir.c | 475 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/file.c | 378 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/inode.c | 583 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/omfs.h | 68 | ||||
-rw-r--r-- | ANDROID_3.4.5/fs/omfs/omfs_fs.h | 81 |
8 files changed, 0 insertions, 1795 deletions
diff --git a/ANDROID_3.4.5/fs/omfs/Kconfig b/ANDROID_3.4.5/fs/omfs/Kconfig deleted file mode 100644 index b1b9a0ab..00000000 --- a/ANDROID_3.4.5/fs/omfs/Kconfig +++ /dev/null @@ -1,13 +0,0 @@ -config OMFS_FS - tristate "SonicBlue Optimized MPEG File System support" - depends on BLOCK - select CRC_ITU_T - help - This is the proprietary file system used by the Rio Karma music - player and ReplayTV DVR. Despite the name, this filesystem is not - more efficient than a standard FS for MPEG files, in fact likely - the opposite is true. Say Y if you have either of these devices - and wish to mount its disk. - - To compile this file system support as a module, choose M here: the - module will be called omfs. If unsure, say N. diff --git a/ANDROID_3.4.5/fs/omfs/Makefile b/ANDROID_3.4.5/fs/omfs/Makefile deleted file mode 100644 index 8b82b63f..00000000 --- a/ANDROID_3.4.5/fs/omfs/Makefile +++ /dev/null @@ -1,4 +0,0 @@ - -obj-$(CONFIG_OMFS_FS) += omfs.o - -omfs-y := bitmap.o dir.o file.o inode.o 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; -} diff --git a/ANDROID_3.4.5/fs/omfs/dir.c b/ANDROID_3.4.5/fs/omfs/dir.c deleted file mode 100644 index f00576ec..00000000 --- a/ANDROID_3.4.5/fs/omfs/dir.c +++ /dev/null @@ -1,475 +0,0 @@ -/* - * OMFS (as used by RIO Karma) directory operations. - * Copyright (C) 2005 Bob Copeland <me@bobcopeland.com> - * Released under GPL v2. - */ - -#include <linux/fs.h> -#include <linux/ctype.h> -#include <linux/buffer_head.h> -#include "omfs.h" - -static int omfs_hash(const char *name, int namelen, int mod) -{ - int i, hash = 0; - for (i = 0; i < namelen; i++) - hash ^= tolower(name[i]) << (i % 24); - return hash % mod; -} - -/* - * Finds the bucket for a given name and reads the containing block; - * *ofs is set to the offset of the first list entry. - */ -static struct buffer_head *omfs_get_bucket(struct inode *dir, - const char *name, int namelen, int *ofs) -{ - int nbuckets = (dir->i_size - OMFS_DIR_START)/8; - int bucket = omfs_hash(name, namelen, nbuckets); - - *ofs = OMFS_DIR_START + bucket * 8; - return omfs_bread(dir->i_sb, dir->i_ino); -} - -static struct buffer_head *omfs_scan_list(struct inode *dir, u64 block, - const char *name, int namelen, - u64 *prev_block) -{ - struct buffer_head *bh; - struct omfs_inode *oi; - int err = -ENOENT; - *prev_block = ~0; - - while (block != ~0) { - bh = omfs_bread(dir->i_sb, block); - if (!bh) { - err = -EIO; - goto err; - } - - oi = (struct omfs_inode *) bh->b_data; - if (omfs_is_bad(OMFS_SB(dir->i_sb), &oi->i_head, block)) { - brelse(bh); - goto err; - } - - if (strncmp(oi->i_name, name, namelen) == 0) - return bh; - - *prev_block = block; - block = be64_to_cpu(oi->i_sibling); - brelse(bh); - } -err: - return ERR_PTR(err); -} - -static struct buffer_head *omfs_find_entry(struct inode *dir, - const char *name, int namelen) -{ - struct buffer_head *bh; - int ofs; - u64 block, dummy; - - bh = omfs_get_bucket(dir, name, namelen, &ofs); - if (!bh) - return ERR_PTR(-EIO); - - block = be64_to_cpu(*((__be64 *) &bh->b_data[ofs])); - brelse(bh); - - return omfs_scan_list(dir, block, name, namelen, &dummy); -} - -int omfs_make_empty(struct inode *inode, struct super_block *sb) -{ - struct omfs_sb_info *sbi = OMFS_SB(sb); - struct buffer_head *bh; - struct omfs_inode *oi; - - bh = omfs_bread(sb, inode->i_ino); - if (!bh) - return -ENOMEM; - - memset(bh->b_data, 0, sizeof(struct omfs_inode)); - - if (S_ISDIR(inode->i_mode)) { - memset(&bh->b_data[OMFS_DIR_START], 0xff, - sbi->s_sys_blocksize - OMFS_DIR_START); - } else - omfs_make_empty_table(bh, OMFS_EXTENT_START); - - oi = (struct omfs_inode *) bh->b_data; - oi->i_head.h_self = cpu_to_be64(inode->i_ino); - oi->i_sibling = ~cpu_to_be64(0ULL); - - mark_buffer_dirty(bh); - brelse(bh); - return 0; -} - -static int omfs_add_link(struct dentry *dentry, struct inode *inode) -{ - struct inode *dir = dentry->d_parent->d_inode; - const char *name = dentry->d_name.name; - int namelen = dentry->d_name.len; - struct omfs_inode *oi; - struct buffer_head *bh; - u64 block; - __be64 *entry; - int ofs; - - /* just prepend to head of queue in proper bucket */ - bh = omfs_get_bucket(dir, name, namelen, &ofs); - if (!bh) - goto out; - - entry = (__be64 *) &bh->b_data[ofs]; - block = be64_to_cpu(*entry); - *entry = cpu_to_be64(inode->i_ino); - mark_buffer_dirty(bh); - brelse(bh); - - /* now set the sibling and parent pointers on the new inode */ - bh = omfs_bread(dir->i_sb, inode->i_ino); - if (!bh) - goto out; - - oi = (struct omfs_inode *) bh->b_data; - memcpy(oi->i_name, name, namelen); - memset(oi->i_name + namelen, 0, OMFS_NAMELEN - namelen); - oi->i_sibling = cpu_to_be64(block); - oi->i_parent = cpu_to_be64(dir->i_ino); - mark_buffer_dirty(bh); - brelse(bh); - - dir->i_ctime = CURRENT_TIME_SEC; - - /* mark affected inodes dirty to rebuild checksums */ - mark_inode_dirty(dir); - mark_inode_dirty(inode); - return 0; -out: - return -ENOMEM; -} - -static int omfs_delete_entry(struct dentry *dentry) -{ - struct inode *dir = dentry->d_parent->d_inode; - struct inode *dirty; - const char *name = dentry->d_name.name; - int namelen = dentry->d_name.len; - struct omfs_inode *oi; - struct buffer_head *bh, *bh2; - __be64 *entry, next; - u64 block, prev; - int ofs; - int err = -ENOMEM; - - /* delete the proper node in the bucket's linked list */ - bh = omfs_get_bucket(dir, name, namelen, &ofs); - if (!bh) - goto out; - - entry = (__be64 *) &bh->b_data[ofs]; - block = be64_to_cpu(*entry); - - bh2 = omfs_scan_list(dir, block, name, namelen, &prev); - if (IS_ERR(bh2)) { - err = PTR_ERR(bh2); - goto out_free_bh; - } - - oi = (struct omfs_inode *) bh2->b_data; - next = oi->i_sibling; - brelse(bh2); - - if (prev != ~0) { - /* found in middle of list, get list ptr */ - brelse(bh); - bh = omfs_bread(dir->i_sb, prev); - if (!bh) - goto out; - - oi = (struct omfs_inode *) bh->b_data; - entry = &oi->i_sibling; - } - - *entry = next; - mark_buffer_dirty(bh); - - if (prev != ~0) { - dirty = omfs_iget(dir->i_sb, prev); - if (!IS_ERR(dirty)) { - mark_inode_dirty(dirty); - iput(dirty); - } - } - - err = 0; -out_free_bh: - brelse(bh); -out: - return err; -} - -static int omfs_dir_is_empty(struct inode *inode) -{ - int nbuckets = (inode->i_size - OMFS_DIR_START) / 8; - struct buffer_head *bh; - u64 *ptr; - int i; - - bh = omfs_bread(inode->i_sb, inode->i_ino); - - if (!bh) - return 0; - - ptr = (u64 *) &bh->b_data[OMFS_DIR_START]; - - for (i = 0; i < nbuckets; i++, ptr++) - if (*ptr != ~0) - break; - - brelse(bh); - return *ptr != ~0; -} - -static int omfs_remove(struct inode *dir, struct dentry *dentry) -{ - struct inode *inode = dentry->d_inode; - int ret; - - - if (S_ISDIR(inode->i_mode) && - !omfs_dir_is_empty(inode)) - return -ENOTEMPTY; - - ret = omfs_delete_entry(dentry); - if (ret) - return ret; - - clear_nlink(inode); - mark_inode_dirty(inode); - mark_inode_dirty(dir); - return 0; -} - -static int omfs_add_node(struct inode *dir, struct dentry *dentry, umode_t mode) -{ - int err; - struct inode *inode = omfs_new_inode(dir, mode); - - if (IS_ERR(inode)) - return PTR_ERR(inode); - - err = omfs_make_empty(inode, dir->i_sb); - if (err) - goto out_free_inode; - - err = omfs_add_link(dentry, inode); - if (err) - goto out_free_inode; - - d_instantiate(dentry, inode); - return 0; - -out_free_inode: - iput(inode); - return err; -} - -static int omfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) -{ - return omfs_add_node(dir, dentry, mode | S_IFDIR); -} - -static int omfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - struct nameidata *nd) -{ - return omfs_add_node(dir, dentry, mode | S_IFREG); -} - -static struct dentry *omfs_lookup(struct inode *dir, struct dentry *dentry, - struct nameidata *nd) -{ - struct buffer_head *bh; - struct inode *inode = NULL; - - if (dentry->d_name.len > OMFS_NAMELEN) - return ERR_PTR(-ENAMETOOLONG); - - bh = omfs_find_entry(dir, dentry->d_name.name, dentry->d_name.len); - if (!IS_ERR(bh)) { - struct omfs_inode *oi = (struct omfs_inode *)bh->b_data; - ino_t ino = be64_to_cpu(oi->i_head.h_self); - brelse(bh); - inode = omfs_iget(dir->i_sb, ino); - if (IS_ERR(inode)) - return ERR_CAST(inode); - } - d_add(dentry, inode); - return NULL; -} - -/* sanity check block's self pointer */ -int omfs_is_bad(struct omfs_sb_info *sbi, struct omfs_header *header, - u64 fsblock) -{ - int is_bad; - u64 ino = be64_to_cpu(header->h_self); - is_bad = ((ino != fsblock) || (ino < sbi->s_root_ino) || - (ino > sbi->s_num_blocks)); - - if (is_bad) - printk(KERN_WARNING "omfs: bad hash chain detected\n"); - - return is_bad; -} - -static int omfs_fill_chain(struct file *filp, void *dirent, filldir_t filldir, - u64 fsblock, int hindex) -{ - struct inode *dir = filp->f_dentry->d_inode; - struct buffer_head *bh; - struct omfs_inode *oi; - u64 self; - int res = 0; - unsigned char d_type; - - /* follow chain in this bucket */ - while (fsblock != ~0) { - bh = omfs_bread(dir->i_sb, fsblock); - if (!bh) - goto out; - - oi = (struct omfs_inode *) bh->b_data; - if (omfs_is_bad(OMFS_SB(dir->i_sb), &oi->i_head, fsblock)) { - brelse(bh); - goto out; - } - - self = fsblock; - fsblock = be64_to_cpu(oi->i_sibling); - - /* skip visited nodes */ - if (hindex) { - hindex--; - brelse(bh); - continue; - } - - d_type = (oi->i_type == OMFS_DIR) ? DT_DIR : DT_REG; - - res = filldir(dirent, oi->i_name, strnlen(oi->i_name, - OMFS_NAMELEN), filp->f_pos, self, d_type); - brelse(bh); - if (res < 0) - break; - filp->f_pos++; - } -out: - return res; -} - -static int omfs_rename(struct inode *old_dir, struct dentry *old_dentry, - struct inode *new_dir, struct dentry *new_dentry) -{ - struct inode *new_inode = new_dentry->d_inode; - struct inode *old_inode = old_dentry->d_inode; - int err; - - if (new_inode) { - /* overwriting existing file/dir */ - err = omfs_remove(new_dir, new_dentry); - if (err) - goto out; - } - - /* since omfs locates files by name, we need to unlink _before_ - * adding the new link or we won't find the old one */ - err = omfs_delete_entry(old_dentry); - if (err) - goto out; - - mark_inode_dirty(old_dir); - err = omfs_add_link(new_dentry, old_inode); - if (err) - goto out; - - old_inode->i_ctime = CURRENT_TIME_SEC; - mark_inode_dirty(old_inode); -out: - return err; -} - -static int omfs_readdir(struct file *filp, void *dirent, filldir_t filldir) -{ - struct inode *dir = filp->f_dentry->d_inode; - struct buffer_head *bh; - loff_t offset, res; - unsigned int hchain, hindex; - int nbuckets; - u64 fsblock; - int ret = -EINVAL; - - if (filp->f_pos >> 32) - goto success; - - switch ((unsigned long) filp->f_pos) { - case 0: - if (filldir(dirent, ".", 1, 0, dir->i_ino, DT_DIR) < 0) - goto success; - filp->f_pos++; - /* fall through */ - case 1: - if (filldir(dirent, "..", 2, 1, - parent_ino(filp->f_dentry), DT_DIR) < 0) - goto success; - filp->f_pos = 1 << 20; - /* fall through */ - } - - nbuckets = (dir->i_size - OMFS_DIR_START) / 8; - - /* high 12 bits store bucket + 1 and low 20 bits store hash index */ - hchain = (filp->f_pos >> 20) - 1; - hindex = filp->f_pos & 0xfffff; - - bh = omfs_bread(dir->i_sb, dir->i_ino); - if (!bh) - goto out; - - offset = OMFS_DIR_START + hchain * 8; - - for (; hchain < nbuckets; hchain++, offset += 8) { - fsblock = be64_to_cpu(*((__be64 *) &bh->b_data[offset])); - - res = omfs_fill_chain(filp, dirent, filldir, fsblock, hindex); - hindex = 0; - if (res < 0) - break; - - filp->f_pos = (hchain+2) << 20; - } - brelse(bh); -success: - ret = 0; -out: - return ret; -} - -const struct inode_operations omfs_dir_inops = { - .lookup = omfs_lookup, - .mkdir = omfs_mkdir, - .rename = omfs_rename, - .create = omfs_create, - .unlink = omfs_remove, - .rmdir = omfs_remove, -}; - -const struct file_operations omfs_dir_operations = { - .read = generic_read_dir, - .readdir = omfs_readdir, - .llseek = generic_file_llseek, -}; diff --git a/ANDROID_3.4.5/fs/omfs/file.c b/ANDROID_3.4.5/fs/omfs/file.c deleted file mode 100644 index 2c6d9525..00000000 --- a/ANDROID_3.4.5/fs/omfs/file.c +++ /dev/null @@ -1,378 +0,0 @@ -/* - * OMFS (as used by RIO Karma) file operations. - * Copyright (C) 2005 Bob Copeland <me@bobcopeland.com> - * Released under GPL v2. - */ - -#include <linux/module.h> -#include <linux/fs.h> -#include <linux/buffer_head.h> -#include <linux/mpage.h> -#include "omfs.h" - -static u32 omfs_max_extents(struct omfs_sb_info *sbi, int offset) -{ - return (sbi->s_sys_blocksize - offset - - sizeof(struct omfs_extent)) / - sizeof(struct omfs_extent_entry) + 1; -} - -void omfs_make_empty_table(struct buffer_head *bh, int offset) -{ - struct omfs_extent *oe = (struct omfs_extent *) &bh->b_data[offset]; - - oe->e_next = ~cpu_to_be64(0ULL); - oe->e_extent_count = cpu_to_be32(1), - oe->e_fill = cpu_to_be32(0x22), - oe->e_entry.e_cluster = ~cpu_to_be64(0ULL); - oe->e_entry.e_blocks = ~cpu_to_be64(0ULL); -} - -int omfs_shrink_inode(struct inode *inode) -{ - struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb); - struct omfs_extent *oe; - struct omfs_extent_entry *entry; - struct buffer_head *bh; - u64 next, last; - u32 extent_count; - u32 max_extents; - int ret; - - /* traverse extent table, freeing each entry that is greater - * than inode->i_size; - */ - next = inode->i_ino; - - /* only support truncate -> 0 for now */ - ret = -EIO; - if (inode->i_size != 0) - goto out; - - bh = omfs_bread(inode->i_sb, next); - if (!bh) - goto out; - - oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); - max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); - - for (;;) { - - if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) - goto out_brelse; - - extent_count = be32_to_cpu(oe->e_extent_count); - - if (extent_count > max_extents) - goto out_brelse; - - last = next; - next = be64_to_cpu(oe->e_next); - entry = &oe->e_entry; - - /* ignore last entry as it is the terminator */ - for (; extent_count > 1; extent_count--) { - u64 start, count; - start = be64_to_cpu(entry->e_cluster); - count = be64_to_cpu(entry->e_blocks); - - omfs_clear_range(inode->i_sb, start, (int) count); - entry++; - } - omfs_make_empty_table(bh, (char *) oe - bh->b_data); - mark_buffer_dirty(bh); - brelse(bh); - - if (last != inode->i_ino) - omfs_clear_range(inode->i_sb, last, sbi->s_mirrors); - - if (next == ~0) - break; - - bh = omfs_bread(inode->i_sb, next); - if (!bh) - goto out; - oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); - max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); - } - ret = 0; -out: - return ret; -out_brelse: - brelse(bh); - return ret; -} - -static void omfs_truncate(struct inode *inode) -{ - omfs_shrink_inode(inode); - mark_inode_dirty(inode); -} - -/* - * Add new blocks to the current extent, or create new entries/continuations - * as necessary. - */ -static int omfs_grow_extent(struct inode *inode, struct omfs_extent *oe, - u64 *ret_block) -{ - struct omfs_extent_entry *terminator; - struct omfs_extent_entry *entry = &oe->e_entry; - struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb); - u32 extent_count = be32_to_cpu(oe->e_extent_count); - u64 new_block = 0; - u32 max_count; - int new_count; - int ret = 0; - - /* reached the end of the extent table with no blocks mapped. - * there are three possibilities for adding: grow last extent, - * add a new extent to the current extent table, and add a - * continuation inode. in last two cases need an allocator for - * sbi->s_cluster_size - */ - - /* TODO: handle holes */ - - /* should always have a terminator */ - if (extent_count < 1) - return -EIO; - - /* trivially grow current extent, if next block is not taken */ - terminator = entry + extent_count - 1; - if (extent_count > 1) { - entry = terminator-1; - new_block = be64_to_cpu(entry->e_cluster) + - be64_to_cpu(entry->e_blocks); - - if (omfs_allocate_block(inode->i_sb, new_block)) { - entry->e_blocks = - cpu_to_be64(be64_to_cpu(entry->e_blocks) + 1); - terminator->e_blocks = ~(cpu_to_be64( - be64_to_cpu(~terminator->e_blocks) + 1)); - goto out; - } - } - max_count = omfs_max_extents(sbi, OMFS_EXTENT_START); - - /* TODO: add a continuation block here */ - if (be32_to_cpu(oe->e_extent_count) > max_count-1) - return -EIO; - - /* try to allocate a new cluster */ - ret = omfs_allocate_range(inode->i_sb, 1, sbi->s_clustersize, - &new_block, &new_count); - if (ret) - goto out_fail; - - /* copy terminator down an entry */ - entry = terminator; - terminator++; - memcpy(terminator, entry, sizeof(struct omfs_extent_entry)); - - entry->e_cluster = cpu_to_be64(new_block); - entry->e_blocks = cpu_to_be64((u64) new_count); - - terminator->e_blocks = ~(cpu_to_be64( - be64_to_cpu(~terminator->e_blocks) + (u64) new_count)); - - /* write in new entry */ - oe->e_extent_count = cpu_to_be32(1 + be32_to_cpu(oe->e_extent_count)); - -out: - *ret_block = new_block; -out_fail: - return ret; -} - -/* - * Scans across the directory table for a given file block number. - * If block not found, return 0. - */ -static sector_t find_block(struct inode *inode, struct omfs_extent_entry *ent, - sector_t block, int count, int *left) -{ - /* count > 1 because of terminator */ - sector_t searched = 0; - for (; count > 1; count--) { - int numblocks = clus_to_blk(OMFS_SB(inode->i_sb), - be64_to_cpu(ent->e_blocks)); - - if (block >= searched && - block < searched + numblocks) { - /* - * found it at cluster + (block - searched) - * numblocks - (block - searched) is remainder - */ - *left = numblocks - (block - searched); - return clus_to_blk(OMFS_SB(inode->i_sb), - be64_to_cpu(ent->e_cluster)) + - block - searched; - } - searched += numblocks; - ent++; - } - return 0; -} - -static int omfs_get_block(struct inode *inode, sector_t block, - struct buffer_head *bh_result, int create) -{ - struct buffer_head *bh; - sector_t next, offset; - int ret; - u64 uninitialized_var(new_block); - u32 max_extents; - int extent_count; - struct omfs_extent *oe; - struct omfs_extent_entry *entry; - struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb); - int max_blocks = bh_result->b_size >> inode->i_blkbits; - int remain; - - ret = -EIO; - bh = omfs_bread(inode->i_sb, inode->i_ino); - if (!bh) - goto out; - - oe = (struct omfs_extent *)(&bh->b_data[OMFS_EXTENT_START]); - max_extents = omfs_max_extents(sbi, OMFS_EXTENT_START); - next = inode->i_ino; - - for (;;) { - - if (omfs_is_bad(sbi, (struct omfs_header *) bh->b_data, next)) - goto out_brelse; - - extent_count = be32_to_cpu(oe->e_extent_count); - next = be64_to_cpu(oe->e_next); - entry = &oe->e_entry; - - if (extent_count > max_extents) - goto out_brelse; - - offset = find_block(inode, entry, block, extent_count, &remain); - if (offset > 0) { - ret = 0; - map_bh(bh_result, inode->i_sb, offset); - if (remain > max_blocks) - remain = max_blocks; - bh_result->b_size = (remain << inode->i_blkbits); - goto out_brelse; - } - if (next == ~0) - break; - - brelse(bh); - bh = omfs_bread(inode->i_sb, next); - if (!bh) - goto out; - oe = (struct omfs_extent *) (&bh->b_data[OMFS_EXTENT_CONT]); - max_extents = omfs_max_extents(sbi, OMFS_EXTENT_CONT); - } - if (create) { - ret = omfs_grow_extent(inode, oe, &new_block); - if (ret == 0) { - mark_buffer_dirty(bh); - mark_inode_dirty(inode); - map_bh(bh_result, inode->i_sb, - clus_to_blk(sbi, new_block)); - } - } -out_brelse: - brelse(bh); -out: - return ret; -} - -static int omfs_readpage(struct file *file, struct page *page) -{ - return block_read_full_page(page, omfs_get_block); -} - -static int omfs_readpages(struct file *file, struct address_space *mapping, - struct list_head *pages, unsigned nr_pages) -{ - return mpage_readpages(mapping, pages, nr_pages, omfs_get_block); -} - -static int omfs_writepage(struct page *page, struct writeback_control *wbc) -{ - return block_write_full_page(page, omfs_get_block, wbc); -} - -static int -omfs_writepages(struct address_space *mapping, struct writeback_control *wbc) -{ - return mpage_writepages(mapping, wbc, omfs_get_block); -} - -static int omfs_write_begin(struct file *file, struct address_space *mapping, - loff_t pos, unsigned len, unsigned flags, - struct page **pagep, void **fsdata) -{ - int ret; - - ret = block_write_begin(mapping, pos, len, flags, pagep, - omfs_get_block); - if (unlikely(ret)) { - loff_t isize = mapping->host->i_size; - if (pos + len > isize) - vmtruncate(mapping->host, isize); - } - - return ret; -} - -static sector_t omfs_bmap(struct address_space *mapping, sector_t block) -{ - return generic_block_bmap(mapping, block, omfs_get_block); -} - -const struct file_operations omfs_file_operations = { - .llseek = generic_file_llseek, - .read = do_sync_read, - .write = do_sync_write, - .aio_read = generic_file_aio_read, - .aio_write = generic_file_aio_write, - .mmap = generic_file_mmap, - .fsync = generic_file_fsync, - .splice_read = generic_file_splice_read, -}; - -static int omfs_setattr(struct dentry *dentry, struct iattr *attr) -{ - struct inode *inode = dentry->d_inode; - int error; - - error = inode_change_ok(inode, attr); - if (error) - return error; - - if ((attr->ia_valid & ATTR_SIZE) && - attr->ia_size != i_size_read(inode)) { - error = vmtruncate(inode, attr->ia_size); - if (error) - return error; - } - - setattr_copy(inode, attr); - mark_inode_dirty(inode); - return 0; -} - -const struct inode_operations omfs_file_inops = { - .setattr = omfs_setattr, - .truncate = omfs_truncate -}; - -const struct address_space_operations omfs_aops = { - .readpage = omfs_readpage, - .readpages = omfs_readpages, - .writepage = omfs_writepage, - .writepages = omfs_writepages, - .write_begin = omfs_write_begin, - .write_end = generic_write_end, - .bmap = omfs_bmap, -}; - diff --git a/ANDROID_3.4.5/fs/omfs/inode.c b/ANDROID_3.4.5/fs/omfs/inode.c deleted file mode 100644 index dbc84222..00000000 --- a/ANDROID_3.4.5/fs/omfs/inode.c +++ /dev/null @@ -1,583 +0,0 @@ -/* - * Optimized MPEG FS - inode and super operations. - * Copyright (C) 2006 Bob Copeland <me@bobcopeland.com> - * Released under GPL v2. - */ -#include <linux/module.h> -#include <linux/sched.h> -#include <linux/slab.h> -#include <linux/fs.h> -#include <linux/vfs.h> -#include <linux/parser.h> -#include <linux/buffer_head.h> -#include <linux/vmalloc.h> -#include <linux/writeback.h> -#include <linux/crc-itu-t.h> -#include "omfs.h" - -MODULE_AUTHOR("Bob Copeland <me@bobcopeland.com>"); -MODULE_DESCRIPTION("OMFS (ReplayTV/Karma) Filesystem for Linux"); -MODULE_LICENSE("GPL"); - -struct buffer_head *omfs_bread(struct super_block *sb, sector_t block) -{ - struct omfs_sb_info *sbi = OMFS_SB(sb); - if (block >= sbi->s_num_blocks) - return NULL; - - return sb_bread(sb, clus_to_blk(sbi, block)); -} - -struct inode *omfs_new_inode(struct inode *dir, umode_t mode) -{ - struct inode *inode; - u64 new_block; - int err; - int len; - struct omfs_sb_info *sbi = OMFS_SB(dir->i_sb); - - inode = new_inode(dir->i_sb); - if (!inode) - return ERR_PTR(-ENOMEM); - - err = omfs_allocate_range(dir->i_sb, sbi->s_mirrors, sbi->s_mirrors, - &new_block, &len); - if (err) - goto fail; - - inode->i_ino = new_block; - inode_init_owner(inode, NULL, mode); - inode->i_mapping->a_ops = &omfs_aops; - - inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME; - switch (mode & S_IFMT) { - case S_IFDIR: - inode->i_op = &omfs_dir_inops; - inode->i_fop = &omfs_dir_operations; - inode->i_size = sbi->s_sys_blocksize; - inc_nlink(inode); - break; - case S_IFREG: - inode->i_op = &omfs_file_inops; - inode->i_fop = &omfs_file_operations; - inode->i_size = 0; - break; - } - - insert_inode_hash(inode); - mark_inode_dirty(inode); - return inode; -fail: - make_bad_inode(inode); - iput(inode); - return ERR_PTR(err); -} - -/* - * Update the header checksums for a dirty inode based on its contents. - * Caller is expected to hold the buffer head underlying oi and mark it - * dirty. - */ -static void omfs_update_checksums(struct omfs_inode *oi) -{ - int xor, i, ofs = 0, count; - u16 crc = 0; - unsigned char *ptr = (unsigned char *) oi; - - count = be32_to_cpu(oi->i_head.h_body_size); - ofs = sizeof(struct omfs_header); - - crc = crc_itu_t(crc, ptr + ofs, count); - oi->i_head.h_crc = cpu_to_be16(crc); - - xor = ptr[0]; - for (i = 1; i < OMFS_XOR_COUNT; i++) - xor ^= ptr[i]; - - oi->i_head.h_check_xor = xor; -} - -static int __omfs_write_inode(struct inode *inode, int wait) -{ - struct omfs_inode *oi; - struct omfs_sb_info *sbi = OMFS_SB(inode->i_sb); - struct buffer_head *bh, *bh2; - u64 ctime; - int i; - int ret = -EIO; - int sync_failed = 0; - - /* get current inode since we may have written sibling ptrs etc. */ - bh = omfs_bread(inode->i_sb, inode->i_ino); - if (!bh) - goto out; - - oi = (struct omfs_inode *) bh->b_data; - - oi->i_head.h_self = cpu_to_be64(inode->i_ino); - if (S_ISDIR(inode->i_mode)) - oi->i_type = OMFS_DIR; - else if (S_ISREG(inode->i_mode)) - oi->i_type = OMFS_FILE; - else { - printk(KERN_WARNING "omfs: unknown file type: %d\n", - inode->i_mode); - goto out_brelse; - } - - oi->i_head.h_body_size = cpu_to_be32(sbi->s_sys_blocksize - - sizeof(struct omfs_header)); - oi->i_head.h_version = 1; - oi->i_head.h_type = OMFS_INODE_NORMAL; - oi->i_head.h_magic = OMFS_IMAGIC; - oi->i_size = cpu_to_be64(inode->i_size); - - ctime = inode->i_ctime.tv_sec * 1000LL + - ((inode->i_ctime.tv_nsec + 999)/1000); - oi->i_ctime = cpu_to_be64(ctime); - - omfs_update_checksums(oi); - - mark_buffer_dirty(bh); - if (wait) { - sync_dirty_buffer(bh); - if (buffer_req(bh) && !buffer_uptodate(bh)) - sync_failed = 1; - } - - /* if mirroring writes, copy to next fsblock */ - for (i = 1; i < sbi->s_mirrors; i++) { - bh2 = omfs_bread(inode->i_sb, inode->i_ino + i); - if (!bh2) - goto out_brelse; - - memcpy(bh2->b_data, bh->b_data, bh->b_size); - mark_buffer_dirty(bh2); - if (wait) { - sync_dirty_buffer(bh2); - if (buffer_req(bh2) && !buffer_uptodate(bh2)) - sync_failed = 1; - } - brelse(bh2); - } - ret = (sync_failed) ? -EIO : 0; -out_brelse: - brelse(bh); -out: - return ret; -} - -static int omfs_write_inode(struct inode *inode, struct writeback_control *wbc) -{ - return __omfs_write_inode(inode, wbc->sync_mode == WB_SYNC_ALL); -} - -int omfs_sync_inode(struct inode *inode) -{ - return __omfs_write_inode(inode, 1); -} - -/* - * called when an entry is deleted, need to clear the bits in the - * bitmaps. - */ -static void omfs_evict_inode(struct inode *inode) -{ - truncate_inode_pages(&inode->i_data, 0); - end_writeback(inode); - - if (inode->i_nlink) - return; - - if (S_ISREG(inode->i_mode)) { - inode->i_size = 0; - omfs_shrink_inode(inode); - } - - omfs_clear_range(inode->i_sb, inode->i_ino, 2); -} - -struct inode *omfs_iget(struct super_block *sb, ino_t ino) -{ - struct omfs_sb_info *sbi = OMFS_SB(sb); - struct omfs_inode *oi; - struct buffer_head *bh; - u64 ctime; - unsigned long nsecs; - struct inode *inode; - - inode = iget_locked(sb, ino); - if (!inode) - return ERR_PTR(-ENOMEM); - if (!(inode->i_state & I_NEW)) - return inode; - - bh = omfs_bread(inode->i_sb, ino); - if (!bh) - goto iget_failed; - - oi = (struct omfs_inode *)bh->b_data; - - /* check self */ - if (ino != be64_to_cpu(oi->i_head.h_self)) - goto fail_bh; - - inode->i_uid = sbi->s_uid; - inode->i_gid = sbi->s_gid; - - ctime = be64_to_cpu(oi->i_ctime); - nsecs = do_div(ctime, 1000) * 1000L; - - inode->i_atime.tv_sec = ctime; - inode->i_mtime.tv_sec = ctime; - inode->i_ctime.tv_sec = ctime; - inode->i_atime.tv_nsec = nsecs; - inode->i_mtime.tv_nsec = nsecs; - inode->i_ctime.tv_nsec = nsecs; - - inode->i_mapping->a_ops = &omfs_aops; - - switch (oi->i_type) { - case OMFS_DIR: - inode->i_mode = S_IFDIR | (S_IRWXUGO & ~sbi->s_dmask); - inode->i_op = &omfs_dir_inops; - inode->i_fop = &omfs_dir_operations; - inode->i_size = sbi->s_sys_blocksize; - inc_nlink(inode); - break; - case OMFS_FILE: - inode->i_mode = S_IFREG | (S_IRWXUGO & ~sbi->s_fmask); - inode->i_fop = &omfs_file_operations; - inode->i_size = be64_to_cpu(oi->i_size); - break; - } - brelse(bh); - unlock_new_inode(inode); - return inode; -fail_bh: - brelse(bh); -iget_failed: - iget_failed(inode); - return ERR_PTR(-EIO); -} - -static void omfs_put_super(struct super_block *sb) -{ - struct omfs_sb_info *sbi = OMFS_SB(sb); - kfree(sbi->s_imap); - kfree(sbi); - sb->s_fs_info = NULL; -} - -static int omfs_statfs(struct dentry *dentry, struct kstatfs *buf) -{ - struct super_block *s = dentry->d_sb; - struct omfs_sb_info *sbi = OMFS_SB(s); - u64 id = huge_encode_dev(s->s_bdev->bd_dev); - - buf->f_type = OMFS_MAGIC; - buf->f_bsize = sbi->s_blocksize; - buf->f_blocks = sbi->s_num_blocks; - buf->f_files = sbi->s_num_blocks; - buf->f_namelen = OMFS_NAMELEN; - buf->f_fsid.val[0] = (u32)id; - buf->f_fsid.val[1] = (u32)(id >> 32); - - buf->f_bfree = buf->f_bavail = buf->f_ffree = - omfs_count_free(s); - - return 0; -} - -static const struct super_operations omfs_sops = { - .write_inode = omfs_write_inode, - .evict_inode = omfs_evict_inode, - .put_super = omfs_put_super, - .statfs = omfs_statfs, - .show_options = generic_show_options, -}; - -/* - * For Rio Karma, there is an on-disk free bitmap whose location is - * stored in the root block. For ReplayTV, there is no such free bitmap - * so we have to walk the tree. Both inodes and file data are allocated - * from the same map. This array can be big (300k) so we allocate - * in units of the blocksize. - */ -static int omfs_get_imap(struct super_block *sb) -{ - int bitmap_size; - int array_size; - int count; - struct omfs_sb_info *sbi = OMFS_SB(sb); - struct buffer_head *bh; - unsigned long **ptr; - sector_t block; - - bitmap_size = DIV_ROUND_UP(sbi->s_num_blocks, 8); - array_size = DIV_ROUND_UP(bitmap_size, sb->s_blocksize); - - if (sbi->s_bitmap_ino == ~0ULL) - goto out; - - sbi->s_imap_size = array_size; - sbi->s_imap = kzalloc(array_size * sizeof(unsigned long *), GFP_KERNEL); - if (!sbi->s_imap) - goto nomem; - - block = clus_to_blk(sbi, sbi->s_bitmap_ino); - if (block >= sbi->s_num_blocks) - goto nomem; - - ptr = sbi->s_imap; - for (count = bitmap_size; count > 0; count -= sb->s_blocksize) { - bh = sb_bread(sb, block++); - if (!bh) - goto nomem_free; - *ptr = kmalloc(sb->s_blocksize, GFP_KERNEL); - if (!*ptr) { - brelse(bh); - goto nomem_free; - } - memcpy(*ptr, bh->b_data, sb->s_blocksize); - if (count < sb->s_blocksize) - memset((void *)*ptr + count, 0xff, - sb->s_blocksize - count); - brelse(bh); - ptr++; - } -out: - return 0; - -nomem_free: - for (count = 0; count < array_size; count++) - kfree(sbi->s_imap[count]); - - kfree(sbi->s_imap); -nomem: - sbi->s_imap = NULL; - sbi->s_imap_size = 0; - return -ENOMEM; -} - -enum { - Opt_uid, Opt_gid, Opt_umask, Opt_dmask, Opt_fmask -}; - -static const match_table_t tokens = { - {Opt_uid, "uid=%u"}, - {Opt_gid, "gid=%u"}, - {Opt_umask, "umask=%o"}, - {Opt_dmask, "dmask=%o"}, - {Opt_fmask, "fmask=%o"}, -}; - -static int parse_options(char *options, struct omfs_sb_info *sbi) -{ - char *p; - substring_t args[MAX_OPT_ARGS]; - int option; - - if (!options) - return 1; - - while ((p = strsep(&options, ",")) != NULL) { - int token; - if (!*p) - continue; - - token = match_token(p, tokens, args); - switch (token) { - case Opt_uid: - if (match_int(&args[0], &option)) - return 0; - sbi->s_uid = option; - break; - case Opt_gid: - if (match_int(&args[0], &option)) - return 0; - sbi->s_gid = option; - break; - case Opt_umask: - if (match_octal(&args[0], &option)) - return 0; - sbi->s_fmask = sbi->s_dmask = option; - break; - case Opt_dmask: - if (match_octal(&args[0], &option)) - return 0; - sbi->s_dmask = option; - break; - case Opt_fmask: - if (match_octal(&args[0], &option)) - return 0; - sbi->s_fmask = option; - break; - default: - return 0; - } - } - return 1; -} - -static int omfs_fill_super(struct super_block *sb, void *data, int silent) -{ - struct buffer_head *bh, *bh2; - struct omfs_super_block *omfs_sb; - struct omfs_root_block *omfs_rb; - struct omfs_sb_info *sbi; - struct inode *root; - int ret = -EINVAL; - - save_mount_options(sb, (char *) data); - - sbi = kzalloc(sizeof(struct omfs_sb_info), GFP_KERNEL); - if (!sbi) - return -ENOMEM; - - sb->s_fs_info = sbi; - - sbi->s_uid = current_uid(); - sbi->s_gid = current_gid(); - sbi->s_dmask = sbi->s_fmask = current_umask(); - - if (!parse_options((char *) data, sbi)) - goto end; - - sb->s_maxbytes = 0xffffffff; - - sb_set_blocksize(sb, 0x200); - - bh = sb_bread(sb, 0); - if (!bh) - goto end; - - omfs_sb = (struct omfs_super_block *)bh->b_data; - - if (omfs_sb->s_magic != cpu_to_be32(OMFS_MAGIC)) { - if (!silent) - printk(KERN_ERR "omfs: Invalid superblock (%x)\n", - omfs_sb->s_magic); - goto out_brelse_bh; - } - sb->s_magic = OMFS_MAGIC; - - sbi->s_num_blocks = be64_to_cpu(omfs_sb->s_num_blocks); - sbi->s_blocksize = be32_to_cpu(omfs_sb->s_blocksize); - sbi->s_mirrors = be32_to_cpu(omfs_sb->s_mirrors); - sbi->s_root_ino = be64_to_cpu(omfs_sb->s_root_block); - sbi->s_sys_blocksize = be32_to_cpu(omfs_sb->s_sys_blocksize); - mutex_init(&sbi->s_bitmap_lock); - - if (sbi->s_sys_blocksize > PAGE_SIZE) { - printk(KERN_ERR "omfs: sysblock size (%d) is out of range\n", - sbi->s_sys_blocksize); - goto out_brelse_bh; - } - - if (sbi->s_blocksize < sbi->s_sys_blocksize || - sbi->s_blocksize > OMFS_MAX_BLOCK_SIZE) { - printk(KERN_ERR "omfs: block size (%d) is out of range\n", - sbi->s_blocksize); - goto out_brelse_bh; - } - - /* - * Use sys_blocksize as the fs block since it is smaller than a - * page while the fs blocksize can be larger. - */ - sb_set_blocksize(sb, sbi->s_sys_blocksize); - - /* - * ...and the difference goes into a shift. sys_blocksize is always - * a power of two factor of blocksize. - */ - sbi->s_block_shift = get_bitmask_order(sbi->s_blocksize) - - get_bitmask_order(sbi->s_sys_blocksize); - - bh2 = omfs_bread(sb, be64_to_cpu(omfs_sb->s_root_block)); - if (!bh2) - goto out_brelse_bh; - - omfs_rb = (struct omfs_root_block *)bh2->b_data; - - sbi->s_bitmap_ino = be64_to_cpu(omfs_rb->r_bitmap); - sbi->s_clustersize = be32_to_cpu(omfs_rb->r_clustersize); - - if (sbi->s_num_blocks != be64_to_cpu(omfs_rb->r_num_blocks)) { - printk(KERN_ERR "omfs: block count discrepancy between " - "super and root blocks (%llx, %llx)\n", - (unsigned long long)sbi->s_num_blocks, - (unsigned long long)be64_to_cpu(omfs_rb->r_num_blocks)); - goto out_brelse_bh2; - } - - if (sbi->s_bitmap_ino != ~0ULL && - sbi->s_bitmap_ino > sbi->s_num_blocks) { - printk(KERN_ERR "omfs: free space bitmap location is corrupt " - "(%llx, total blocks %llx)\n", - (unsigned long long) sbi->s_bitmap_ino, - (unsigned long long) sbi->s_num_blocks); - goto out_brelse_bh2; - } - if (sbi->s_clustersize < 1 || - sbi->s_clustersize > OMFS_MAX_CLUSTER_SIZE) { - printk(KERN_ERR "omfs: cluster size out of range (%d)", - sbi->s_clustersize); - goto out_brelse_bh2; - } - - ret = omfs_get_imap(sb); - if (ret) - goto out_brelse_bh2; - - sb->s_op = &omfs_sops; - - root = omfs_iget(sb, be64_to_cpu(omfs_rb->r_root_dir)); - if (IS_ERR(root)) { - ret = PTR_ERR(root); - goto out_brelse_bh2; - } - - sb->s_root = d_make_root(root); - if (!sb->s_root) - goto out_brelse_bh2; - printk(KERN_DEBUG "omfs: Mounted volume %s\n", omfs_rb->r_name); - - ret = 0; -out_brelse_bh2: - brelse(bh2); -out_brelse_bh: - brelse(bh); -end: - if (ret) - kfree(sbi); - return ret; -} - -static struct dentry *omfs_mount(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data) -{ - return mount_bdev(fs_type, flags, dev_name, data, omfs_fill_super); -} - -static struct file_system_type omfs_fs_type = { - .owner = THIS_MODULE, - .name = "omfs", - .mount = omfs_mount, - .kill_sb = kill_block_super, - .fs_flags = FS_REQUIRES_DEV, -}; - -static int __init init_omfs_fs(void) -{ - return register_filesystem(&omfs_fs_type); -} - -static void __exit exit_omfs_fs(void) -{ - unregister_filesystem(&omfs_fs_type); -} - -module_init(init_omfs_fs); -module_exit(exit_omfs_fs); diff --git a/ANDROID_3.4.5/fs/omfs/omfs.h b/ANDROID_3.4.5/fs/omfs/omfs.h deleted file mode 100644 index 8941f12c..00000000 --- a/ANDROID_3.4.5/fs/omfs/omfs.h +++ /dev/null @@ -1,68 +0,0 @@ -#ifndef _OMFS_H -#define _OMFS_H - -#include <linux/module.h> -#include <linux/fs.h> - -#include "omfs_fs.h" - -/* In-memory structures */ -struct omfs_sb_info { - u64 s_num_blocks; - u64 s_bitmap_ino; - u64 s_root_ino; - u32 s_blocksize; - u32 s_mirrors; - u32 s_sys_blocksize; - u32 s_clustersize; - int s_block_shift; - unsigned long **s_imap; - int s_imap_size; - struct mutex s_bitmap_lock; - int s_uid; - int s_gid; - int s_dmask; - int s_fmask; -}; - -/* convert a cluster number to a scaled block number */ -static inline sector_t clus_to_blk(struct omfs_sb_info *sbi, sector_t block) -{ - return block << sbi->s_block_shift; -} - -static inline struct omfs_sb_info *OMFS_SB(struct super_block *sb) -{ - return sb->s_fs_info; -} - -/* bitmap.c */ -extern unsigned long omfs_count_free(struct super_block *sb); -extern int omfs_allocate_block(struct super_block *sb, u64 block); -extern int omfs_allocate_range(struct super_block *sb, int min_request, - int max_request, u64 *return_block, int *return_size); -extern int omfs_clear_range(struct super_block *sb, u64 block, int count); - -/* dir.c */ -extern const struct file_operations omfs_dir_operations; -extern const struct inode_operations omfs_dir_inops; -extern int omfs_make_empty(struct inode *inode, struct super_block *sb); -extern int omfs_is_bad(struct omfs_sb_info *sbi, struct omfs_header *header, - u64 fsblock); - -/* file.c */ -extern const struct file_operations omfs_file_operations; -extern const struct inode_operations omfs_file_inops; -extern const struct address_space_operations omfs_aops; -extern void omfs_make_empty_table(struct buffer_head *bh, int offset); -extern int omfs_shrink_inode(struct inode *inode); - -/* inode.c */ -extern struct buffer_head *omfs_bread(struct super_block *sb, sector_t block); -extern struct inode *omfs_iget(struct super_block *sb, ino_t inode); -extern struct inode *omfs_new_inode(struct inode *dir, umode_t mode); -extern int omfs_reserve_block(struct super_block *sb, sector_t block); -extern int omfs_find_empty_block(struct super_block *sb, int mode, ino_t *ino); -extern int omfs_sync_inode(struct inode *inode); - -#endif diff --git a/ANDROID_3.4.5/fs/omfs/omfs_fs.h b/ANDROID_3.4.5/fs/omfs/omfs_fs.h deleted file mode 100644 index ee5e4327..00000000 --- a/ANDROID_3.4.5/fs/omfs/omfs_fs.h +++ /dev/null @@ -1,81 +0,0 @@ -#ifndef _OMFS_FS_H -#define _OMFS_FS_H - -/* OMFS On-disk structures */ - -#define OMFS_MAGIC 0xC2993D87 -#define OMFS_IMAGIC 0xD2 - -#define OMFS_DIR 'D' -#define OMFS_FILE 'F' -#define OMFS_INODE_NORMAL 'e' -#define OMFS_INODE_CONTINUATION 'c' -#define OMFS_INODE_SYSTEM 's' -#define OMFS_NAMELEN 256 -#define OMFS_DIR_START 0x1b8 -#define OMFS_EXTENT_START 0x1d0 -#define OMFS_EXTENT_CONT 0x40 -#define OMFS_XOR_COUNT 19 -#define OMFS_MAX_BLOCK_SIZE 8192 -#define OMFS_MAX_CLUSTER_SIZE 8 - -struct omfs_super_block { - char s_fill1[256]; - __be64 s_root_block; /* block number of omfs_root_block */ - __be64 s_num_blocks; /* total number of FS blocks */ - __be32 s_magic; /* OMFS_MAGIC */ - __be32 s_blocksize; /* size of a block */ - __be32 s_mirrors; /* # of mirrors of system blocks */ - __be32 s_sys_blocksize; /* size of non-data blocks */ -}; - -struct omfs_header { - __be64 h_self; /* FS block where this is located */ - __be32 h_body_size; /* size of useful data after header */ - __be16 h_crc; /* crc-ccitt of body_size bytes */ - char h_fill1[2]; - u8 h_version; /* version, always 1 */ - char h_type; /* OMFS_INODE_X */ - u8 h_magic; /* OMFS_IMAGIC */ - u8 h_check_xor; /* XOR of header bytes before this */ - __be32 h_fill2; -}; - -struct omfs_root_block { - struct omfs_header r_head; /* header */ - __be64 r_fill1; - __be64 r_num_blocks; /* total number of FS blocks */ - __be64 r_root_dir; /* block # of root directory */ - __be64 r_bitmap; /* block # of free space bitmap */ - __be32 r_blocksize; /* size of a block */ - __be32 r_clustersize; /* size allocated for data blocks */ - __be64 r_mirrors; /* # of mirrors of system blocks */ - char r_name[OMFS_NAMELEN]; /* partition label */ -}; - -struct omfs_inode { - struct omfs_header i_head; /* header */ - __be64 i_parent; /* parent containing this inode */ - __be64 i_sibling; /* next inode in hash bucket */ - __be64 i_ctime; /* ctime, in milliseconds */ - char i_fill1[35]; - char i_type; /* OMFS_[DIR,FILE] */ - __be32 i_fill2; - char i_fill3[64]; - char i_name[OMFS_NAMELEN]; /* filename */ - __be64 i_size; /* size of file, in bytes */ -}; - -struct omfs_extent_entry { - __be64 e_cluster; /* start location of a set of blocks */ - __be64 e_blocks; /* number of blocks after e_cluster */ -}; - -struct omfs_extent { - __be64 e_next; /* next extent table location */ - __be32 e_extent_count; /* total # extents in this table */ - __be32 e_fill; - struct omfs_extent_entry e_entry; /* start of extent entries */ -}; - -#endif |