Commit 725d26d3 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Theodore Ts'o

ext4: Introduce ext4_lblk_t

This patch adds a new data type ext4_lblk_t to represent
the logical file blocks.

This is the preparatory patch to support large files in ext4
The follow up patch with convert the ext4_inode i_blocks to
represent the number of blocks in file system block size. This
changes makes it possible to have a block number 2**32 -1 which
will result in overflow if the block number is represented by
signed long. This patch convert all the block number to type
ext4_lblk_t which is typedef to __u32

Also remove dead code ext4_ext_walk_space
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMingming Cao <cmm@us.ibm.com>
Signed-off-by: default avatarEric Sandeen <sandeen@redhat.com>
parent a72d7f83
...@@ -124,7 +124,7 @@ static int ext4_readdir(struct file * filp, ...@@ -124,7 +124,7 @@ static int ext4_readdir(struct file * filp,
offset = filp->f_pos & (sb->s_blocksize - 1); offset = filp->f_pos & (sb->s_blocksize - 1);
while (!error && !stored && filp->f_pos < inode->i_size) { while (!error && !stored && filp->f_pos < inode->i_size) {
unsigned long blk = filp->f_pos >> EXT4_BLOCK_SIZE_BITS(sb); ext4_lblk_t blk = filp->f_pos >> EXT4_BLOCK_SIZE_BITS(sb);
struct buffer_head map_bh; struct buffer_head map_bh;
struct buffer_head *bh = NULL; struct buffer_head *bh = NULL;
......
This diff is collapsed.
...@@ -105,7 +105,7 @@ int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, ...@@ -105,7 +105,7 @@ int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode,
*/ */
static unsigned long blocks_for_truncate(struct inode *inode) static unsigned long blocks_for_truncate(struct inode *inode)
{ {
unsigned long needed; ext4_lblk_t needed;
needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9); needed = inode->i_blocks >> (inode->i_sb->s_blocksize_bits - 9);
...@@ -282,7 +282,8 @@ static int verify_chain(Indirect *from, Indirect *to) ...@@ -282,7 +282,8 @@ static int verify_chain(Indirect *from, Indirect *to)
*/ */
static int ext4_block_to_path(struct inode *inode, static int ext4_block_to_path(struct inode *inode,
long i_block, int offsets[4], int *boundary) ext4_lblk_t i_block,
ext4_lblk_t offsets[4], int *boundary)
{ {
int ptrs = EXT4_ADDR_PER_BLOCK(inode->i_sb); int ptrs = EXT4_ADDR_PER_BLOCK(inode->i_sb);
int ptrs_bits = EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb); int ptrs_bits = EXT4_ADDR_PER_BLOCK_BITS(inode->i_sb);
...@@ -349,7 +350,8 @@ static int ext4_block_to_path(struct inode *inode, ...@@ -349,7 +350,8 @@ static int ext4_block_to_path(struct inode *inode,
* or when it reads all @depth-1 indirect blocks successfully and finds * or when it reads all @depth-1 indirect blocks successfully and finds
* the whole chain, all way to the data (returns %NULL, *err == 0). * the whole chain, all way to the data (returns %NULL, *err == 0).
*/ */
static Indirect *ext4_get_branch(struct inode *inode, int depth, int *offsets, static Indirect *ext4_get_branch(struct inode *inode, int depth,
ext4_lblk_t *offsets,
Indirect chain[4], int *err) Indirect chain[4], int *err)
{ {
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
...@@ -445,7 +447,7 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind) ...@@ -445,7 +447,7 @@ static ext4_fsblk_t ext4_find_near(struct inode *inode, Indirect *ind)
* stores it in *@goal and returns zero. * stores it in *@goal and returns zero.
*/ */
static ext4_fsblk_t ext4_find_goal(struct inode *inode, long block, static ext4_fsblk_t ext4_find_goal(struct inode *inode, ext4_lblk_t block,
Indirect chain[4], Indirect *partial) Indirect chain[4], Indirect *partial)
{ {
struct ext4_block_alloc_info *block_i; struct ext4_block_alloc_info *block_i;
...@@ -590,7 +592,7 @@ failed_out: ...@@ -590,7 +592,7 @@ failed_out:
*/ */
static int ext4_alloc_branch(handle_t *handle, struct inode *inode, static int ext4_alloc_branch(handle_t *handle, struct inode *inode,
int indirect_blks, int *blks, ext4_fsblk_t goal, int indirect_blks, int *blks, ext4_fsblk_t goal,
int *offsets, Indirect *branch) ext4_lblk_t *offsets, Indirect *branch)
{ {
int blocksize = inode->i_sb->s_blocksize; int blocksize = inode->i_sb->s_blocksize;
int i, n = 0; int i, n = 0;
...@@ -680,7 +682,7 @@ failed: ...@@ -680,7 +682,7 @@ failed:
* chain to new block and return 0. * chain to new block and return 0.
*/ */
static int ext4_splice_branch(handle_t *handle, struct inode *inode, static int ext4_splice_branch(handle_t *handle, struct inode *inode,
long block, Indirect *where, int num, int blks) ext4_lblk_t block, Indirect *where, int num, int blks)
{ {
int i; int i;
int err = 0; int err = 0;
...@@ -784,12 +786,12 @@ err_out: ...@@ -784,12 +786,12 @@ err_out:
* return < 0, error case. * return < 0, error case.
*/ */
int ext4_get_blocks_handle(handle_t *handle, struct inode *inode, int ext4_get_blocks_handle(handle_t *handle, struct inode *inode,
sector_t iblock, unsigned long maxblocks, ext4_lblk_t iblock, unsigned long maxblocks,
struct buffer_head *bh_result, struct buffer_head *bh_result,
int create, int extend_disksize) int create, int extend_disksize)
{ {
int err = -EIO; int err = -EIO;
int offsets[4]; ext4_lblk_t offsets[4];
Indirect chain[4]; Indirect chain[4];
Indirect *partial; Indirect *partial;
ext4_fsblk_t goal; ext4_fsblk_t goal;
...@@ -803,7 +805,8 @@ int ext4_get_blocks_handle(handle_t *handle, struct inode *inode, ...@@ -803,7 +805,8 @@ int ext4_get_blocks_handle(handle_t *handle, struct inode *inode,
J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL)); J_ASSERT(!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL));
J_ASSERT(handle != NULL || create == 0); J_ASSERT(handle != NULL || create == 0);
depth = ext4_block_to_path(inode,iblock,offsets,&blocks_to_boundary); depth = ext4_block_to_path(inode, iblock, offsets,
&blocks_to_boundary);
if (depth == 0) if (depth == 0)
goto out; goto out;
...@@ -996,7 +999,7 @@ get_block: ...@@ -996,7 +999,7 @@ get_block:
* `handle' can be NULL if create is zero * `handle' can be NULL if create is zero
*/ */
struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode, struct buffer_head *ext4_getblk(handle_t *handle, struct inode *inode,
long block, int create, int *errp) ext4_lblk_t block, int create, int *errp)
{ {
struct buffer_head dummy; struct buffer_head dummy;
int fatal = 0, err; int fatal = 0, err;
...@@ -1063,7 +1066,7 @@ err: ...@@ -1063,7 +1066,7 @@ err:
} }
struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode, struct buffer_head *ext4_bread(handle_t *handle, struct inode *inode,
int block, int create, int *err) ext4_lblk_t block, int create, int *err)
{ {
struct buffer_head * bh; struct buffer_head * bh;
...@@ -1828,7 +1831,8 @@ int ext4_block_truncate_page(handle_t *handle, struct page *page, ...@@ -1828,7 +1831,8 @@ int ext4_block_truncate_page(handle_t *handle, struct page *page,
{ {
ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT; ext4_fsblk_t index = from >> PAGE_CACHE_SHIFT;
unsigned offset = from & (PAGE_CACHE_SIZE-1); unsigned offset = from & (PAGE_CACHE_SIZE-1);
unsigned blocksize, iblock, length, pos; unsigned blocksize, length, pos;
ext4_lblk_t iblock;
struct inode *inode = mapping->host; struct inode *inode = mapping->host;
struct buffer_head *bh; struct buffer_head *bh;
int err = 0; int err = 0;
...@@ -1964,7 +1968,7 @@ static inline int all_zeroes(__le32 *p, __le32 *q) ...@@ -1964,7 +1968,7 @@ static inline int all_zeroes(__le32 *p, __le32 *q)
* (no partially truncated stuff there). */ * (no partially truncated stuff there). */
static Indirect *ext4_find_shared(struct inode *inode, int depth, static Indirect *ext4_find_shared(struct inode *inode, int depth,
int offsets[4], Indirect chain[4], __le32 *top) ext4_lblk_t offsets[4], Indirect chain[4], __le32 *top)
{ {
Indirect *partial, *p; Indirect *partial, *p;
int k, err; int k, err;
...@@ -2289,12 +2293,12 @@ void ext4_truncate(struct inode *inode) ...@@ -2289,12 +2293,12 @@ void ext4_truncate(struct inode *inode)
__le32 *i_data = ei->i_data; __le32 *i_data = ei->i_data;
int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb); int addr_per_block = EXT4_ADDR_PER_BLOCK(inode->i_sb);
struct address_space *mapping = inode->i_mapping; struct address_space *mapping = inode->i_mapping;
int offsets[4]; ext4_lblk_t offsets[4];
Indirect chain[4]; Indirect chain[4];
Indirect *partial; Indirect *partial;
__le32 nr = 0; __le32 nr = 0;
int n; int n;
long last_block; ext4_lblk_t last_block;
unsigned blocksize = inode->i_sb->s_blocksize; unsigned blocksize = inode->i_sb->s_blocksize;
struct page *page; struct page *page;
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
static struct buffer_head *ext4_append(handle_t *handle, static struct buffer_head *ext4_append(handle_t *handle,
struct inode *inode, struct inode *inode,
u32 *block, int *err) ext4_lblk_t *block, int *err)
{ {
struct buffer_head *bh; struct buffer_head *bh;
...@@ -144,8 +144,8 @@ struct dx_map_entry ...@@ -144,8 +144,8 @@ struct dx_map_entry
u16 size; u16 size;
}; };
static inline unsigned dx_get_block (struct dx_entry *entry); static inline ext4_lblk_t dx_get_block(struct dx_entry *entry);
static void dx_set_block (struct dx_entry *entry, unsigned value); static void dx_set_block(struct dx_entry *entry, ext4_lblk_t value);
static inline unsigned dx_get_hash (struct dx_entry *entry); static inline unsigned dx_get_hash (struct dx_entry *entry);
static void dx_set_hash (struct dx_entry *entry, unsigned value); static void dx_set_hash (struct dx_entry *entry, unsigned value);
static unsigned dx_get_count (struct dx_entry *entries); static unsigned dx_get_count (struct dx_entry *entries);
...@@ -166,7 +166,8 @@ static void dx_sort_map(struct dx_map_entry *map, unsigned count); ...@@ -166,7 +166,8 @@ static void dx_sort_map(struct dx_map_entry *map, unsigned count);
static struct ext4_dir_entry_2 *dx_move_dirents (char *from, char *to, static struct ext4_dir_entry_2 *dx_move_dirents (char *from, char *to,
struct dx_map_entry *offsets, int count); struct dx_map_entry *offsets, int count);
static struct ext4_dir_entry_2* dx_pack_dirents (char *base, int size); static struct ext4_dir_entry_2* dx_pack_dirents (char *base, int size);
static void dx_insert_block (struct dx_frame *frame, u32 hash, u32 block); static void dx_insert_block(struct dx_frame *frame,
u32 hash, ext4_lblk_t block);
static int ext4_htree_next_block(struct inode *dir, __u32 hash, static int ext4_htree_next_block(struct inode *dir, __u32 hash,
struct dx_frame *frame, struct dx_frame *frame,
struct dx_frame *frames, struct dx_frame *frames,
...@@ -181,12 +182,12 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, ...@@ -181,12 +182,12 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
* Mask them off for now. * Mask them off for now.
*/ */
static inline unsigned dx_get_block (struct dx_entry *entry) static inline ext4_lblk_t dx_get_block(struct dx_entry *entry)
{ {
return le32_to_cpu(entry->block) & 0x00ffffff; return le32_to_cpu(entry->block) & 0x00ffffff;
} }
static inline void dx_set_block (struct dx_entry *entry, unsigned value) static inline void dx_set_block(struct dx_entry *entry, ext4_lblk_t value)
{ {
entry->block = cpu_to_le32(value); entry->block = cpu_to_le32(value);
} }
...@@ -243,8 +244,8 @@ static void dx_show_index (char * label, struct dx_entry *entries) ...@@ -243,8 +244,8 @@ static void dx_show_index (char * label, struct dx_entry *entries)
int i, n = dx_get_count (entries); int i, n = dx_get_count (entries);
printk("%s index ", label); printk("%s index ", label);
for (i = 0; i < n; i++) { for (i = 0; i < n; i++) {
printk("%x->%u ", i? dx_get_hash(entries + i) : printk("%x->%lu ", i? dx_get_hash(entries + i) :
0, dx_get_block(entries + i)); 0, (unsigned long)dx_get_block(entries + i));
} }
printk("\n"); printk("\n");
} }
...@@ -297,7 +298,8 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir, ...@@ -297,7 +298,8 @@ struct stats dx_show_entries(struct dx_hash_info *hinfo, struct inode *dir,
printk("%i indexed blocks...\n", count); printk("%i indexed blocks...\n", count);
for (i = 0; i < count; i++, entries++) for (i = 0; i < count; i++, entries++)
{ {
u32 block = dx_get_block(entries), hash = i? dx_get_hash(entries): 0; ext4_lblk_t block = dx_get_block(entries);
ext4_lblk_t hash = i ? dx_get_hash(entries): 0;
u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash; u32 range = i < count - 1? (dx_get_hash(entries + 1) - hash): ~hash;
struct stats stats; struct stats stats;
printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range); printk("%s%3u:%03u hash %8x/%8x ",levels?"":" ", i, block, hash, range);
...@@ -561,7 +563,7 @@ static inline struct ext4_dir_entry_2 *ext4_next_entry(struct ext4_dir_entry_2 * ...@@ -561,7 +563,7 @@ static inline struct ext4_dir_entry_2 *ext4_next_entry(struct ext4_dir_entry_2 *
* into the tree. If there is an error it is returned in err. * into the tree. If there is an error it is returned in err.
*/ */
static int htree_dirblock_to_tree(struct file *dir_file, static int htree_dirblock_to_tree(struct file *dir_file,
struct inode *dir, int block, struct inode *dir, ext4_lblk_t block,
struct dx_hash_info *hinfo, struct dx_hash_info *hinfo,
__u32 start_hash, __u32 start_minor_hash) __u32 start_hash, __u32 start_minor_hash)
{ {
...@@ -569,7 +571,8 @@ static int htree_dirblock_to_tree(struct file *dir_file, ...@@ -569,7 +571,8 @@ static int htree_dirblock_to_tree(struct file *dir_file,
struct ext4_dir_entry_2 *de, *top; struct ext4_dir_entry_2 *de, *top;
int err, count = 0; int err, count = 0;
dxtrace(printk("In htree dirblock_to_tree: block %d\n", block)); dxtrace(printk(KERN_INFO "In htree dirblock_to_tree: block %lu\n",
(unsigned long)block));
if (!(bh = ext4_bread (NULL, dir, block, 0, &err))) if (!(bh = ext4_bread (NULL, dir, block, 0, &err)))
return err; return err;
...@@ -621,9 +624,9 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash, ...@@ -621,9 +624,9 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
struct ext4_dir_entry_2 *de; struct ext4_dir_entry_2 *de;
struct dx_frame frames[2], *frame; struct dx_frame frames[2], *frame;
struct inode *dir; struct inode *dir;
int block, err; ext4_lblk_t block;
int count = 0; int count = 0;
int ret; int ret, err;
__u32 hashval; __u32 hashval;
dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash, dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash,
...@@ -753,7 +756,7 @@ static void dx_sort_map (struct dx_map_entry *map, unsigned count) ...@@ -753,7 +756,7 @@ static void dx_sort_map (struct dx_map_entry *map, unsigned count)
} while(more); } while(more);
} }
static void dx_insert_block(struct dx_frame *frame, u32 hash, u32 block) static void dx_insert_block(struct dx_frame *frame, u32 hash, ext4_lblk_t block)
{ {
struct dx_entry *entries = frame->entries; struct dx_entry *entries = frame->entries;
struct dx_entry *old = frame->at, *new = old + 1; struct dx_entry *old = frame->at, *new = old + 1;
...@@ -848,13 +851,14 @@ static struct buffer_head * ext4_find_entry (struct dentry *dentry, ...@@ -848,13 +851,14 @@ static struct buffer_head * ext4_find_entry (struct dentry *dentry,
struct super_block * sb; struct super_block * sb;
struct buffer_head * bh_use[NAMEI_RA_SIZE]; struct buffer_head * bh_use[NAMEI_RA_SIZE];
struct buffer_head * bh, *ret = NULL; struct buffer_head * bh, *ret = NULL;
unsigned long start, block, b; ext4_lblk_t start, block, b;
int ra_max = 0; /* Number of bh's in the readahead int ra_max = 0; /* Number of bh's in the readahead
buffer, bh_use[] */ buffer, bh_use[] */
int ra_ptr = 0; /* Current index into readahead int ra_ptr = 0; /* Current index into readahead
buffer */ buffer */
int num = 0; int num = 0;
int nblocks, i, err; ext4_lblk_t nblocks;
int i, err;
struct inode *dir = dentry->d_parent->d_inode; struct inode *dir = dentry->d_parent->d_inode;
int namelen; int namelen;
const u8 *name; const u8 *name;
...@@ -915,7 +919,8 @@ restart: ...@@ -915,7 +919,8 @@ restart:
if (!buffer_uptodate(bh)) { if (!buffer_uptodate(bh)) {
/* read error, skip block & hope for the best */ /* read error, skip block & hope for the best */
ext4_error(sb, __FUNCTION__, "reading directory #%lu " ext4_error(sb, __FUNCTION__, "reading directory #%lu "
"offset %lu", dir->i_ino, block); "offset %lu", dir->i_ino,
(unsigned long)block);
brelse(bh); brelse(bh);
goto next; goto next;
} }
...@@ -962,7 +967,7 @@ static struct buffer_head * ext4_dx_find_entry(struct dentry *dentry, ...@@ -962,7 +967,7 @@ static struct buffer_head * ext4_dx_find_entry(struct dentry *dentry,
struct dx_frame frames[2], *frame; struct dx_frame frames[2], *frame;
struct ext4_dir_entry_2 *de, *top; struct ext4_dir_entry_2 *de, *top;
struct buffer_head *bh; struct buffer_head *bh;
unsigned long block; ext4_lblk_t block;
int retval; int retval;
int namelen = dentry->d_name.len; int namelen = dentry->d_name.len;
const u8 *name = dentry->d_name.name; const u8 *name = dentry->d_name.name;
...@@ -1174,7 +1179,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, ...@@ -1174,7 +1179,7 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
unsigned blocksize = dir->i_sb->s_blocksize; unsigned blocksize = dir->i_sb->s_blocksize;
unsigned count, continued; unsigned count, continued;
struct buffer_head *bh2; struct buffer_head *bh2;
u32 newblock; ext4_lblk_t newblock;
u32 hash2; u32 hash2;
struct dx_map_entry *map; struct dx_map_entry *map;
char *data1 = (*bh)->b_data, *data2; char *data1 = (*bh)->b_data, *data2;
...@@ -1221,8 +1226,9 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir, ...@@ -1221,8 +1226,9 @@ static struct ext4_dir_entry_2 *do_split(handle_t *handle, struct inode *dir,
split = count - move; split = count - move;
hash2 = map[split].hash; hash2 = map[split].hash;
continued = hash2 == map[split - 1].hash; continued = hash2 == map[split - 1].hash;
dxtrace(printk("Split block %i at %x, %i/%i\n", dxtrace(printk(KERN_INFO "Split block %lu at %x, %i/%i\n",
dx_get_block(frame->at), hash2, split, count-split)); (unsigned long)dx_get_block(frame->at),
hash2, split, count-split));
/* Fancy dance to stay within two buffers */ /* Fancy dance to stay within two buffers */
de2 = dx_move_dirents(data1, data2, map + split, count - split); de2 = dx_move_dirents(data1, data2, map + split, count - split);
...@@ -1374,7 +1380,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry, ...@@ -1374,7 +1380,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
int retval; int retval;
unsigned blocksize; unsigned blocksize;
struct dx_hash_info hinfo; struct dx_hash_info hinfo;
u32 block; ext4_lblk_t block;
struct fake_dirent *fde; struct fake_dirent *fde;
blocksize = dir->i_sb->s_blocksize; blocksize = dir->i_sb->s_blocksize;
...@@ -1455,7 +1461,7 @@ static int ext4_add_entry (handle_t *handle, struct dentry *dentry, ...@@ -1455,7 +1461,7 @@ static int ext4_add_entry (handle_t *handle, struct dentry *dentry,
int retval; int retval;
int dx_fallback=0; int dx_fallback=0;
unsigned blocksize; unsigned blocksize;
u32 block, blocks; ext4_lblk_t block, blocks;
sb = dir->i_sb; sb = dir->i_sb;
blocksize = sb->s_blocksize; blocksize = sb->s_blocksize;
...@@ -1532,7 +1538,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry, ...@@ -1532,7 +1538,7 @@ static int ext4_dx_add_entry(handle_t *handle, struct dentry *dentry,
dx_get_count(entries), dx_get_limit(entries))); dx_get_count(entries), dx_get_limit(entries)));
/* Need to split index? */ /* Need to split index? */
if (dx_get_count(entries) == dx_get_limit(entries)) { if (dx_get_count(entries) == dx_get_limit(entries)) {
u32 newblock; ext4_lblk_t newblock;
unsigned icount = dx_get_count(entries); unsigned icount = dx_get_count(entries);
int levels = frame - frames; int levels = frame - frames;
struct dx_entry *entries2; struct dx_entry *entries2;
......
...@@ -2914,7 +2914,7 @@ static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data, ...@@ -2914,7 +2914,7 @@ static ssize_t ext4_quota_read(struct super_block *sb, int type, char *data,
size_t len, loff_t off) size_t len, loff_t off)
{ {
struct inode *inode = sb_dqopt(sb)->files[type]; struct inode *inode = sb_dqopt(sb)->files[type];
sector_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb);
int err = 0; int err = 0;
int offset = off & (sb->s_blocksize - 1); int offset = off & (sb->s_blocksize - 1);
int tocopy; int tocopy;
...@@ -2952,7 +2952,7 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type, ...@@ -2952,7 +2952,7 @@ static ssize_t ext4_quota_write(struct super_block *sb, int type,
const char *data, size_t len, loff_t off) const char *data, size_t len, loff_t off)
{ {
struct inode *inode = sb_dqopt(sb)->files[type]; struct inode *inode = sb_dqopt(sb)->files[type];
sector_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb); ext4_lblk_t blk = off >> EXT4_BLOCK_SIZE_BITS(sb);
int err = 0; int err = 0;
int offset = off & (sb->s_blocksize - 1); int offset = off & (sb->s_blocksize - 1);
int tocopy; int tocopy;
......
...@@ -935,11 +935,14 @@ extern unsigned long ext4_count_free (struct buffer_head *, unsigned); ...@@ -935,11 +935,14 @@ extern unsigned long ext4_count_free (struct buffer_head *, unsigned);
/* inode.c */ /* inode.c */
int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode, int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode,
struct buffer_head *bh, ext4_fsblk_t blocknr); struct buffer_head *bh, ext4_fsblk_t blocknr);
struct buffer_head * ext4_getblk (handle_t *, struct inode *, long, int, int *); struct buffer_head *ext4_getblk(handle_t *, struct inode *,
struct buffer_head * ext4_bread (handle_t *, struct inode *, int, int, int *); ext4_lblk_t, int, int *);
struct buffer_head *ext4_bread(handle_t *, struct inode *,
ext4_lblk_t, int, int *);
int ext4_get_blocks_handle(handle_t *handle, struct inode *inode, int ext4_get_blocks_handle(handle_t *handle, struct inode *inode,
sector_t iblock, unsigned long maxblocks, struct buffer_head *bh_result, ext4_lblk_t iblock, unsigned long maxblocks,
int create, int extend_disksize); struct buffer_head *bh_result,
int create, int extend_disksize);
extern void ext4_read_inode (struct inode *); extern void ext4_read_inode (struct inode *);
extern int ext4_write_inode (struct inode *, int); extern int ext4_write_inode (struct inode *, int);
...@@ -1068,7 +1071,7 @@ extern const struct inode_operations ext4_fast_symlink_inode_operations; ...@@ -1068,7 +1071,7 @@ extern const struct inode_operations ext4_fast_symlink_inode_operations;
extern int ext4_ext_tree_init(handle_t *handle, struct inode *); extern int ext4_ext_tree_init(handle_t *handle, struct inode *);
extern int ext4_ext_writepage_trans_blocks(struct inode *, int); extern int ext4_ext_writepage_trans_blocks(struct inode *, int);
extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode, extern int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
ext4_fsblk_t iblock, ext4_lblk_t iblock,
unsigned long max_blocks, struct buffer_head *bh_result, unsigned long max_blocks, struct buffer_head *bh_result,
int create, int extend_disksize); int create, int extend_disksize);
extern void ext4_ext_truncate(struct inode *, struct page *); extern void ext4_ext_truncate(struct inode *, struct page *);
...@@ -1081,11 +1084,17 @@ ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block, ...@@ -1081,11 +1084,17 @@ ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block,
unsigned long max_blocks, struct buffer_head *bh, unsigned long max_blocks, struct buffer_head *bh,
int create, int extend_disksize) int create, int extend_disksize)
{ {
if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) int retval;
return ext4_ext_get_blocks(handle, inode, block, max_blocks, if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) {
bh, create, extend_disksize); retval = ext4_ext_get_blocks(handle, inode,
return ext4_get_blocks_handle(handle, inode, block, max_blocks, bh, (ext4_lblk_t)block, max_blocks,
create, extend_disksize); bh, create, extend_disksize);
} else {
retval = ext4_get_blocks_handle(handle, inode,
(ext4_lblk_t)block, max_blocks,
bh, create, extend_disksize);
}
return retval;
} }
......
...@@ -124,20 +124,6 @@ struct ext4_ext_path { ...@@ -124,20 +124,6 @@ struct ext4_ext_path {
#define EXT4_EXT_CACHE_GAP 1 #define EXT4_EXT_CACHE_GAP 1
#define EXT4_EXT_CACHE_EXTENT 2 #define EXT4_EXT_CACHE_EXTENT 2
/*
* to be called by ext4_ext_walk_space()
* negative retcode - error
* positive retcode - signal for ext4_ext_walk_space(), see below
* callback must return valid extent (passed or newly created)
*/
typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *,
struct ext4_ext_cache *,
void *);
#define EXT_CONTINUE 0
#define EXT_BREAK 1
#define EXT_REPEAT 2
#define EXT_MAX_BLOCK 0xffffffff #define EXT_MAX_BLOCK 0xffffffff
...@@ -233,8 +219,7 @@ extern int ext4_ext_try_to_merge(struct inode *inode, ...@@ -233,8 +219,7 @@ extern int ext4_ext_try_to_merge(struct inode *inode,
struct ext4_extent *); struct ext4_extent *);
extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *); extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *);
extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *); extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *);
extern int ext4_ext_walk_space(struct inode *, unsigned long, unsigned long, ext_prepare_callback, void *); extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t,
extern struct ext4_ext_path * ext4_ext_find_extent(struct inode *, int, struct ext4_ext_path *); struct ext4_ext_path *);
#endif /* _LINUX_EXT4_EXTENTS */ #endif /* _LINUX_EXT4_EXTENTS */
...@@ -27,6 +27,9 @@ typedef int ext4_grpblk_t; ...@@ -27,6 +27,9 @@ typedef int ext4_grpblk_t;
/* data type for filesystem-wide blocks number */ /* data type for filesystem-wide blocks number */
typedef unsigned long long ext4_fsblk_t; typedef unsigned long long ext4_fsblk_t;
/* data type for file logical block number */
typedef __u32 ext4_lblk_t;
struct ext4_reserve_window { struct ext4_reserve_window {
ext4_fsblk_t _rsv_start; /* First byte reserved */ ext4_fsblk_t _rsv_start; /* First byte reserved */
ext4_fsblk_t _rsv_end; /* Last byte reserved or 0 */ ext4_fsblk_t _rsv_end; /* Last byte reserved or 0 */
...@@ -48,7 +51,7 @@ struct ext4_block_alloc_info { ...@@ -48,7 +51,7 @@ struct ext4_block_alloc_info {
* most-recently-allocated block in this file. * most-recently-allocated block in this file.
* We use this for detecting linearly ascending allocation requests. * We use this for detecting linearly ascending allocation requests.
*/ */
__u32 last_alloc_logical_block; ext4_lblk_t last_alloc_logical_block;
/* /*
* Was i_next_alloc_goal in ext4_inode_info * Was i_next_alloc_goal in ext4_inode_info
* is the *physical* companion to i_next_alloc_block. * is the *physical* companion to i_next_alloc_block.
...@@ -67,7 +70,7 @@ struct ext4_block_alloc_info { ...@@ -67,7 +70,7 @@ struct ext4_block_alloc_info {
*/ */
struct ext4_ext_cache { struct ext4_ext_cache {
ext4_fsblk_t ec_start; ext4_fsblk_t ec_start;
__u32 ec_block; ext4_lblk_t ec_block;
__u32 ec_len; /* must be 32bit to return holes */ __u32 ec_len; /* must be 32bit to return holes */
__u32 ec_type; __u32 ec_type;
}; };
...@@ -95,7 +98,7 @@ struct ext4_inode_info { ...@@ -95,7 +98,7 @@ struct ext4_inode_info {
/* block reservation info */ /* block reservation info */
struct ext4_block_alloc_info *i_block_alloc_info; struct ext4_block_alloc_info *i_block_alloc_info;
__u32 i_dir_start_lookup; ext4_lblk_t i_dir_start_lookup;
#ifdef CONFIG_EXT4DEV_FS_XATTR #ifdef CONFIG_EXT4DEV_FS_XATTR
/* /*
* Extended attributes can be read independently of the main file * Extended attributes can be read independently of the main file
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment