GFS2: Update truncate code
PATCH 1/2 GFS2: Update truncate code
From 0c9f6ae4f84486c5f42baeef9d0fd4d35c4c217e Mon Sep 17 00:00:00 2001
From: Steven Whitehouse <[email protected]>
Date: Tue, 1 Jun 2010 10:13:20 +0100
Subject: [PATCH 1/2] GFS2: Update truncate code
This updates GFS2's truncate code to use the new truncate sequence correctly. This is a stepping stone to being able to remove ip->i_disksize in favour of using i_size everywhere now that the two sizes are always identical.
Signed-off-by Steven Whitehouse <[email protected]>
Cc Nick Piggin <[email protected]>
Cc Christoph Hellwig <[email protected]>
--- fs/gfs2/aops.c | 10 +-- fs/gfs2/bmap.c | 246 +++++++++++++++++++++++++-------------------------- fs/gfs2/bmap.h | 21 +++-- fs/gfs2/ops_inode.c | 28 +------ 4 files changed, 136 insertions(+), 169 deletions(-)
fs/gfs2/aops.c +4 -6
@@ -701,13 +701,11 @@ out:page_cache_release (page); -/* -* XXX(hch): the call below should probably be replaced with -* a call to the gfs2-specific truncate blocks helper to actually -* release disk blocks.. -*/ +gfs2_trans_end (sdp);if (pos + len > ip->i_inode.i_size) -simple_setsize (&ip->i_inode, ip->i_inode.i_size); +gfs2_trim_blocks (&ip->i_inode); + goto out_trans_fail; + out_endtrans:gfs2_trans_end (sdp); out_trans_fail:
fs/gfs2/bmap.c +119 -127
342 lines not on this page · raw message
fs/gfs2/bmap.h +12 -9
@@ -44,14 +44,17 @@ static inline void gfs2_write_calc_reserv(const struct gfs2_inode *ip, } } -int gfs2_unstuff_dinode (struct gfs2_inode *ip,struct page *page); -int gfs2_block_map (struct inode *inode,sector_t lblock,struct buffer_head *bh,int create); -int gfs2_extent_map (struct inode *inode,u64 lblock,int *new,u64 *dblock,unsigned *extlen); - -int gfs2_truncatei (struct gfs2_inode *ip,u64 size); -int gfs2_truncatei_resume (struct gfs2_inode *ip); -int gfs2_file_dealloc (struct gfs2_inode *ip); -int gfs2_write_alloc_required (struct gfs2_inode *ip,u64 offset, -unsigned int len,int *alloc_required); +extern int gfs2_unstuff_dinode (struct gfs2_inode *ip,struct page *page); +extern int gfs2_block_map (struct inode *inode,sector_t lblock, +struct buffer_head *bh,int create); +extern int gfs2_extent_map (struct inode *inode,u64 lblock,int *new, +u64 *dblock,unsigned *extlen); + +extern int gfs2_setattr_size (struct inode *inode,u64 size); +extern void gfs2_trim_blocks (struct inode *inode); +extern int gfs2_truncatei_resume (struct gfs2_inode *ip); +extern int gfs2_file_dealloc (struct gfs2_inode *ip); +extern int gfs2_write_alloc_required (struct gfs2_inode *ip,u64 offset, +unsigned int len,int *alloc_required);#endif /* __BMAP_DOT_H__ */
fs/gfs2/ops_inode.c +1 -27
@@ -1071,32 +1071,6 @@ int gfs2_permission(struct inode *inode, int mask)return error; } -/* -* XXX: should be changed to have proper ordering by opencoding simple_setsize -*/ -static int setattr_size (struct inode *inode,struct iattr *attr) -{ -struct gfs2_inode *ip =GFS2_I (inode); -struct gfs2_sbd *sdp =GFS2_SB (inode); -int error; - -if (attr->ia_size != ip->i_disksize) { - error =gfs2_trans_begin (sdp,0 , sdp->sd_jdesc->jd_blocks); -if (error) -return error; - error =simple_setsize (inode, attr->ia_size); -gfs2_trans_end (sdp); -if (error) -return error; - } - - error =gfs2_truncatei (ip, attr->ia_size); -if (error && (inode->i_size != ip->i_disksize)) -i_size_write (inode, ip->i_disksize); - -return error; -} -static int setattr_chown (struct inode *inode,struct iattr *attr) {struct gfs2_inode *ip =GFS2_I (inode);
@@ -1189,7 +1163,7 @@ static int gfs2_setattr(struct dentry *dentry, struct iattr *attr) goto out;if (attr->ia_valid &ATTR_SIZE ) - error =setattr_size (inode, attr); + error =gfs2_setattr_size (inode, attr->ia_size);else if (attr->ia_valid & (ATTR_UID |ATTR_GID )) error =setattr_chown (inode, attr);else if ((attr->ia_valid &ATTR_MODE ) &&IS_POSIXACL (inode))
Signature · 1 line
1.6.2.5