mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-17 14:30:00 +00:00
[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: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
1d8fa7a2b9
commit
d6859bfca8
237
fs/ext3/inode.c
237
fs/ext3/inode.c
@ -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)
|
|||||||
* 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
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,
|
|||||||
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 @@ no_block:
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
|
|
||||||
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,
|
|||||||
* 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,
|
|||||||
* 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,
|
|||||||
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 @@ failed_out:
|
|||||||
* 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 @@ failed:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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,
|
|||||||
/* 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,
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
/* 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 @@ err_out:
|
|||||||
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 @@ err_out:
|
|||||||
* 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,
|
|||||||
|
|
||||||
|
|
||||||
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,
|
|||||||
/*
|
/*
|
||||||
* `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,
|
|||||||
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 @@ err:
|
|||||||
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,
|
|||||||
* 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 @@ out:
|
|||||||
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)
|
|||||||
* 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)
|
|||||||
* 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)
|
|||||||
* 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,
|
|||||||
}
|
}
|
||||||
/* Writer: end */
|
/* Writer: end */
|
||||||
|
|
||||||
while(partial > p)
|
while(partial > p) {
|
||||||
{
|
|
||||||
brelse(partial->bh);
|
brelse(partial->bh);
|
||||||
partial--;
|
partial--;
|
||||||
}
|
}
|
||||||
@ -1967,10 +1964,9 @@ no_top:
|
|||||||
* 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,
|
|||||||
* 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)
|
|||||||
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 @@ do_indirects:
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 @@ err_out:
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 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 @@ out:
|
|||||||
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 @@ out:
|
|||||||
* 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;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user