Commit d6859bfc authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] ext3: cleanups and WARN_ON()

- Clean up a few little layout things and comments.

- Add a WARN_ON to a case which I was wondering about.

- Tune up some inlines.

Cc: Mingming Cao <cmm@us.ibm.com>
Cc: Badari Pulavarty <pbadari@us.ibm.com>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 1d8fa7a2
...@@ -44,16 +44,16 @@ static int ext3_writepage_trans_blocks(struct inode *inode); ...@@ -44,16 +44,16 @@ static int ext3_writepage_trans_blocks(struct inode *inode);
/* /*
* Test whether an inode is a fast symlink. * Test whether an inode is a fast symlink.
*/ */
static inline int ext3_inode_is_fast_symlink(struct inode *inode) static int ext3_inode_is_fast_symlink(struct inode *inode)
{ {
int ea_blocks = EXT3_I(inode)->i_file_acl ? int ea_blocks = EXT3_I(inode)->i_file_acl ?
(inode->i_sb->s_blocksize >> 9) : 0; (inode->i_sb->s_blocksize >> 9) : 0;
return (S_ISLNK(inode->i_mode) && return (S_ISLNK(inode->i_mode) && inode->i_blocks - ea_blocks == 0);
inode->i_blocks - ea_blocks == 0);
} }
/* The ext3 forget function must perform a revoke if we are freeing data /*
* The ext3 forget function must perform a revoke if we are freeing data
* which has been journaled. Metadata (eg. indirect blocks) must be * which has been journaled. Metadata (eg. indirect blocks) must be
* revoked in all cases. * revoked in all cases.
* *
...@@ -61,10 +61,8 @@ static inline int ext3_inode_is_fast_symlink(struct inode *inode) ...@@ -61,10 +61,8 @@ static inline int ext3_inode_is_fast_symlink(struct inode *inode)
* but there may still be a record of it in the journal, and that record * but there may still be a record of it in the journal, and that record
* still needs to be revoked. * still needs to be revoked.
*/ */
int ext3_forget(handle_t *handle, int is_metadata, struct inode *inode,
int ext3_forget(handle_t *handle, int is_metadata, struct buffer_head *bh, int blocknr)
struct inode *inode, struct buffer_head *bh,
int blocknr)
{ {
int err; int err;
...@@ -104,10 +102,9 @@ int ext3_forget(handle_t *handle, int is_metadata, ...@@ -104,10 +102,9 @@ int ext3_forget(handle_t *handle, int is_metadata,
} }
/* /*
* Work out how many blocks we need to progress with the next chunk of a * Work out how many blocks we need to proceed with the next chunk of a
* truncate transaction. * truncate transaction.
*/ */
static unsigned long blocks_for_truncate(struct inode *inode) static unsigned long blocks_for_truncate(struct inode *inode)
{ {
unsigned long needed; unsigned long needed;
...@@ -141,7 +138,6 @@ static unsigned long blocks_for_truncate(struct inode *inode) ...@@ -141,7 +138,6 @@ static unsigned long blocks_for_truncate(struct inode *inode)
* extend fails, we need to propagate the failure up and restart the * extend fails, we need to propagate the failure up and restart the
* transaction in the top-level truncate loop. --sct * transaction in the top-level truncate loop. --sct
*/ */
static handle_t *start_transaction(struct inode *inode) static handle_t *start_transaction(struct inode *inode)
{ {
handle_t *result; handle_t *result;
...@@ -194,9 +190,11 @@ void ext3_delete_inode (struct inode * inode) ...@@ -194,9 +190,11 @@ void ext3_delete_inode (struct inode * inode)
handle = start_transaction(inode); handle = start_transaction(inode);
if (IS_ERR(handle)) { if (IS_ERR(handle)) {
/* If we're going to skip the normal cleanup, we still /*
* need to make sure that the in-core orphan linked list * If we're going to skip the normal cleanup, we still need to
* is properly cleaned up. */ * make sure that the in-core orphan linked list is properly
* cleaned up.
*/
ext3_orphan_del(NULL, inode); ext3_orphan_del(NULL, inode);
goto no_delete; goto no_delete;
} }
...@@ -247,7 +245,7 @@ static inline void add_chain(Indirect *p, struct buffer_head *bh, __le32 *v) ...@@ -247,7 +245,7 @@ static inline void add_chain(Indirect *p, struct buffer_head *bh, __le32 *v)
p->bh = bh; p->bh = bh;
} }
static inline int verify_chain(Indirect *from, Indirect *to) static int verify_chain(Indirect *from, Indirect *to)
{ {
while (from <= to && from->key == *from->p) while (from <= to && from->key == *from->p)
from++; from++;
...@@ -317,7 +315,7 @@ static int ext3_block_to_path(struct inode *inode, ...@@ -317,7 +315,7 @@ static int ext3_block_to_path(struct inode *inode,
offsets[n++] = i_block & (ptrs - 1); offsets[n++] = i_block & (ptrs - 1);
final = ptrs; final = ptrs;
} else { } else {
ext3_warning (inode->i_sb, "ext3_block_to_path", "block > big"); ext3_warning(inode->i_sb, "ext3_block_to_path", "block > big");
} }
if (boundary) if (boundary)
*boundary = final - 1 - (i_block & (ptrs - 1)); *boundary = final - 1 - (i_block & (ptrs - 1));
...@@ -409,7 +407,6 @@ static Indirect *ext3_get_branch(struct inode *inode, int depth, int *offsets, ...@@ -409,7 +407,6 @@ static Indirect *ext3_get_branch(struct inode *inode, int depth, int *offsets,
* *
* Caller must make sure that @ind is valid and will stay that way. * Caller must make sure that @ind is valid and will stay that way.
*/ */
static unsigned long ext3_find_near(struct inode *inode, Indirect *ind) static unsigned long ext3_find_near(struct inode *inode, Indirect *ind)
{ {
struct ext3_inode_info *ei = EXT3_I(inode); struct ext3_inode_info *ei = EXT3_I(inode);
...@@ -419,17 +416,18 @@ static unsigned long ext3_find_near(struct inode *inode, Indirect *ind) ...@@ -419,17 +416,18 @@ static unsigned long ext3_find_near(struct inode *inode, Indirect *ind)
unsigned long colour; unsigned long colour;
/* Try to find previous block */ /* Try to find previous block */
for (p = ind->p - 1; p >= start; p--) for (p = ind->p - 1; p >= start; p--) {
if (*p) if (*p)
return le32_to_cpu(*p); return le32_to_cpu(*p);
}
/* No such thing, so let's try location of indirect block */ /* No such thing, so let's try location of indirect block */
if (ind->bh) if (ind->bh)
return ind->bh->b_blocknr; return ind->bh->b_blocknr;
/* /*
* It is going to be refered from inode itself? OK, just put it into * It is going to be referred to from the inode itself? OK, just put it
* the same cylinder group then. * into the same cylinder group then.
*/ */
bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) + bg_start = (ei->i_block_group * EXT3_BLOCKS_PER_GROUP(inode->i_sb)) +
le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block); le32_to_cpu(EXT3_SB(inode->i_sb)->s_es->s_first_data_block);
...@@ -453,7 +451,9 @@ static unsigned long ext3_find_near(struct inode *inode, Indirect *ind) ...@@ -453,7 +451,9 @@ static unsigned long ext3_find_near(struct inode *inode, Indirect *ind)
static unsigned long ext3_find_goal(struct inode *inode, long block, static unsigned long ext3_find_goal(struct inode *inode, long block,
Indirect chain[4], Indirect *partial) Indirect chain[4], Indirect *partial)
{ {
struct ext3_block_alloc_info *block_i = EXT3_I(inode)->i_block_alloc_info; struct ext3_block_alloc_info *block_i;
block_i = EXT3_I(inode)->i_block_alloc_info;
/* /*
* try the heuristic for sequential allocation, * try the heuristic for sequential allocation,
...@@ -466,6 +466,7 @@ static unsigned long ext3_find_goal(struct inode *inode, long block, ...@@ -466,6 +466,7 @@ static unsigned long ext3_find_goal(struct inode *inode, long block,
return ext3_find_near(inode, partial); return ext3_find_near(inode, partial);
} }
/** /**
* ext3_blks_to_allocate: Look up the block map and count the number * ext3_blks_to_allocate: Look up the block map and count the number
* of direct blocks need to be allocated for the given branch. * of direct blocks need to be allocated for the given branch.
...@@ -478,8 +479,7 @@ static unsigned long ext3_find_goal(struct inode *inode, long block, ...@@ -478,8 +479,7 @@ static unsigned long ext3_find_goal(struct inode *inode, long block,
* return the total number of blocks to be allocate, including the * return the total number of blocks to be allocate, including the
* direct and indirect blocks. * direct and indirect blocks.
*/ */
static int static int ext3_blks_to_allocate(Indirect *branch, int k, unsigned long blks,
ext3_blks_to_allocate(Indirect * branch, int k, unsigned long blks,
int blocks_to_boundary) int blocks_to_boundary)
{ {
unsigned long count = 0; unsigned long count = 0;
...@@ -489,7 +489,7 @@ ext3_blks_to_allocate(Indirect * branch, int k, unsigned long blks, ...@@ -489,7 +489,7 @@ ext3_blks_to_allocate(Indirect * branch, int k, unsigned long blks,
* then it's clear blocks on that path have not allocated * then it's clear blocks on that path have not allocated
*/ */
if (k > 0) { if (k > 0) {
/* right now don't hanel cross boundary allocation */ /* right now we don't handle cross boundary allocation */
if (blks < blocks_to_boundary + 1) if (blks < blocks_to_boundary + 1)
count += blks; count += blks;
else else
...@@ -538,7 +538,7 @@ static int ext3_alloc_blocks(handle_t *handle, struct inode *inode, ...@@ -538,7 +538,7 @@ static int ext3_alloc_blocks(handle_t *handle, struct inode *inode,
while (1) { while (1) {
count = target; count = target;
/* allocating blocks for indirect blocks and direct blocks */ /* allocating blocks for indirect blocks and direct blocks */
current_block = ext3_new_blocks(handle, inode, goal, &count, err); current_block = ext3_new_blocks(handle,inode,goal,&count,err);
if (*err) if (*err)
goto failed_out; goto failed_out;
...@@ -591,7 +591,6 @@ static int ext3_alloc_blocks(handle_t *handle, struct inode *inode, ...@@ -591,7 +591,6 @@ static int ext3_alloc_blocks(handle_t *handle, struct inode *inode,
* ext3_alloc_block() (normally -ENOSPC). Otherwise we set the chain * ext3_alloc_block() (normally -ENOSPC). Otherwise we set the chain
* as described above and return 0. * as described above and return 0.
*/ */
static int ext3_alloc_branch(handle_t *handle, struct inode *inode, static int ext3_alloc_branch(handle_t *handle, struct inode *inode,
int indirect_blks, int *blks, unsigned long goal, int indirect_blks, int *blks, unsigned long goal,
int *offsets, Indirect *branch) int *offsets, Indirect *branch)
...@@ -670,27 +669,28 @@ static int ext3_alloc_branch(handle_t *handle, struct inode *inode, ...@@ -670,27 +669,28 @@ static int ext3_alloc_branch(handle_t *handle, struct inode *inode,
} }
/** /**
* ext3_splice_branch - splice the allocated branch onto inode. * ext3_splice_branch - splice the allocated branch onto inode.
* @inode: owner * @inode: owner
* @block: (logical) number of block we are adding * @block: (logical) number of block we are adding
* @chain: chain of indirect blocks (with a missing link - see * @chain: chain of indirect blocks (with a missing link - see
* ext3_alloc_branch) * ext3_alloc_branch)
* @where: location of missing link * @where: location of missing link
* @num: number of indirect blocks we are adding * @num: number of indirect blocks we are adding
* @blks: number of direct blocks we are adding * @blks: number of direct blocks we are adding
* *
* This function fills the missing link and does all housekeeping needed in * This function fills the missing link and does all housekeeping needed in
* inode (->i_blocks, etc.). In case of success we end up with the full * inode (->i_blocks, etc.). In case of success we end up with the full
* chain to new block and return 0. * chain to new block and return 0.
*/ */
static int ext3_splice_branch(handle_t *handle, struct inode *inode,
static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block, long block, Indirect *where, int num, int blks)
Indirect *where, int num, int blks)
{ {
int i; int i;
int err = 0; int err = 0;
struct ext3_block_alloc_info *block_i = EXT3_I(inode)->i_block_alloc_info; struct ext3_block_alloc_info *block_i;
unsigned long current_block; unsigned long current_block;
block_i = EXT3_I(inode)->i_block_alloc_info;
/* /*
* If we're splicing into a [td]indirect block (as opposed to the * If we're splicing into a [td]indirect block (as opposed to the
* inode) then we need to get write access to the [td]indirect block * inode) then we need to get write access to the [td]indirect block
...@@ -705,8 +705,11 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block, ...@@ -705,8 +705,11 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block,
/* That's it */ /* That's it */
*where->p = where->key; *where->p = where->key;
/* update host bufferhead or inode to point to
* more just allocated direct blocks blocks */ /*
* Update the host buffer_head or inode to point to more just allocated
* direct blocks blocks
*/
if (num == 0 && blks > 1) { if (num == 0 && blks > 1) {
current_block = le32_to_cpu(where->key + 1); current_block = le32_to_cpu(where->key + 1);
for (i = 1; i < blks; i++) for (i = 1; i < blks; i++)
...@@ -720,7 +723,8 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block, ...@@ -720,7 +723,8 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block,
*/ */
if (block_i) { if (block_i) {
block_i->last_alloc_logical_block = block + blks - 1; block_i->last_alloc_logical_block = block + blks - 1;
block_i->last_alloc_physical_block = le32_to_cpu(where[num].key + blks - 1); block_i->last_alloc_physical_block =
le32_to_cpu(where[num].key + blks - 1);
} }
/* We are done with atomic stuff, now do the rest of housekeeping */ /* We are done with atomic stuff, now do the rest of housekeeping */
...@@ -731,7 +735,7 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block, ...@@ -731,7 +735,7 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block,
/* had we spliced it onto indirect block? */ /* had we spliced it onto indirect block? */
if (where->bh) { if (where->bh) {
/* /*
* akpm: If we spliced it onto an indirect block, we haven't * If we spliced it onto an indirect block, we haven't
* altered the inode. Note however that if it is being spliced * altered the inode. Note however that if it is being spliced
* onto an indirect block at the very end of the file (the * onto an indirect block at the very end of the file (the
* file is growing) then we *will* alter the inode to reflect * file is growing) then we *will* alter the inode to reflect
...@@ -756,7 +760,7 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block, ...@@ -756,7 +760,7 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block,
for (i = 1; i <= num; i++) { for (i = 1; i <= num; i++) {
BUFFER_TRACE(where[i].bh, "call journal_forget"); BUFFER_TRACE(where[i].bh, "call journal_forget");
ext3_journal_forget(handle, where[i].bh); ext3_journal_forget(handle, where[i].bh);
ext3_free_blocks(handle, inode, le32_to_cpu(where[i-1].key), 1); ext3_free_blocks(handle,inode,le32_to_cpu(where[i-1].key),1);
} }
ext3_free_blocks(handle, inode, le32_to_cpu(where[num].key), blks); ext3_free_blocks(handle, inode, le32_to_cpu(where[num].key), blks);
...@@ -775,17 +779,16 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block, ...@@ -775,17 +779,16 @@ static int ext3_splice_branch(handle_t *handle, struct inode *inode, long block,
* allocations is needed - we simply release blocks and do not touch anything * allocations is needed - we simply release blocks and do not touch anything
* reachable from inode. * reachable from inode.
* *
* akpm: `handle' can be NULL if create == 0. * `handle' can be NULL if create == 0.
* *
* The BKL may not be held on entry here. Be sure to take it early. * The BKL may not be held on entry here. Be sure to take it early.
* return > 0, # of blocks mapped or allocated. * return > 0, # of blocks mapped or allocated.
* return = 0, if plain lookup failed. * return = 0, if plain lookup failed.
* return < 0, error case. * return < 0, error case.
*/ */
int ext3_get_blocks_handle(handle_t *handle, struct inode *inode,
int sector_t iblock, unsigned long maxblocks,
ext3_get_blocks_handle(handle_t *handle, struct inode *inode, sector_t iblock, struct buffer_head *bh_result,
unsigned long maxblocks, struct buffer_head *bh_result,
int create, int extend_disksize) int create, int extend_disksize)
{ {
int err = -EIO; int err = -EIO;
...@@ -802,7 +805,7 @@ ext3_get_blocks_handle(handle_t *handle, struct inode *inode, sector_t iblock, ...@@ -802,7 +805,7 @@ ext3_get_blocks_handle(handle_t *handle, struct inode *inode, sector_t iblock,
J_ASSERT(handle != NULL || create == 0); J_ASSERT(handle != NULL || create == 0);
depth = ext3_block_to_path(inode, iblock, offsets, &blocks_to_boundary); depth = ext3_block_to_path(inode,iblock,offsets,&blocks_to_boundary);
if (depth == 0) if (depth == 0)
goto out; goto out;
...@@ -998,8 +1001,8 @@ static int ext3_get_block(struct inode *inode, sector_t iblock, ...@@ -998,8 +1001,8 @@ static int ext3_get_block(struct inode *inode, sector_t iblock,
/* /*
* `handle' can be NULL if create is zero * `handle' can be NULL if create is zero
*/ */
struct buffer_head *ext3_getblk(handle_t *handle, struct inode * inode, struct buffer_head *ext3_getblk(handle_t *handle, struct inode *inode,
long block, int create, int * errp) long block, int create, int *errp)
{ {
struct buffer_head dummy; struct buffer_head dummy;
int fatal = 0, err; int fatal = 0, err;
...@@ -1029,17 +1032,18 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode * inode, ...@@ -1029,17 +1032,18 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode * inode,
J_ASSERT(create != 0); J_ASSERT(create != 0);
J_ASSERT(handle != 0); J_ASSERT(handle != 0);
/* Now that we do not always journal data, we /*
should keep in mind whether this should * Now that we do not always journal data, we should
always journal the new buffer as metadata. * keep in mind whether this should always journal the
For now, regular file writes use * new buffer as metadata. For now, regular file
ext3_get_block instead, so it's not a * writes use ext3_get_block instead, so it's not a
problem. */ * problem.
*/
lock_buffer(bh); lock_buffer(bh);
BUFFER_TRACE(bh, "call get_create_access"); BUFFER_TRACE(bh, "call get_create_access");
fatal = ext3_journal_get_create_access(handle, bh); fatal = ext3_journal_get_create_access(handle, bh);
if (!fatal && !buffer_uptodate(bh)) { if (!fatal && !buffer_uptodate(bh)) {
memset(bh->b_data, 0, inode->i_sb->s_blocksize); memset(bh->b_data,0,inode->i_sb->s_blocksize);
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
} }
unlock_buffer(bh); unlock_buffer(bh);
...@@ -1061,7 +1065,7 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode * inode, ...@@ -1061,7 +1065,7 @@ struct buffer_head *ext3_getblk(handle_t *handle, struct inode * inode,
return NULL; return NULL;
} }
struct buffer_head *ext3_bread(handle_t *handle, struct inode * inode, struct buffer_head *ext3_bread(handle_t *handle, struct inode *inode,
int block, int create, int *err) int block, int create, int *err)
{ {
struct buffer_head * bh; struct buffer_head * bh;
...@@ -1137,9 +1141,8 @@ static int walk_page_buffers( handle_t *handle, ...@@ -1137,9 +1141,8 @@ static int walk_page_buffers( handle_t *handle,
* is elevated. We'll still have enough credits for the tiny quotafile * is elevated. We'll still have enough credits for the tiny quotafile
* write. * write.
*/ */
static int do_journal_get_write_access(handle_t *handle,
static int do_journal_get_write_access(handle_t *handle, struct buffer_head *bh)
struct buffer_head *bh)
{ {
if (!buffer_mapped(bh) || buffer_freed(bh)) if (!buffer_mapped(bh) || buffer_freed(bh))
return 0; return 0;
...@@ -1180,8 +1183,7 @@ static int ext3_prepare_write(struct file *file, struct page *page, ...@@ -1180,8 +1183,7 @@ static int ext3_prepare_write(struct file *file, struct page *page,
return ret; return ret;
} }
int int ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh)
ext3_journal_dirty_data(handle_t *handle, struct buffer_head *bh)
{ {
int err = journal_dirty_data(handle, bh); int err = journal_dirty_data(handle, bh);
if (err) if (err)
...@@ -1206,7 +1208,6 @@ static int commit_write_fn(handle_t *handle, struct buffer_head *bh) ...@@ -1206,7 +1208,6 @@ static int commit_write_fn(handle_t *handle, struct buffer_head *bh)
* ext3 never places buffers on inode->i_mapping->private_list. metadata * ext3 never places buffers on inode->i_mapping->private_list. metadata
* buffers are managed internally. * buffers are managed internally.
*/ */
static int ext3_ordered_commit_write(struct file *file, struct page *page, static int ext3_ordered_commit_write(struct file *file, struct page *page,
unsigned from, unsigned to) unsigned from, unsigned to)
{ {
...@@ -1416,7 +1417,7 @@ static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh) ...@@ -1416,7 +1417,7 @@ static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh)
* we don't need to open a transaction here. * we don't need to open a transaction here.
*/ */
static int ext3_ordered_writepage(struct page *page, static int ext3_ordered_writepage(struct page *page,
struct writeback_control *wbc) struct writeback_control *wbc)
{ {
struct inode *inode = page->mapping->host; struct inode *inode = page->mapping->host;
struct buffer_head *page_bufs; struct buffer_head *page_bufs;
...@@ -1907,11 +1908,8 @@ static inline int all_zeroes(__le32 *p, __le32 *q) ...@@ -1907,11 +1908,8 @@ static inline int all_zeroes(__le32 *p, __le32 *q)
* c) free the subtrees growing from the inode past the @chain[0]. * c) free the subtrees growing from the inode past the @chain[0].
* (no partially truncated stuff there). */ * (no partially truncated stuff there). */
static Indirect *ext3_find_shared(struct inode *inode, static Indirect *ext3_find_shared(struct inode *inode, int depth,
int depth, int offsets[4], Indirect chain[4], __le32 *top)
int offsets[4],
Indirect chain[4],
__le32 *top)
{ {
Indirect *partial, *p; Indirect *partial, *p;
int k, err; int k, err;
...@@ -1950,8 +1948,7 @@ static Indirect *ext3_find_shared(struct inode *inode, ...@@ -1950,8 +1948,7 @@ static Indirect *ext3_find_shared(struct inode *inode,
} }
/* Writer: end */ /* Writer: end */
while(partial > p) while(partial > p) {
{
brelse(partial->bh); brelse(partial->bh);
partial--; partial--;
} }
...@@ -1967,10 +1964,9 @@ static Indirect *ext3_find_shared(struct inode *inode, ...@@ -1967,10 +1964,9 @@ static Indirect *ext3_find_shared(struct inode *inode,
* We release `count' blocks on disk, but (last - first) may be greater * We release `count' blocks on disk, but (last - first) may be greater
* than `count' because there can be holes in there. * than `count' because there can be holes in there.
*/ */
static void static void ext3_clear_blocks(handle_t *handle, struct inode *inode,
ext3_clear_blocks(handle_t *handle, struct inode *inode, struct buffer_head *bh, struct buffer_head *bh, unsigned long block_to_free,
unsigned long block_to_free, unsigned long count, unsigned long count, __le32 *first, __le32 *last)
__le32 *first, __le32 *last)
{ {
__le32 *p; __le32 *p;
if (try_to_extend_transaction(handle, inode)) { if (try_to_extend_transaction(handle, inode)) {
...@@ -2231,8 +2227,7 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode, ...@@ -2231,8 +2227,7 @@ static void ext3_free_branches(handle_t *handle, struct inode *inode,
* that's fine - as long as they are linked from the inode, the post-crash * that's fine - as long as they are linked from the inode, the post-crash
* ext3_truncate() run will find them and release them. * ext3_truncate() run will find them and release them.
*/ */
void ext3_truncate(struct inode *inode)
void ext3_truncate(struct inode * inode)
{ {
handle_t *handle; handle_t *handle;
struct ext3_inode_info *ei = EXT3_I(inode); struct ext3_inode_info *ei = EXT3_I(inode);
...@@ -2356,29 +2351,26 @@ void ext3_truncate(struct inode * inode) ...@@ -2356,29 +2351,26 @@ void ext3_truncate(struct inode * inode)
do_indirects: do_indirects:
/* Kill the remaining (whole) subtrees */ /* Kill the remaining (whole) subtrees */
switch (offsets[0]) { switch (offsets[0]) {
default: default:
nr = i_data[EXT3_IND_BLOCK]; nr = i_data[EXT3_IND_BLOCK];
if (nr) { if (nr) {
ext3_free_branches(handle, inode, NULL, ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 1);
&nr, &nr+1, 1); i_data[EXT3_IND_BLOCK] = 0;
i_data[EXT3_IND_BLOCK] = 0; }
} case EXT3_IND_BLOCK:
case EXT3_IND_BLOCK: nr = i_data[EXT3_DIND_BLOCK];
nr = i_data[EXT3_DIND_BLOCK]; if (nr) {
if (nr) { ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 2);
ext3_free_branches(handle, inode, NULL, i_data[EXT3_DIND_BLOCK] = 0;
&nr, &nr+1, 2); }
i_data[EXT3_DIND_BLOCK] = 0; case EXT3_DIND_BLOCK:
} nr = i_data[EXT3_TIND_BLOCK];
case EXT3_DIND_BLOCK: if (nr) {
nr = i_data[EXT3_TIND_BLOCK]; ext3_free_branches(handle, inode, NULL, &nr, &nr+1, 3);
if (nr) { i_data[EXT3_TIND_BLOCK] = 0;
ext3_free_branches(handle, inode, NULL, }
&nr, &nr+1, 3); case EXT3_TIND_BLOCK:
i_data[EXT3_TIND_BLOCK] = 0; ;
}
case EXT3_TIND_BLOCK:
;
} }
ext3_discard_reservation(inode); ext3_discard_reservation(inode);
...@@ -2387,8 +2379,10 @@ void ext3_truncate(struct inode * inode) ...@@ -2387,8 +2379,10 @@ void ext3_truncate(struct inode * inode)
inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC; inode->i_mtime = inode->i_ctime = CURRENT_TIME_SEC;
ext3_mark_inode_dirty(handle, inode); ext3_mark_inode_dirty(handle, inode);
/* In a multi-transaction truncate, we only make the final /*
* transaction synchronous */ * In a multi-transaction truncate, we only make the final transaction
* synchronous
*/
if (IS_SYNC(inode)) if (IS_SYNC(inode))
handle->h_sync = 1; handle->h_sync = 1;
out_stop: out_stop:
...@@ -2414,20 +2408,16 @@ static unsigned long ext3_get_inode_block(struct super_block *sb, ...@@ -2414,20 +2408,16 @@ static unsigned long ext3_get_inode_block(struct super_block *sb,
struct ext3_group_desc * gdp; struct ext3_group_desc * gdp;
if ((ino != EXT3_ROOT_INO && if ((ino != EXT3_ROOT_INO && ino != EXT3_JOURNAL_INO &&
ino != EXT3_JOURNAL_INO && ino != EXT3_RESIZE_INO && ino < EXT3_FIRST_INO(sb)) ||
ino != EXT3_RESIZE_INO && ino > le32_to_cpu(EXT3_SB(sb)->s_es->s_inodes_count)) {
ino < EXT3_FIRST_INO(sb)) || ext3_error(sb, "ext3_get_inode_block",
ino > le32_to_cpu(
EXT3_SB(sb)->s_es->s_inodes_count)) {
ext3_error (sb, "ext3_get_inode_block",
"bad inode number: %lu", ino); "bad inode number: %lu", ino);
return 0; return 0;
} }
block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb); block_group = (ino - 1) / EXT3_INODES_PER_GROUP(sb);
if (block_group >= EXT3_SB(sb)->s_groups_count) { if (block_group >= EXT3_SB(sb)->s_groups_count) {
ext3_error (sb, "ext3_get_inode_block", ext3_error(sb,"ext3_get_inode_block","group >= groups count");
"group >= groups count");
return 0; return 0;
} }
smp_rmb(); smp_rmb();
...@@ -2440,7 +2430,7 @@ static unsigned long ext3_get_inode_block(struct super_block *sb, ...@@ -2440,7 +2430,7 @@ static unsigned long ext3_get_inode_block(struct super_block *sb,
return 0; return 0;
} }
gdp = (struct ext3_group_desc *) bh->b_data; gdp = (struct ext3_group_desc *)bh->b_data;
/* /*
* Figure out the offset within the block group inode table * Figure out the offset within the block group inode table
*/ */
...@@ -2989,7 +2979,7 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr) ...@@ -2989,7 +2979,7 @@ int ext3_setattr(struct dentry *dentry, struct iattr *attr)
/* /*
* akpm: how many blocks doth make a writepage()? * How many blocks doth make a writepage()?
* *
* With N blocks per page, it may be: * With N blocks per page, it may be:
* N data blocks * N data blocks
...@@ -3079,8 +3069,8 @@ ext3_reserve_inode_write(handle_t *handle, struct inode *inode, ...@@ -3079,8 +3069,8 @@ ext3_reserve_inode_write(handle_t *handle, struct inode *inode,
} }
/* /*
* akpm: What we do here is to mark the in-core inode as clean * What we do here is to mark the in-core inode as clean with respect to inode
* with respect to inode dirtiness (it may still be data-dirty). * dirtiness (it may still be data-dirty).
* This means that the in-core inode may be reaped by prune_icache * This means that the in-core inode may be reaped by prune_icache
* without having to perform any I/O. This is a very good thing, * without having to perform any I/O. This is a very good thing,
* because *any* task may call prune_icache - even ones which * because *any* task may call prune_icache - even ones which
...@@ -3112,7 +3102,7 @@ int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode) ...@@ -3112,7 +3102,7 @@ int ext3_mark_inode_dirty(handle_t *handle, struct inode *inode)
} }
/* /*
* akpm: ext3_dirty_inode() is called from __mark_inode_dirty() * ext3_dirty_inode() is called from __mark_inode_dirty()
* *
* We're really interested in the case where a file is being extended. * We're really interested in the case where a file is being extended.
* i_size has been changed by generic_commit_write() and we thus need * i_size has been changed by generic_commit_write() and we thus need
...@@ -3148,7 +3138,7 @@ void ext3_dirty_inode(struct inode *inode) ...@@ -3148,7 +3138,7 @@ void ext3_dirty_inode(struct inode *inode)
return; return;
} }
#ifdef AKPM #if 0
/* /*
* Bind an inode's backing buffer_head into this transaction, to prevent * Bind an inode's backing buffer_head into this transaction, to prevent
* it from being flushed to disk early. Unlike * it from being flushed to disk early. Unlike
...@@ -3156,8 +3146,7 @@ void ext3_dirty_inode(struct inode *inode) ...@@ -3156,8 +3146,7 @@ void ext3_dirty_inode(struct inode *inode)
* returns no iloc structure, so the caller needs to repeat the iloc * returns no iloc structure, so the caller needs to repeat the iloc
* lookup to mark the inode dirty later. * lookup to mark the inode dirty later.
*/ */
static inline int static int ext3_pin_inode(handle_t *handle, struct inode *inode)
ext3_pin_inode(handle_t *handle, struct inode *inode)
{ {
struct ext3_iloc iloc; struct ext3_iloc iloc;
......
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