diff options
Diffstat (limited to 'fs/nilfs2/bmap.c')
| -rw-r--r-- | fs/nilfs2/bmap.c | 61 | 
1 files changed, 38 insertions, 23 deletions
diff --git a/fs/nilfs2/bmap.c b/fs/nilfs2/bmap.c index 8b782b062ba..aadbd0b5e3e 100644 --- a/fs/nilfs2/bmap.c +++ b/fs/nilfs2/bmap.c @@ -25,7 +25,6 @@  #include <linux/errno.h>  #include "nilfs.h"  #include "bmap.h" -#include "sb.h"  #include "btree.h"  #include "direct.h"  #include "btnode.h" @@ -35,7 +34,22 @@  struct inode *nilfs_bmap_get_dat(const struct nilfs_bmap *bmap)  { -	return nilfs_dat_inode(NILFS_I_NILFS(bmap->b_inode)); +	struct the_nilfs *nilfs = bmap->b_inode->i_sb->s_fs_info; + +	return nilfs->ns_dat; +} + +static int nilfs_bmap_convert_error(struct nilfs_bmap *bmap, +				     const char *fname, int err) +{ +	struct inode *inode = bmap->b_inode; + +	if (err == -EINVAL) { +		nilfs_error(inode->i_sb, fname, +			    "broken bmap (inode number=%lu)\n", inode->i_ino); +		err = -EIO; +	} +	return err;  }  /** @@ -66,8 +80,10 @@ int nilfs_bmap_lookup_at_level(struct nilfs_bmap *bmap, __u64 key, int level,  	down_read(&bmap->b_sem);  	ret = bmap->b_ops->bop_lookup(bmap, key, level, ptrp); -	if (ret < 0) +	if (ret < 0) { +		ret = nilfs_bmap_convert_error(bmap, __func__, ret);  		goto out; +	}  	if (NILFS_BMAP_USE_VBN(bmap)) {  		ret = nilfs_dat_translate(nilfs_bmap_get_dat(bmap), *ptrp,  					  &blocknr); @@ -88,7 +104,8 @@ int nilfs_bmap_lookup_contig(struct nilfs_bmap *bmap, __u64 key, __u64 *ptrp,  	down_read(&bmap->b_sem);  	ret = bmap->b_ops->bop_lookup_contig(bmap, key, ptrp, maxblocks);  	up_read(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  static int nilfs_bmap_do_insert(struct nilfs_bmap *bmap, __u64 key, __u64 ptr) @@ -144,7 +161,8 @@ int nilfs_bmap_insert(struct nilfs_bmap *bmap,  	down_write(&bmap->b_sem);  	ret = nilfs_bmap_do_insert(bmap, key, rec);  	up_write(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  static int nilfs_bmap_do_delete(struct nilfs_bmap *bmap, __u64 key) @@ -180,9 +198,12 @@ int nilfs_bmap_last_key(struct nilfs_bmap *bmap, unsigned long *key)  	down_read(&bmap->b_sem);  	ret = bmap->b_ops->bop_last_key(bmap, &lastkey); -	if (!ret) -		*key = lastkey;  	up_read(&bmap->b_sem); + +	if (ret < 0) +		ret = nilfs_bmap_convert_error(bmap, __func__, ret); +	else +		*key = lastkey;  	return ret;  } @@ -210,7 +231,8 @@ int nilfs_bmap_delete(struct nilfs_bmap *bmap, unsigned long key)  	down_write(&bmap->b_sem);  	ret = nilfs_bmap_do_delete(bmap, key);  	up_write(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  static int nilfs_bmap_do_truncate(struct nilfs_bmap *bmap, unsigned long key) @@ -261,7 +283,8 @@ int nilfs_bmap_truncate(struct nilfs_bmap *bmap, unsigned long key)  	down_write(&bmap->b_sem);  	ret = nilfs_bmap_do_truncate(bmap, key);  	up_write(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  /** @@ -300,7 +323,8 @@ int nilfs_bmap_propagate(struct nilfs_bmap *bmap, struct buffer_head *bh)  	down_write(&bmap->b_sem);  	ret = bmap->b_ops->bop_propagate(bmap, bh);  	up_write(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  /** @@ -344,7 +368,8 @@ int nilfs_bmap_assign(struct nilfs_bmap *bmap,  	down_write(&bmap->b_sem);  	ret = bmap->b_ops->bop_assign(bmap, bh, blocknr, binfo);  	up_write(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  /** @@ -373,7 +398,8 @@ int nilfs_bmap_mark(struct nilfs_bmap *bmap, __u64 key, int level)  	down_write(&bmap->b_sem);  	ret = bmap->b_ops->bop_mark(bmap, key, level);  	up_write(&bmap->b_sem); -	return ret; + +	return nilfs_bmap_convert_error(bmap, __func__, ret);  }  /** @@ -400,17 +426,6 @@ int nilfs_bmap_test_and_clear_dirty(struct nilfs_bmap *bmap)  /*   * Internal use only   */ - -void nilfs_bmap_add_blocks(const struct nilfs_bmap *bmap, int n) -{ -	inode_add_bytes(bmap->b_inode, (1 << bmap->b_inode->i_blkbits) * n); -} - -void nilfs_bmap_sub_blocks(const struct nilfs_bmap *bmap, int n) -{ -	inode_sub_bytes(bmap->b_inode, (1 << bmap->b_inode->i_blkbits) * n); -} -  __u64 nilfs_bmap_data_get_key(const struct nilfs_bmap *bmap,  			      const struct buffer_head *bh)  {  | 
