aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/gfs2/Kconfig2
-rw-r--r--fs/gfs2/bmap.c18
-rw-r--r--fs/gfs2/dir.c15
-rw-r--r--fs/gfs2/eattr.c24
-rw-r--r--fs/gfs2/incore.h1
-rw-r--r--fs/gfs2/inode.c11
-rw-r--r--fs/gfs2/inode.h20
-rw-r--r--fs/gfs2/ops_inode.c5
8 files changed, 42 insertions, 54 deletions
diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig
index de8e64c03f73..d147b53ef527 100644
--- a/fs/gfs2/Kconfig
+++ b/fs/gfs2/Kconfig
@@ -1,6 +1,6 @@
1config GFS2_FS 1config GFS2_FS
2 tristate "GFS2 file system support" 2 tristate "GFS2 file system support"
3 depends on EXPERIMENTAL 3 depends on EXPERIMENTAL && (64BIT || LSF)
4 select FS_POSIX_ACL 4 select FS_POSIX_ACL
5 select CRC32 5 select CRC32
6 help 6 help
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 6780aa5841b2..e27e66046f0a 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -161,9 +161,8 @@ int gfs2_unstuff_dinode(struct gfs2_inode *ip, struct page *page)
161 161
162 if (ip->i_di.di_size) { 162 if (ip->i_di.di_size) {
163 *(__be64 *)(di + 1) = cpu_to_be64(block); 163 *(__be64 *)(di + 1) = cpu_to_be64(block);
164 ip->i_di.di_blocks++; 164 gfs2_add_inode_blocks(&ip->i_inode, 1);
165 gfs2_set_inode_blocks(&ip->i_inode); 165 di->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
166 di->di_blocks = cpu_to_be64(ip->i_di.di_blocks);
167 } 166 }
168 167
169 ip->i_height = 1; 168 ip->i_height = 1;
@@ -238,10 +237,9 @@ static int build_height(struct inode *inode, struct metapath *mp, unsigned heigh
238 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); 237 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
239 *(__be64 *)(di + 1) = cpu_to_be64(bn); 238 *(__be64 *)(di + 1) = cpu_to_be64(bn);
240 ip->i_height += new_height; 239 ip->i_height += new_height;
241 ip->i_di.di_blocks += new_height; 240 gfs2_add_inode_blocks(&ip->i_inode, new_height);
242 gfs2_set_inode_blocks(&ip->i_inode);
243 di->di_height = cpu_to_be16(ip->i_height); 241 di->di_height = cpu_to_be16(ip->i_height);
244 di->di_blocks = cpu_to_be64(ip->i_di.di_blocks); 242 di->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
245 brelse(dibh); 243 brelse(dibh);
246 return error; 244 return error;
247} 245}
@@ -380,8 +378,7 @@ static int lookup_block(struct gfs2_inode *ip, unsigned int height,
380 gfs2_trans_add_bh(ip->i_gl, mp->mp_bh[height], 1); 378 gfs2_trans_add_bh(ip->i_gl, mp->mp_bh[height], 1);
381 379
382 *ptr = cpu_to_be64(*block); 380 *ptr = cpu_to_be64(*block);
383 ip->i_di.di_blocks++; 381 gfs2_add_inode_blocks(&ip->i_inode, 1);
384 gfs2_set_inode_blocks(&ip->i_inode);
385 382
386 *new = 1; 383 *new = 1;
387 return 0; 384 return 0;
@@ -779,10 +776,7 @@ static int do_strip(struct gfs2_inode *ip, struct buffer_head *dibh,
779 } 776 }
780 777
781 *p = 0; 778 *p = 0;
782 if (!ip->i_di.di_blocks) 779 gfs2_add_inode_blocks(&ip->i_inode, -1);
783 gfs2_consist_inode(ip);
784 ip->i_di.di_blocks--;
785 gfs2_set_inode_blocks(&ip->i_inode);
786 } 780 }
787 if (bstart) { 781 if (bstart) {
788 if (metadata) 782 if (metadata)
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
index 93a2e6afbd81..862aa3228f7a 100644
--- a/fs/gfs2/dir.c
+++ b/fs/gfs2/dir.c
@@ -906,8 +906,7 @@ static int dir_make_exhash(struct inode *inode)
906 *lp = cpu_to_be64(bn); 906 *lp = cpu_to_be64(bn);
907 907
908 dip->i_di.di_size = sdp->sd_sb.sb_bsize / 2; 908 dip->i_di.di_size = sdp->sd_sb.sb_bsize / 2;
909 dip->i_di.di_blocks++; 909 gfs2_add_inode_blocks(&dip->i_inode, 1);
910 gfs2_set_inode_blocks(&dip->i_inode);
911 dip->i_di.di_flags |= GFS2_DIF_EXHASH; 910 dip->i_di.di_flags |= GFS2_DIF_EXHASH;
912 911
913 for (x = sdp->sd_hash_ptrs, y = -1; x; x >>= 1, y++) ; 912 for (x = sdp->sd_hash_ptrs, y = -1; x; x >>= 1, y++) ;
@@ -1045,8 +1044,7 @@ static int dir_split_leaf(struct inode *inode, const struct qstr *name)
1045 error = gfs2_meta_inode_buffer(dip, &dibh); 1044 error = gfs2_meta_inode_buffer(dip, &dibh);
1046 if (!gfs2_assert_withdraw(GFS2_SB(&dip->i_inode), !error)) { 1045 if (!gfs2_assert_withdraw(GFS2_SB(&dip->i_inode), !error)) {
1047 gfs2_trans_add_bh(dip->i_gl, dibh, 1); 1046 gfs2_trans_add_bh(dip->i_gl, dibh, 1);
1048 dip->i_di.di_blocks++; 1047 gfs2_add_inode_blocks(&dip->i_inode, 1);
1049 gfs2_set_inode_blocks(&dip->i_inode);
1050 gfs2_dinode_out(dip, dibh->b_data); 1048 gfs2_dinode_out(dip, dibh->b_data);
1051 brelse(dibh); 1049 brelse(dibh);
1052 } 1050 }
@@ -1580,8 +1578,7 @@ static int dir_new_leaf(struct inode *inode, const struct qstr *name)
1580 if (error) 1578 if (error)
1581 return error; 1579 return error;
1582 gfs2_trans_add_bh(ip->i_gl, bh, 1); 1580 gfs2_trans_add_bh(ip->i_gl, bh, 1);
1583 ip->i_di.di_blocks++; 1581 gfs2_add_inode_blocks(&ip->i_inode, 1);
1584 gfs2_set_inode_blocks(&ip->i_inode);
1585 gfs2_dinode_out(ip, bh->b_data); 1582 gfs2_dinode_out(ip, bh->b_data);
1586 brelse(bh); 1583 brelse(bh);
1587 return 0; 1584 return 0;
@@ -1922,11 +1919,7 @@ static int leaf_dealloc(struct gfs2_inode *dip, u32 index, u32 len,
1922 brelse(bh); 1919 brelse(bh);
1923 1920
1924 gfs2_free_meta(dip, blk, 1); 1921 gfs2_free_meta(dip, blk, 1);
1925 1922 gfs2_add_inode_blocks(&dip->i_inode, -1);
1926 if (!dip->i_di.di_blocks)
1927 gfs2_consist_inode(dip);
1928 dip->i_di.di_blocks--;
1929 gfs2_set_inode_blocks(&dip->i_inode);
1930 } 1923 }
1931 1924
1932 error = gfs2_dir_write_data(dip, ht, index * sizeof(u64), size); 1925 error = gfs2_dir_write_data(dip, ht, index * sizeof(u64), size);
diff --git a/fs/gfs2/eattr.c b/fs/gfs2/eattr.c
index 0e79cd543496..76ead1acfcc7 100644
--- a/fs/gfs2/eattr.c
+++ b/fs/gfs2/eattr.c
@@ -277,10 +277,7 @@ static int ea_dealloc_unstuffed(struct gfs2_inode *ip, struct buffer_head *bh,
277 } 277 }
278 278
279 *dataptrs = 0; 279 *dataptrs = 0;
280 if (!ip->i_di.di_blocks) 280 gfs2_add_inode_blocks(&ip->i_inode, -1);
281 gfs2_consist_inode(ip);
282 ip->i_di.di_blocks--;
283 gfs2_set_inode_blocks(&ip->i_inode);
284 } 281 }
285 if (bstart) 282 if (bstart)
286 gfs2_free_meta(ip, bstart, blen); 283 gfs2_free_meta(ip, bstart, blen);
@@ -598,8 +595,7 @@ static int ea_alloc_blk(struct gfs2_inode *ip, struct buffer_head **bhp)
598 ea->ea_flags = GFS2_EAFLAG_LAST; 595 ea->ea_flags = GFS2_EAFLAG_LAST;
599 ea->ea_num_ptrs = 0; 596 ea->ea_num_ptrs = 0;
600 597
601 ip->i_di.di_blocks++; 598 gfs2_add_inode_blocks(&ip->i_inode, 1);
602 gfs2_set_inode_blocks(&ip->i_inode);
603 599
604 return 0; 600 return 0;
605} 601}
@@ -651,8 +647,7 @@ static int ea_write(struct gfs2_inode *ip, struct gfs2_ea_header *ea,
651 gfs2_trans_add_bh(ip->i_gl, bh, 1); 647 gfs2_trans_add_bh(ip->i_gl, bh, 1);
652 gfs2_metatype_set(bh, GFS2_METATYPE_ED, GFS2_FORMAT_ED); 648 gfs2_metatype_set(bh, GFS2_METATYPE_ED, GFS2_FORMAT_ED);
653 649
654 ip->i_di.di_blocks++; 650 gfs2_add_inode_blocks(&ip->i_inode, 1);
655 gfs2_set_inode_blocks(&ip->i_inode);
656 651
657 copy = data_len > sdp->sd_jbsize ? sdp->sd_jbsize : 652 copy = data_len > sdp->sd_jbsize ? sdp->sd_jbsize :
658 data_len; 653 data_len;
@@ -980,8 +975,7 @@ static int ea_set_block(struct gfs2_inode *ip, struct gfs2_ea_request *er,
980 *eablk = cpu_to_be64(ip->i_di.di_eattr); 975 *eablk = cpu_to_be64(ip->i_di.di_eattr);
981 ip->i_di.di_eattr = blk; 976 ip->i_di.di_eattr = blk;
982 ip->i_di.di_flags |= GFS2_DIF_EA_INDIRECT; 977 ip->i_di.di_flags |= GFS2_DIF_EA_INDIRECT;
983 ip->i_di.di_blocks++; 978 gfs2_add_inode_blocks(&ip->i_inode, 1);
984 gfs2_set_inode_blocks(&ip->i_inode);
985 979
986 eablk++; 980 eablk++;
987 } 981 }
@@ -1389,10 +1383,7 @@ static int ea_dealloc_indirect(struct gfs2_inode *ip)
1389 } 1383 }
1390 1384
1391 *eablk = 0; 1385 *eablk = 0;
1392 if (!ip->i_di.di_blocks) 1386 gfs2_add_inode_blocks(&ip->i_inode, -1);
1393 gfs2_consist_inode(ip);
1394 ip->i_di.di_blocks--;
1395 gfs2_set_inode_blocks(&ip->i_inode);
1396 } 1387 }
1397 if (bstart) 1388 if (bstart)
1398 gfs2_free_meta(ip, bstart, blen); 1389 gfs2_free_meta(ip, bstart, blen);
@@ -1444,10 +1435,7 @@ static int ea_dealloc_block(struct gfs2_inode *ip)
1444 gfs2_free_meta(ip, ip->i_di.di_eattr, 1); 1435 gfs2_free_meta(ip, ip->i_di.di_eattr, 1);
1445 1436
1446 ip->i_di.di_eattr = 0; 1437 ip->i_di.di_eattr = 0;
1447 if (!ip->i_di.di_blocks) 1438 gfs2_add_inode_blocks(&ip->i_inode, -1);
1448 gfs2_consist_inode(ip);
1449 ip->i_di.di_blocks--;
1450 gfs2_set_inode_blocks(&ip->i_inode);
1451 1439
1452 error = gfs2_meta_inode_buffer(ip, &dibh); 1440 error = gfs2_meta_inode_buffer(ip, &dibh);
1453 if (!error) { 1441 if (!error) {
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index 898b456b386f..4ba2ea63119d 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -239,7 +239,6 @@ enum {
239 239
240struct gfs2_dinode_host { 240struct gfs2_dinode_host {
241 u64 di_size; /* number of bytes in file */ 241 u64 di_size; /* number of bytes in file */
242 u64 di_blocks; /* number of blocks in file */
243 u64 di_generation; /* generation number for NFS */ 242 u64 di_generation; /* generation number for NFS */
244 u32 di_flags; /* GFS2_DIF_... */ 243 u32 di_flags; /* GFS2_DIF_... */
245 /* These only apply to directories */ 244 /* These only apply to directories */
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index c3fe8aa03c4e..5f50dd53bf63 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -273,8 +273,7 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
273 ip->i_inode.i_nlink = be32_to_cpu(str->di_nlink); 273 ip->i_inode.i_nlink = be32_to_cpu(str->di_nlink);
274 di->di_size = be64_to_cpu(str->di_size); 274 di->di_size = be64_to_cpu(str->di_size);
275 i_size_write(&ip->i_inode, di->di_size); 275 i_size_write(&ip->i_inode, di->di_size);
276 di->di_blocks = be64_to_cpu(str->di_blocks); 276 gfs2_set_inode_blocks(&ip->i_inode, be64_to_cpu(str->di_blocks));
277 gfs2_set_inode_blocks(&ip->i_inode);
278 ip->i_inode.i_atime.tv_sec = be64_to_cpu(str->di_atime); 277 ip->i_inode.i_atime.tv_sec = be64_to_cpu(str->di_atime);
279 ip->i_inode.i_atime.tv_nsec = be32_to_cpu(str->di_atime_nsec); 278 ip->i_inode.i_atime.tv_nsec = be32_to_cpu(str->di_atime_nsec);
280 ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime); 279 ip->i_inode.i_mtime.tv_sec = be64_to_cpu(str->di_mtime);
@@ -344,7 +343,7 @@ int gfs2_dinode_dealloc(struct gfs2_inode *ip)
344 struct gfs2_rgrpd *rgd; 343 struct gfs2_rgrpd *rgd;
345 int error; 344 int error;
346 345
347 if (ip->i_di.di_blocks != 1) { 346 if (gfs2_get_inode_blocks(&ip->i_inode) != 1) {
348 if (gfs2_consist_inode(ip)) 347 if (gfs2_consist_inode(ip))
349 gfs2_dinode_print(ip); 348 gfs2_dinode_print(ip);
350 return -EIO; 349 return -EIO;
@@ -1398,7 +1397,7 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
1398 str->di_gid = cpu_to_be32(ip->i_inode.i_gid); 1397 str->di_gid = cpu_to_be32(ip->i_inode.i_gid);
1399 str->di_nlink = cpu_to_be32(ip->i_inode.i_nlink); 1398 str->di_nlink = cpu_to_be32(ip->i_inode.i_nlink);
1400 str->di_size = cpu_to_be64(di->di_size); 1399 str->di_size = cpu_to_be64(di->di_size);
1401 str->di_blocks = cpu_to_be64(di->di_blocks); 1400 str->di_blocks = cpu_to_be64(gfs2_get_inode_blocks(&ip->i_inode));
1402 str->di_atime = cpu_to_be64(ip->i_inode.i_atime.tv_sec); 1401 str->di_atime = cpu_to_be64(ip->i_inode.i_atime.tv_sec);
1403 str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec); 1402 str->di_mtime = cpu_to_be64(ip->i_inode.i_mtime.tv_sec);
1404 str->di_ctime = cpu_to_be64(ip->i_inode.i_ctime.tv_sec); 1403 str->di_ctime = cpu_to_be64(ip->i_inode.i_ctime.tv_sec);
@@ -1430,8 +1429,8 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
1430 printk(KERN_INFO " no_addr = %llu\n", 1429 printk(KERN_INFO " no_addr = %llu\n",
1431 (unsigned long long)ip->i_no_addr); 1430 (unsigned long long)ip->i_no_addr);
1432 printk(KERN_INFO " di_size = %llu\n", (unsigned long long)di->di_size); 1431 printk(KERN_INFO " di_size = %llu\n", (unsigned long long)di->di_size);
1433 printk(KERN_INFO " di_blocks = %llu\n", 1432 printk(KERN_INFO " blocks = %llu\n",
1434 (unsigned long long)di->di_blocks); 1433 (unsigned long long)gfs2_get_inode_blocks(&ip->i_inode));
1435 printk(KERN_INFO " i_goal = %llu\n", 1434 printk(KERN_INFO " i_goal = %llu\n",
1436 (unsigned long long)ip->i_goal); 1435 (unsigned long long)ip->i_goal);
1437 printk(KERN_INFO " di_flags = 0x%.8X\n", di->di_flags); 1436 printk(KERN_INFO " di_flags = 0x%.8X\n", di->di_flags);
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h
index db738686ca1d..580da454b38f 100644
--- a/fs/gfs2/inode.h
+++ b/fs/gfs2/inode.h
@@ -10,6 +10,8 @@
10#ifndef __INODE_DOT_H__ 10#ifndef __INODE_DOT_H__
11#define __INODE_DOT_H__ 11#define __INODE_DOT_H__
12 12
13#include "util.h"
14
13static inline int gfs2_is_stuffed(const struct gfs2_inode *ip) 15static inline int gfs2_is_stuffed(const struct gfs2_inode *ip)
14{ 16{
15 return !ip->i_height; 17 return !ip->i_height;
@@ -37,13 +39,25 @@ static inline int gfs2_is_dir(const struct gfs2_inode *ip)
37 return S_ISDIR(ip->i_inode.i_mode); 39 return S_ISDIR(ip->i_inode.i_mode);
38} 40}
39 41
40static inline void gfs2_set_inode_blocks(struct inode *inode) 42static inline void gfs2_set_inode_blocks(struct inode *inode, u64 blocks)
43{
44 inode->i_blocks = blocks <<
45 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
46}
47
48static inline u64 gfs2_get_inode_blocks(const struct inode *inode)
41{ 49{
42 struct gfs2_inode *ip = GFS2_I(inode); 50 return inode->i_blocks >>
43 inode->i_blocks = ip->i_di.di_blocks <<
44 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT); 51 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
45} 52}
46 53
54static inline void gfs2_add_inode_blocks(struct inode *inode, s64 change)
55{
56 gfs2_assert(GFS2_SB(inode), (change >= 0 || inode->i_blocks > -change));
57 change *= (GFS2_SB(inode)->sd_sb.sb_bsize/GFS2_BASIC_BLOCK);
58 inode->i_blocks += change;
59}
60
47static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr, 61static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr,
48 u64 no_formal_ino) 62 u64 no_formal_ino)
49{ 63{
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index e87412902bed..301c94596678 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -981,8 +981,9 @@ static int setattr_chown(struct inode *inode, struct iattr *attr)
981 brelse(dibh); 981 brelse(dibh);
982 982
983 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) { 983 if (ouid != NO_QUOTA_CHANGE || ogid != NO_QUOTA_CHANGE) {
984 gfs2_quota_change(ip, -ip->i_di.di_blocks, ouid, ogid); 984 u64 blocks = gfs2_get_inode_blocks(&ip->i_inode);
985 gfs2_quota_change(ip, ip->i_di.di_blocks, nuid, ngid); 985 gfs2_quota_change(ip, -blocks, ouid, ogid);
986 gfs2_quota_change(ip, blocks, nuid, ngid);
986 } 987 }
987 988
988out_end_trans: 989out_end_trans: