aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Whitehouse <swhiteho@redhat.com>2007-05-15 10:37:50 -0400
committerSteven Whitehouse <swhiteho@redhat.com>2007-07-09 03:22:24 -0400
commitdbb7cae2a36170cd17ffbe286ec0c91a998740ff (patch)
tree1f4da65b07ac31648fe9b72f2742075486a86008
parent41d7db0ab437bc84f8a6e77cccc626ce937605ac (diff)
[GFS2] Clean up inode number handling
This patch cleans up the inode number handling code. The main difference is that instead of looking up the inodes using a struct gfs2_inum_host we now use just the no_addr member of this structure. The tests relating to no_formal_ino can then be done by the calling code. This has advantages in that we want to do different things in different code paths if the no_formal_ino doesn't match. In the NFS patch we want to return -ESTALE, but in the ->lookup() path, its a bug in the fs if the no_formal_ino doesn't match and thus we can withdraw in this case. In order to later fix bz #201012, we need to be able to look up an inode without knowing no_formal_ino, as the only information that is known to us is the on-disk location of the inode in question. This patch will also help us to fix bz #236099 at a later date by cleaning up a lot of the code in that area. There are no user visible changes as a result of this patch and there are no changes to the on-disk format either. Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
-rw-r--r--fs/gfs2/bmap.c2
-rw-r--r--fs/gfs2/dir.c56
-rw-r--r--fs/gfs2/dir.h9
-rw-r--r--fs/gfs2/glock.c4
-rw-r--r--fs/gfs2/incore.h4
-rw-r--r--fs/gfs2/inode.c80
-rw-r--r--fs/gfs2/inode.h18
-rw-r--r--fs/gfs2/meta_io.h2
-rw-r--r--fs/gfs2/ondisk.c37
-rw-r--r--fs/gfs2/ops_address.c4
-rw-r--r--fs/gfs2/ops_dentry.c24
-rw-r--r--fs/gfs2/ops_export.c29
-rw-r--r--fs/gfs2/ops_file.c4
-rw-r--r--fs/gfs2/ops_fstype.c16
-rw-r--r--fs/gfs2/ops_inode.c20
-rw-r--r--fs/gfs2/rgrp.c6
-rw-r--r--fs/gfs2/super.c2
-rw-r--r--fs/gfs2/util.c4
-rw-r--r--include/linux/gfs2_ondisk.h11
19 files changed, 162 insertions, 170 deletions
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
index 1c40c4bbf379..e76a887a89b2 100644
--- a/fs/gfs2/bmap.c
+++ b/fs/gfs2/bmap.c
@@ -1040,7 +1040,7 @@ static int trunc_end(struct gfs2_inode *ip)
1040 ip->i_di.di_height = 0; 1040 ip->i_di.di_height = 0;
1041 ip->i_di.di_goal_meta = 1041 ip->i_di.di_goal_meta =
1042 ip->i_di.di_goal_data = 1042 ip->i_di.di_goal_data =
1043 ip->i_num.no_addr; 1043 ip->i_no_addr;
1044 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode)); 1044 gfs2_buffer_clear_tail(dibh, sizeof(struct gfs2_dinode));
1045 } 1045 }
1046 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME_SEC; 1046 ip->i_inode.i_mtime = ip->i_inode.i_ctime = CURRENT_TIME_SEC;
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
index a96fa07b3f3b..9cdd71cef59c 100644
--- a/fs/gfs2/dir.c
+++ b/fs/gfs2/dir.c
@@ -1456,7 +1456,7 @@ int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque,
1456 if (dip->i_di.di_entries != g.offset) { 1456 if (dip->i_di.di_entries != g.offset) {
1457 fs_warn(sdp, "Number of entries corrupt in dir %llu, " 1457 fs_warn(sdp, "Number of entries corrupt in dir %llu, "
1458 "ip->i_di.di_entries (%u) != g.offset (%u)\n", 1458 "ip->i_di.di_entries (%u) != g.offset (%u)\n",
1459 (unsigned long long)dip->i_num.no_addr, 1459 (unsigned long long)dip->i_no_addr,
1460 dip->i_di.di_entries, 1460 dip->i_di.di_entries,
1461 g.offset); 1461 g.offset);
1462 error = -EIO; 1462 error = -EIO;
@@ -1488,24 +1488,54 @@ out:
1488 * Returns: errno 1488 * Returns: errno
1489 */ 1489 */
1490 1490
1491int gfs2_dir_search(struct inode *dir, const struct qstr *name, 1491struct inode *gfs2_dir_search(struct inode *dir, const struct qstr *name)
1492 struct gfs2_inum_host *inum, unsigned int *type)
1493{ 1492{
1494 struct buffer_head *bh; 1493 struct buffer_head *bh;
1495 struct gfs2_dirent *dent; 1494 struct gfs2_dirent *dent;
1495 struct inode *inode;
1496
1497 dent = gfs2_dirent_search(dir, name, gfs2_dirent_find, &bh);
1498 if (dent) {
1499 if (IS_ERR(dent))
1500 return ERR_PTR(PTR_ERR(dent));
1501 inode = gfs2_inode_lookup(dir->i_sb,
1502 be64_to_cpu(dent->de_inum.no_addr),
1503 be16_to_cpu(dent->de_type));
1504 brelse(bh);
1505 return inode;
1506 }
1507 return ERR_PTR(-ENOENT);
1508}
1509
1510int gfs2_dir_check(struct inode *dir, const struct qstr *name,
1511 const struct gfs2_inode *ip)
1512{
1513 struct buffer_head *bh;
1514 struct gfs2_dirent *dent;
1515 int ret = -ENOENT;
1496 1516
1497 dent = gfs2_dirent_search(dir, name, gfs2_dirent_find, &bh); 1517 dent = gfs2_dirent_search(dir, name, gfs2_dirent_find, &bh);
1498 if (dent) { 1518 if (dent) {
1499 if (IS_ERR(dent)) 1519 if (IS_ERR(dent))
1500 return PTR_ERR(dent); 1520 return PTR_ERR(dent);
1501 if (inum) 1521 if (ip) {
1502 gfs2_inum_in(inum, (char *)&dent->de_inum); 1522 if (be64_to_cpu(dent->de_inum.no_addr) != ip->i_no_addr)
1503 if (type) 1523 goto out;
1504 *type = be16_to_cpu(dent->de_type); 1524 if (be64_to_cpu(dent->de_inum.no_formal_ino) !=
1525 ip->i_no_formal_ino)
1526 goto out;
1527 if (unlikely(IF2DT(ip->i_inode.i_mode) !=
1528 be16_to_cpu(dent->de_type))) {
1529 gfs2_consist_inode(GFS2_I(dir));
1530 ret = -EIO;
1531 goto out;
1532 }
1533 }
1534 ret = 0;
1535out:
1505 brelse(bh); 1536 brelse(bh);
1506 return 0;
1507 } 1537 }
1508 return -ENOENT; 1538 return ret;
1509} 1539}
1510 1540
1511static int dir_new_leaf(struct inode *inode, const struct qstr *name) 1541static int dir_new_leaf(struct inode *inode, const struct qstr *name)
@@ -1565,7 +1595,7 @@ static int dir_new_leaf(struct inode *inode, const struct qstr *name)
1565 */ 1595 */
1566 1596
1567int gfs2_dir_add(struct inode *inode, const struct qstr *name, 1597int gfs2_dir_add(struct inode *inode, const struct qstr *name,
1568 const struct gfs2_inum_host *inum, unsigned type) 1598 const struct gfs2_inode *nip, unsigned type)
1569{ 1599{
1570 struct gfs2_inode *ip = GFS2_I(inode); 1600 struct gfs2_inode *ip = GFS2_I(inode);
1571 struct buffer_head *bh; 1601 struct buffer_head *bh;
@@ -1580,7 +1610,7 @@ int gfs2_dir_add(struct inode *inode, const struct qstr *name,
1580 if (IS_ERR(dent)) 1610 if (IS_ERR(dent))
1581 return PTR_ERR(dent); 1611 return PTR_ERR(dent);
1582 dent = gfs2_init_dirent(inode, dent, name, bh); 1612 dent = gfs2_init_dirent(inode, dent, name, bh);
1583 gfs2_inum_out(inum, (char *)&dent->de_inum); 1613 gfs2_inum_out(nip, dent);
1584 dent->de_type = cpu_to_be16(type); 1614 dent->de_type = cpu_to_be16(type);
1585 if (ip->i_di.di_flags & GFS2_DIF_EXHASH) { 1615 if (ip->i_di.di_flags & GFS2_DIF_EXHASH) {
1586 leaf = (struct gfs2_leaf *)bh->b_data; 1616 leaf = (struct gfs2_leaf *)bh->b_data;
@@ -1700,7 +1730,7 @@ int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *name)
1700 */ 1730 */
1701 1731
1702int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename, 1732int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
1703 struct gfs2_inum_host *inum, unsigned int new_type) 1733 const struct gfs2_inode *nip, unsigned int new_type)
1704{ 1734{
1705 struct buffer_head *bh; 1735 struct buffer_head *bh;
1706 struct gfs2_dirent *dent; 1736 struct gfs2_dirent *dent;
@@ -1715,7 +1745,7 @@ int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
1715 return PTR_ERR(dent); 1745 return PTR_ERR(dent);
1716 1746
1717 gfs2_trans_add_bh(dip->i_gl, bh, 1); 1747 gfs2_trans_add_bh(dip->i_gl, bh, 1);
1718 gfs2_inum_out(inum, (char *)&dent->de_inum); 1748 gfs2_inum_out(nip, dent);
1719 dent->de_type = cpu_to_be16(new_type); 1749 dent->de_type = cpu_to_be16(new_type);
1720 1750
1721 if (dip->i_di.di_flags & GFS2_DIF_EXHASH) { 1751 if (dip->i_di.di_flags & GFS2_DIF_EXHASH) {
diff --git a/fs/gfs2/dir.h b/fs/gfs2/dir.h
index 48fe89046bba..8a468cac9328 100644
--- a/fs/gfs2/dir.h
+++ b/fs/gfs2/dir.h
@@ -16,15 +16,16 @@ struct inode;
16struct gfs2_inode; 16struct gfs2_inode;
17struct gfs2_inum; 17struct gfs2_inum;
18 18
19int gfs2_dir_search(struct inode *dir, const struct qstr *filename, 19struct inode *gfs2_dir_search(struct inode *dir, const struct qstr *filename);
20 struct gfs2_inum_host *inum, unsigned int *type); 20int gfs2_dir_check(struct inode *dir, const struct qstr *filename,
21 const struct gfs2_inode *ip);
21int gfs2_dir_add(struct inode *inode, const struct qstr *filename, 22int gfs2_dir_add(struct inode *inode, const struct qstr *filename,
22 const struct gfs2_inum_host *inum, unsigned int type); 23 const struct gfs2_inode *ip, unsigned int type);
23int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *filename); 24int gfs2_dir_del(struct gfs2_inode *dip, const struct qstr *filename);
24int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque, 25int gfs2_dir_read(struct inode *inode, u64 *offset, void *opaque,
25 filldir_t filldir); 26 filldir_t filldir);
26int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename, 27int gfs2_dir_mvino(struct gfs2_inode *dip, const struct qstr *filename,
27 struct gfs2_inum_host *new_inum, unsigned int new_type); 28 const struct gfs2_inode *nip, unsigned int new_type);
28 29
29int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip); 30int gfs2_dir_exhash_dealloc(struct gfs2_inode *dip);
30 31
diff --git a/fs/gfs2/glock.c b/fs/gfs2/glock.c
index c66c718013ef..b3ed58551e74 100644
--- a/fs/gfs2/glock.c
+++ b/fs/gfs2/glock.c
@@ -1823,8 +1823,8 @@ static int dump_inode(struct glock_iter *gi, struct gfs2_inode *ip)
1823 1823
1824 print_dbg(gi, " Inode:\n"); 1824 print_dbg(gi, " Inode:\n");
1825 print_dbg(gi, " num = %llu/%llu\n", 1825 print_dbg(gi, " num = %llu/%llu\n",
1826 (unsigned long long)ip->i_num.no_formal_ino, 1826 (unsigned long long)ip->i_no_formal_ino,
1827 (unsigned long long)ip->i_num.no_addr); 1827 (unsigned long long)ip->i_no_addr);
1828 print_dbg(gi, " type = %u\n", IF2DT(ip->i_inode.i_mode)); 1828 print_dbg(gi, " type = %u\n", IF2DT(ip->i_inode.i_mode));
1829 print_dbg(gi, " i_flags ="); 1829 print_dbg(gi, " i_flags =");
1830 for (x = 0; x < 32; x++) 1830 for (x = 0; x < 32; x++)
diff --git a/fs/gfs2/incore.h b/fs/gfs2/incore.h
index d995441373ab..00c3004a4c22 100644
--- a/fs/gfs2/incore.h
+++ b/fs/gfs2/incore.h
@@ -213,8 +213,8 @@ enum {
213 213
214struct gfs2_inode { 214struct gfs2_inode {
215 struct inode i_inode; 215 struct inode i_inode;
216 struct gfs2_inum_host i_num; 216 u64 i_no_addr;
217 217 u64 i_no_formal_ino;
218 unsigned long i_flags; /* GIF_... */ 218 unsigned long i_flags; /* GIF_... */
219 219
220 struct gfs2_dinode_host i_di; /* To be replaced by ref to block */ 220 struct gfs2_dinode_host i_di; /* To be replaced by ref to block */
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
index df0b8b3018b9..58f5a67e1c35 100644
--- a/fs/gfs2/inode.c
+++ b/fs/gfs2/inode.c
@@ -41,9 +41,9 @@
41static int iget_test(struct inode *inode, void *opaque) 41static int iget_test(struct inode *inode, void *opaque)
42{ 42{
43 struct gfs2_inode *ip = GFS2_I(inode); 43 struct gfs2_inode *ip = GFS2_I(inode);
44 struct gfs2_inum_host *inum = opaque; 44 u64 *no_addr = opaque;
45 45
46 if (ip->i_num.no_addr == inum->no_addr && 46 if (ip->i_no_addr == *no_addr &&
47 inode->i_private != NULL) 47 inode->i_private != NULL)
48 return 1; 48 return 1;
49 49
@@ -53,37 +53,37 @@ static int iget_test(struct inode *inode, void *opaque)
53static int iget_set(struct inode *inode, void *opaque) 53static int iget_set(struct inode *inode, void *opaque)
54{ 54{
55 struct gfs2_inode *ip = GFS2_I(inode); 55 struct gfs2_inode *ip = GFS2_I(inode);
56 struct gfs2_inum_host *inum = opaque; 56 u64 *no_addr = opaque;
57 57
58 ip->i_num = *inum; 58 inode->i_ino = (unsigned long)*no_addr;
59 inode->i_ino = inum->no_addr; 59 ip->i_no_addr = *no_addr;
60 return 0; 60 return 0;
61} 61}
62 62
63struct inode *gfs2_ilookup(struct super_block *sb, struct gfs2_inum_host *inum) 63struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr)
64{ 64{
65 return ilookup5(sb, (unsigned long)inum->no_addr, 65 unsigned long hash = (unsigned long)no_addr;
66 iget_test, inum); 66 return ilookup5(sb, hash, iget_test, &no_addr);
67} 67}
68 68
69static struct inode *gfs2_iget(struct super_block *sb, struct gfs2_inum_host *inum) 69static struct inode *gfs2_iget(struct super_block *sb, u64 no_addr)
70{ 70{
71 return iget5_locked(sb, (unsigned long)inum->no_addr, 71 unsigned long hash = (unsigned long)no_addr;
72 iget_test, iget_set, inum); 72 return iget5_locked(sb, hash, iget_test, iget_set, &no_addr);
73} 73}
74 74
75/** 75/**
76 * gfs2_inode_lookup - Lookup an inode 76 * gfs2_inode_lookup - Lookup an inode
77 * @sb: The super block 77 * @sb: The super block
78 * @inum: The inode number 78 * @no_addr: The inode number
79 * @type: The type of the inode 79 * @type: The type of the inode
80 * 80 *
81 * Returns: A VFS inode, or an error 81 * Returns: A VFS inode, or an error
82 */ 82 */
83 83
84struct inode *gfs2_inode_lookup(struct super_block *sb, struct gfs2_inum_host *inum, unsigned int type) 84struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned int type)
85{ 85{
86 struct inode *inode = gfs2_iget(sb, inum); 86 struct inode *inode = gfs2_iget(sb, no_addr);
87 struct gfs2_inode *ip = GFS2_I(inode); 87 struct gfs2_inode *ip = GFS2_I(inode);
88 struct gfs2_glock *io_gl; 88 struct gfs2_glock *io_gl;
89 int error; 89 int error;
@@ -110,12 +110,12 @@ struct inode *gfs2_inode_lookup(struct super_block *sb, struct gfs2_inum_host *i
110 inode->i_op = &gfs2_dev_iops; 110 inode->i_op = &gfs2_dev_iops;
111 } 111 }
112 112
113 error = gfs2_glock_get(sdp, inum->no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl); 113 error = gfs2_glock_get(sdp, no_addr, &gfs2_inode_glops, CREATE, &ip->i_gl);
114 if (unlikely(error)) 114 if (unlikely(error))
115 goto fail; 115 goto fail;
116 ip->i_gl->gl_object = ip; 116 ip->i_gl->gl_object = ip;
117 117
118 error = gfs2_glock_get(sdp, inum->no_addr, &gfs2_iopen_glops, CREATE, &io_gl); 118 error = gfs2_glock_get(sdp, no_addr, &gfs2_iopen_glops, CREATE, &io_gl);
119 if (unlikely(error)) 119 if (unlikely(error))
120 goto fail_put; 120 goto fail_put;
121 121
@@ -144,14 +144,12 @@ static int gfs2_dinode_in(struct gfs2_inode *ip, const void *buf)
144 struct gfs2_dinode_host *di = &ip->i_di; 144 struct gfs2_dinode_host *di = &ip->i_di;
145 const struct gfs2_dinode *str = buf; 145 const struct gfs2_dinode *str = buf;
146 146
147 if (ip->i_num.no_addr != be64_to_cpu(str->di_num.no_addr)) { 147 if (ip->i_no_addr != be64_to_cpu(str->di_num.no_addr)) {
148 if (gfs2_consist_inode(ip)) 148 if (gfs2_consist_inode(ip))
149 gfs2_dinode_print(ip); 149 gfs2_dinode_print(ip);
150 return -EIO; 150 return -EIO;
151 } 151 }
152 if (ip->i_num.no_formal_ino != be64_to_cpu(str->di_num.no_formal_ino)) 152 ip->i_no_formal_ino = be64_to_cpu(str->di_num.no_formal_ino);
153 return -ESTALE;
154
155 ip->i_inode.i_mode = be32_to_cpu(str->di_mode); 153 ip->i_inode.i_mode = be32_to_cpu(str->di_mode);
156 ip->i_inode.i_rdev = 0; 154 ip->i_inode.i_rdev = 0;
157 switch (ip->i_inode.i_mode & S_IFMT) { 155 switch (ip->i_inode.i_mode & S_IFMT) {
@@ -247,7 +245,7 @@ int gfs2_dinode_dealloc(struct gfs2_inode *ip)
247 if (error) 245 if (error)
248 goto out_qs; 246 goto out_qs;
249 247
250 rgd = gfs2_blk2rgrpd(sdp, ip->i_num.no_addr); 248 rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
251 if (!rgd) { 249 if (!rgd) {
252 gfs2_consist_inode(ip); 250 gfs2_consist_inode(ip);
253 error = -EIO; 251 error = -EIO;
@@ -366,8 +364,6 @@ struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
366 struct super_block *sb = dir->i_sb; 364 struct super_block *sb = dir->i_sb;
367 struct gfs2_inode *dip = GFS2_I(dir); 365 struct gfs2_inode *dip = GFS2_I(dir);
368 struct gfs2_holder d_gh; 366 struct gfs2_holder d_gh;
369 struct gfs2_inum_host inum;
370 unsigned int type;
371 int error; 367 int error;
372 struct inode *inode = NULL; 368 struct inode *inode = NULL;
373 int unlock = 0; 369 int unlock = 0;
@@ -395,12 +391,9 @@ struct inode *gfs2_lookupi(struct inode *dir, const struct qstr *name,
395 goto out; 391 goto out;
396 } 392 }
397 393
398 error = gfs2_dir_search(dir, name, &inum, &type); 394 inode = gfs2_dir_search(dir, name);
399 if (error) 395 if (IS_ERR(inode))
400 goto out; 396 error = PTR_ERR(inode);
401
402 inode = gfs2_inode_lookup(sb, &inum, type);
403
404out: 397out:
405 if (unlock) 398 if (unlock)
406 gfs2_glock_dq_uninit(&d_gh); 399 gfs2_glock_dq_uninit(&d_gh);
@@ -548,7 +541,7 @@ static int create_ok(struct gfs2_inode *dip, const struct qstr *name,
548 if (!dip->i_inode.i_nlink) 541 if (!dip->i_inode.i_nlink)
549 return -EPERM; 542 return -EPERM;
550 543
551 error = gfs2_dir_search(&dip->i_inode, name, NULL, NULL); 544 error = gfs2_dir_check(&dip->i_inode, name, NULL);
552 switch (error) { 545 switch (error) {
553 case -ENOENT: 546 case -ENOENT:
554 error = 0; 547 error = 0;
@@ -588,8 +581,7 @@ static void munge_mode_uid_gid(struct gfs2_inode *dip, unsigned int *mode,
588 *gid = current->fsgid; 581 *gid = current->fsgid;
589} 582}
590 583
591static int alloc_dinode(struct gfs2_inode *dip, struct gfs2_inum_host *inum, 584static int alloc_dinode(struct gfs2_inode *dip, u64 *no_addr, u64 *generation)
592 u64 *generation)
593{ 585{
594 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); 586 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
595 int error; 587 int error;
@@ -605,7 +597,7 @@ static int alloc_dinode(struct gfs2_inode *dip, struct gfs2_inum_host *inum,
605 if (error) 597 if (error)
606 goto out_ipreserv; 598 goto out_ipreserv;
607 599
608 inum->no_addr = gfs2_alloc_di(dip, generation); 600 *no_addr = gfs2_alloc_di(dip, generation);
609 601
610 gfs2_trans_end(sdp); 602 gfs2_trans_end(sdp);
611 603
@@ -760,7 +752,7 @@ static int link_dinode(struct gfs2_inode *dip, const struct qstr *name,
760 goto fail_quota_locks; 752 goto fail_quota_locks;
761 } 753 }
762 754
763 error = gfs2_dir_add(&dip->i_inode, name, &ip->i_num, IF2DT(ip->i_inode.i_mode)); 755 error = gfs2_dir_add(&dip->i_inode, name, ip, IF2DT(ip->i_inode.i_mode));
764 if (error) 756 if (error)
765 goto fail_end_trans; 757 goto fail_end_trans;
766 758
@@ -844,7 +836,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
844 struct gfs2_inode *dip = ghs->gh_gl->gl_object; 836 struct gfs2_inode *dip = ghs->gh_gl->gl_object;
845 struct inode *dir = &dip->i_inode; 837 struct inode *dir = &dip->i_inode;
846 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode); 838 struct gfs2_sbd *sdp = GFS2_SB(&dip->i_inode);
847 struct gfs2_inum_host inum; 839 struct gfs2_inum_host inum = { .no_addr = 0, .no_formal_ino = 0 };
848 int error; 840 int error;
849 u64 generation; 841 u64 generation;
850 842
@@ -864,7 +856,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
864 if (error) 856 if (error)
865 goto fail_gunlock; 857 goto fail_gunlock;
866 858
867 error = alloc_dinode(dip, &inum, &generation); 859 error = alloc_dinode(dip, &inum.no_addr, &generation);
868 if (error) 860 if (error)
869 goto fail_gunlock; 861 goto fail_gunlock;
870 862
@@ -877,7 +869,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
877 if (error) 869 if (error)
878 goto fail_gunlock2; 870 goto fail_gunlock2;
879 871
880 inode = gfs2_inode_lookup(dir->i_sb, &inum, IF2DT(mode)); 872 inode = gfs2_inode_lookup(dir->i_sb, inum.no_addr, IF2DT(mode));
881 if (IS_ERR(inode)) 873 if (IS_ERR(inode))
882 goto fail_gunlock2; 874 goto fail_gunlock2;
883 875
@@ -976,10 +968,8 @@ int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
976 */ 968 */
977 969
978int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, 970int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
979 struct gfs2_inode *ip) 971 const struct gfs2_inode *ip)
980{ 972{
981 struct gfs2_inum_host inum;
982 unsigned int type;
983 int error; 973 int error;
984 974
985 if (IS_IMMUTABLE(&ip->i_inode) || IS_APPEND(&ip->i_inode)) 975 if (IS_IMMUTABLE(&ip->i_inode) || IS_APPEND(&ip->i_inode))
@@ -997,18 +987,10 @@ int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
997 if (error) 987 if (error)
998 return error; 988 return error;
999 989
1000 error = gfs2_dir_search(&dip->i_inode, name, &inum, &type); 990 error = gfs2_dir_check(&dip->i_inode, name, ip);
1001 if (error) 991 if (error)
1002 return error; 992 return error;
1003 993
1004 if (!gfs2_inum_equal(&inum, &ip->i_num))
1005 return -ENOENT;
1006
1007 if (IF2DT(ip->i_inode.i_mode) != type) {
1008 gfs2_consist_inode(dip);
1009 return -EIO;
1010 }
1011
1012 return 0; 994 return 0;
1013} 995}
1014 996
diff --git a/fs/gfs2/inode.h b/fs/gfs2/inode.h
index b57f448b15bc..05fc095d8540 100644
--- a/fs/gfs2/inode.h
+++ b/fs/gfs2/inode.h
@@ -10,17 +10,17 @@
10#ifndef __INODE_DOT_H__ 10#ifndef __INODE_DOT_H__
11#define __INODE_DOT_H__ 11#define __INODE_DOT_H__
12 12
13static inline int gfs2_is_stuffed(struct gfs2_inode *ip) 13static inline int gfs2_is_stuffed(const struct gfs2_inode *ip)
14{ 14{
15 return !ip->i_di.di_height; 15 return !ip->i_di.di_height;
16} 16}
17 17
18static inline int gfs2_is_jdata(struct gfs2_inode *ip) 18static inline int gfs2_is_jdata(const struct gfs2_inode *ip)
19{ 19{
20 return ip->i_di.di_flags & GFS2_DIF_JDATA; 20 return ip->i_di.di_flags & GFS2_DIF_JDATA;
21} 21}
22 22
23static inline int gfs2_is_dir(struct gfs2_inode *ip) 23static inline int gfs2_is_dir(const struct gfs2_inode *ip)
24{ 24{
25 return S_ISDIR(ip->i_inode.i_mode); 25 return S_ISDIR(ip->i_inode.i_mode);
26} 26}
@@ -32,9 +32,15 @@ static inline void gfs2_set_inode_blocks(struct inode *inode)
32 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT); 32 (GFS2_SB(inode)->sd_sb.sb_bsize_shift - GFS2_BASIC_BLOCK_SHIFT);
33} 33}
34 34
35static inline int gfs2_check_inum(const struct gfs2_inode *ip, u64 no_addr,
36 u64 no_formal_ino)
37{
38 return ip->i_no_addr == no_addr && ip->i_no_formal_ino == no_formal_ino;
39}
40
35void gfs2_inode_attr_in(struct gfs2_inode *ip); 41void gfs2_inode_attr_in(struct gfs2_inode *ip);
36struct inode *gfs2_inode_lookup(struct super_block *sb, struct gfs2_inum_host *inum, unsigned type); 42struct inode *gfs2_inode_lookup(struct super_block *sb, u64 no_addr, unsigned type);
37struct inode *gfs2_ilookup(struct super_block *sb, struct gfs2_inum_host *inum); 43struct inode *gfs2_ilookup(struct super_block *sb, u64 no_addr);
38 44
39int gfs2_inode_refresh(struct gfs2_inode *ip); 45int gfs2_inode_refresh(struct gfs2_inode *ip);
40 46
@@ -47,7 +53,7 @@ struct inode *gfs2_createi(struct gfs2_holder *ghs, const struct qstr *name,
47int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name, 53int gfs2_rmdiri(struct gfs2_inode *dip, const struct qstr *name,
48 struct gfs2_inode *ip); 54 struct gfs2_inode *ip);
49int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name, 55int gfs2_unlink_ok(struct gfs2_inode *dip, const struct qstr *name,
50 struct gfs2_inode *ip); 56 const struct gfs2_inode *ip);
51int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to); 57int gfs2_ok_to_move(struct gfs2_inode *this, struct gfs2_inode *to);
52int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len); 58int gfs2_readlinki(struct gfs2_inode *ip, char **buf, unsigned int *len);
53int gfs2_glock_nq_atime(struct gfs2_holder *gh); 59int gfs2_glock_nq_atime(struct gfs2_holder *gh);
diff --git a/fs/gfs2/meta_io.h b/fs/gfs2/meta_io.h
index e037425bc042..527bf19d9690 100644
--- a/fs/gfs2/meta_io.h
+++ b/fs/gfs2/meta_io.h
@@ -63,7 +63,7 @@ int gfs2_meta_indirect_buffer(struct gfs2_inode *ip, int height, u64 num,
63static inline int gfs2_meta_inode_buffer(struct gfs2_inode *ip, 63static inline int gfs2_meta_inode_buffer(struct gfs2_inode *ip,
64 struct buffer_head **bhp) 64 struct buffer_head **bhp)
65{ 65{
66 return gfs2_meta_indirect_buffer(ip, 0, ip->i_num.no_addr, 0, bhp); 66 return gfs2_meta_indirect_buffer(ip, 0, ip->i_no_addr, 0, bhp);
67} 67}
68 68
69struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen); 69struct buffer_head *gfs2_meta_ra(struct gfs2_glock *gl, u64 dblock, u32 extlen);
diff --git a/fs/gfs2/ondisk.c b/fs/gfs2/ondisk.c
index d9ecfd23a49e..cd4cf055c37d 100644
--- a/fs/gfs2/ondisk.c
+++ b/fs/gfs2/ondisk.c
@@ -33,26 +33,10 @@
33 * first arg: the cpu-order structure 33 * first arg: the cpu-order structure
34 */ 34 */
35 35
36void gfs2_inum_in(struct gfs2_inum_host *no, const void *buf) 36void gfs2_inum_out(const struct gfs2_inode *ip, struct gfs2_dirent *dent)
37{ 37{
38 const struct gfs2_inum *str = buf; 38 dent->de_inum.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
39 39 dent->de_inum.no_addr = cpu_to_be64(ip->i_no_addr);
40 no->no_formal_ino = be64_to_cpu(str->no_formal_ino);
41 no->no_addr = be64_to_cpu(str->no_addr);
42}
43
44void gfs2_inum_out(const struct gfs2_inum_host *no, void *buf)
45{
46 struct gfs2_inum *str = buf;
47
48 str->no_formal_ino = cpu_to_be64(no->no_formal_ino);
49 str->no_addr = cpu_to_be64(no->no_addr);
50}
51
52static void gfs2_inum_print(const struct gfs2_inum_host *no)
53{
54 printk(KERN_INFO " no_formal_ino = %llu\n", (unsigned long long)no->no_formal_ino);
55 printk(KERN_INFO " no_addr = %llu\n", (unsigned long long)no->no_addr);
56} 40}
57 41
58static void gfs2_meta_header_in(struct gfs2_meta_header_host *mh, const void *buf) 42static void gfs2_meta_header_in(struct gfs2_meta_header_host *mh, const void *buf)
@@ -74,9 +58,10 @@ void gfs2_sb_in(struct gfs2_sb_host *sb, const void *buf)
74 sb->sb_multihost_format = be32_to_cpu(str->sb_multihost_format); 58 sb->sb_multihost_format = be32_to_cpu(str->sb_multihost_format);
75 sb->sb_bsize = be32_to_cpu(str->sb_bsize); 59 sb->sb_bsize = be32_to_cpu(str->sb_bsize);
76 sb->sb_bsize_shift = be32_to_cpu(str->sb_bsize_shift); 60 sb->sb_bsize_shift = be32_to_cpu(str->sb_bsize_shift);
77 61 sb->sb_master_dir.no_addr = be64_to_cpu(str->sb_master_dir.no_addr);
78 gfs2_inum_in(&sb->sb_master_dir, (char *)&str->sb_master_dir); 62 sb->sb_master_dir.no_formal_ino = be64_to_cpu(str->sb_master_dir.no_formal_ino);
79 gfs2_inum_in(&sb->sb_root_dir, (char *)&str->sb_root_dir); 63 sb->sb_root_dir.no_addr = be64_to_cpu(str->sb_root_dir.no_addr);
64 sb->sb_root_dir.no_formal_ino = be64_to_cpu(str->sb_root_dir.no_formal_ino);
80 65
81 memcpy(sb->sb_lockproto, str->sb_lockproto, GFS2_LOCKNAME_LEN); 66 memcpy(sb->sb_lockproto, str->sb_lockproto, GFS2_LOCKNAME_LEN);
82 memcpy(sb->sb_locktable, str->sb_locktable, GFS2_LOCKNAME_LEN); 67 memcpy(sb->sb_locktable, str->sb_locktable, GFS2_LOCKNAME_LEN);
@@ -146,9 +131,8 @@ void gfs2_dinode_out(const struct gfs2_inode *ip, void *buf)
146 str->di_header.__pad0 = 0; 131 str->di_header.__pad0 = 0;
147 str->di_header.mh_format = cpu_to_be32(GFS2_FORMAT_DI); 132 str->di_header.mh_format = cpu_to_be32(GFS2_FORMAT_DI);
148 str->di_header.__pad1 = 0; 133 str->di_header.__pad1 = 0;
149 134 str->di_num.no_addr = cpu_to_be64(ip->i_no_addr);
150 gfs2_inum_out(&ip->i_num, &str->di_num); 135 str->di_num.no_formal_ino = cpu_to_be64(ip->i_no_formal_ino);
151
152 str->di_mode = cpu_to_be32(ip->i_inode.i_mode); 136 str->di_mode = cpu_to_be32(ip->i_inode.i_mode);
153 str->di_uid = cpu_to_be32(ip->i_inode.i_uid); 137 str->di_uid = cpu_to_be32(ip->i_inode.i_uid);
154 str->di_gid = cpu_to_be32(ip->i_inode.i_gid); 138 str->di_gid = cpu_to_be32(ip->i_inode.i_gid);
@@ -178,7 +162,8 @@ void gfs2_dinode_print(const struct gfs2_inode *ip)
178{ 162{
179 const struct gfs2_dinode_host *di = &ip->i_di; 163 const struct gfs2_dinode_host *di = &ip->i_di;
180 164
181 gfs2_inum_print(&ip->i_num); 165 printk(KERN_INFO " no_formal_ino = %llu\n", (unsigned long long)ip->i_no_formal_ino);
166 printk(KERN_INFO " no_addr = %llu\n", (unsigned long long)ip->i_no_addr);
182 167
183 printk(KERN_INFO " di_size = %llu\n", (unsigned long long)di->di_size); 168 printk(KERN_INFO " di_size = %llu\n", (unsigned long long)di->di_size);
184 printk(KERN_INFO " di_blocks = %llu\n", (unsigned long long)di->di_blocks); 169 printk(KERN_INFO " di_blocks = %llu\n", (unsigned long long)di->di_blocks);
diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
index 4913ef57b095..fb84478e1df6 100644
--- a/fs/gfs2/ops_address.c
+++ b/fs/gfs2/ops_address.c
@@ -757,8 +757,8 @@ static unsigned limit = 0;
757 return; 757 return;
758 758
759 fs_warn(sdp, "ip = %llu %llu\n", 759 fs_warn(sdp, "ip = %llu %llu\n",
760 (unsigned long long)ip->i_num.no_formal_ino, 760 (unsigned long long)ip->i_no_formal_ino,
761 (unsigned long long)ip->i_num.no_addr); 761 (unsigned long long)ip->i_no_addr);
762 762
763 for (x = 0; x < GFS2_MAX_META_HEIGHT; x++) 763 for (x = 0; x < GFS2_MAX_META_HEIGHT; x++)
764 fs_warn(sdp, "ip->i_cache[%u] = %s\n", 764 fs_warn(sdp, "ip->i_cache[%u] = %s\n",
diff --git a/fs/gfs2/ops_dentry.c b/fs/gfs2/ops_dentry.c
index a6fdc52f554a..793e334d098e 100644
--- a/fs/gfs2/ops_dentry.c
+++ b/fs/gfs2/ops_dentry.c
@@ -21,6 +21,7 @@
21#include "glock.h" 21#include "glock.h"
22#include "ops_dentry.h" 22#include "ops_dentry.h"
23#include "util.h" 23#include "util.h"
24#include "inode.h"
24 25
25/** 26/**
26 * gfs2_drevalidate - Check directory lookup consistency 27 * gfs2_drevalidate - Check directory lookup consistency
@@ -40,14 +41,15 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd)
40 struct gfs2_inode *dip = GFS2_I(parent->d_inode); 41 struct gfs2_inode *dip = GFS2_I(parent->d_inode);
41 struct inode *inode = dentry->d_inode; 42 struct inode *inode = dentry->d_inode;
42 struct gfs2_holder d_gh; 43 struct gfs2_holder d_gh;
43 struct gfs2_inode *ip; 44 struct gfs2_inode *ip = NULL;
44 struct gfs2_inum_host inum;
45 unsigned int type;
46 int error; 45 int error;
47 int had_lock=0; 46 int had_lock=0;
48 47
49 if (inode && is_bad_inode(inode)) 48 if (inode) {
50 goto invalid; 49 if (is_bad_inode(inode))
50 goto invalid;
51 ip = GFS2_I(inode);
52 }
51 53
52 if (sdp->sd_args.ar_localcaching) 54 if (sdp->sd_args.ar_localcaching)
53 goto valid; 55 goto valid;
@@ -59,7 +61,7 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd)
59 goto fail; 61 goto fail;
60 } 62 }
61 63
62 error = gfs2_dir_search(parent->d_inode, &dentry->d_name, &inum, &type); 64 error = gfs2_dir_check(parent->d_inode, &dentry->d_name, ip);
63 switch (error) { 65 switch (error) {
64 case 0: 66 case 0:
65 if (!inode) 67 if (!inode)
@@ -73,16 +75,6 @@ static int gfs2_drevalidate(struct dentry *dentry, struct nameidata *nd)
73 goto fail_gunlock; 75 goto fail_gunlock;
74 } 76 }
75 77
76 ip = GFS2_I(inode);
77
78 if (!gfs2_inum_equal(&ip->i_num, &inum))
79 goto invalid_gunlock;
80
81 if (IF2DT(ip->i_inode.i_mode) != type) {
82 gfs2_consist_inode(dip);
83 goto fail_gunlock;
84 }
85
86valid_gunlock: 78valid_gunlock:
87 if (!had_lock) 79 if (!had_lock)
88 gfs2_glock_dq_uninit(&d_gh); 80 gfs2_glock_dq_uninit(&d_gh);
diff --git a/fs/gfs2/ops_export.c b/fs/gfs2/ops_export.c
index aad918337a46..51a8a14deb29 100644
--- a/fs/gfs2/ops_export.c
+++ b/fs/gfs2/ops_export.c
@@ -75,10 +75,10 @@ static int gfs2_encode_fh(struct dentry *dentry, __u32 *p, int *len,
75 (connectable && *len < GFS2_LARGE_FH_SIZE)) 75 (connectable && *len < GFS2_LARGE_FH_SIZE))
76 return 255; 76 return 255;
77 77
78 fh[0] = cpu_to_be32(ip->i_num.no_formal_ino >> 32); 78 fh[0] = cpu_to_be32(ip->i_no_formal_ino >> 32);
79 fh[1] = cpu_to_be32(ip->i_num.no_formal_ino & 0xFFFFFFFF); 79 fh[1] = cpu_to_be32(ip->i_no_formal_ino & 0xFFFFFFFF);
80 fh[2] = cpu_to_be32(ip->i_num.no_addr >> 32); 80 fh[2] = cpu_to_be32(ip->i_no_addr >> 32);
81 fh[3] = cpu_to_be32(ip->i_num.no_addr & 0xFFFFFFFF); 81 fh[3] = cpu_to_be32(ip->i_no_addr & 0xFFFFFFFF);
82 *len = GFS2_SMALL_FH_SIZE; 82 *len = GFS2_SMALL_FH_SIZE;
83 83
84 if (!connectable || inode == sb->s_root->d_inode) 84 if (!connectable || inode == sb->s_root->d_inode)
@@ -90,10 +90,10 @@ static int gfs2_encode_fh(struct dentry *dentry, __u32 *p, int *len,
90 igrab(inode); 90 igrab(inode);
91 spin_unlock(&dentry->d_lock); 91 spin_unlock(&dentry->d_lock);
92 92
93 fh[4] = cpu_to_be32(ip->i_num.no_formal_ino >> 32); 93 fh[4] = cpu_to_be32(ip->i_no_formal_ino >> 32);
94 fh[5] = cpu_to_be32(ip->i_num.no_formal_ino & 0xFFFFFFFF); 94 fh[5] = cpu_to_be32(ip->i_no_formal_ino & 0xFFFFFFFF);
95 fh[6] = cpu_to_be32(ip->i_num.no_addr >> 32); 95 fh[6] = cpu_to_be32(ip->i_no_addr >> 32);
96 fh[7] = cpu_to_be32(ip->i_num.no_addr & 0xFFFFFFFF); 96 fh[7] = cpu_to_be32(ip->i_no_addr & 0xFFFFFFFF);
97 97
98 fh[8] = cpu_to_be32(inode->i_mode); 98 fh[8] = cpu_to_be32(inode->i_mode);
99 fh[9] = 0; /* pad to double word */ 99 fh[9] = 0; /* pad to double word */
@@ -144,7 +144,8 @@ static int gfs2_get_name(struct dentry *parent, char *name,
144 ip = GFS2_I(inode); 144 ip = GFS2_I(inode);
145 145
146 *name = 0; 146 *name = 0;
147 gnfd.inum = ip->i_num; 147 gnfd.inum.no_addr = ip->i_no_addr;
148 gnfd.inum.no_formal_ino = ip->i_no_formal_ino;
148 gnfd.name = name; 149 gnfd.name = name;
149 150
150 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &gh); 151 error = gfs2_glock_nq_init(dip->i_gl, LM_ST_SHARED, 0, &gh);
@@ -202,9 +203,9 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_obj)
202 203
203 /* System files? */ 204 /* System files? */
204 205
205 inode = gfs2_ilookup(sb, inum); 206 inode = gfs2_ilookup(sb, inum->no_addr);
206 if (inode) { 207 if (inode) {
207 if (GFS2_I(inode)->i_num.no_formal_ino != inum->no_formal_ino) { 208 if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) {
208 iput(inode); 209 iput(inode);
209 return ERR_PTR(-ESTALE); 210 return ERR_PTR(-ESTALE);
210 } 211 }
@@ -236,7 +237,7 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_obj)
236 gfs2_glock_dq_uninit(&rgd_gh); 237 gfs2_glock_dq_uninit(&rgd_gh);
237 gfs2_glock_dq_uninit(&ri_gh); 238 gfs2_glock_dq_uninit(&ri_gh);
238 239
239 inode = gfs2_inode_lookup(sb, inum, fh_obj->imode); 240 inode = gfs2_inode_lookup(sb, inum->no_addr, fh_obj->imode);
240 if (!inode) 241 if (!inode)
241 goto fail; 242 goto fail;
242 if (IS_ERR(inode)) { 243 if (IS_ERR(inode)) {
@@ -249,6 +250,10 @@ static struct dentry *gfs2_get_dentry(struct super_block *sb, void *inum_obj)
249 iput(inode); 250 iput(inode);
250 goto fail; 251 goto fail;
251 } 252 }
253 if (GFS2_I(inode)->i_no_formal_ino != inum->no_formal_ino) {
254 iput(inode);
255 goto fail;
256 }
252 257
253 error = -EIO; 258 error = -EIO;
254 if (GFS2_I(inode)->i_di.di_flags & GFS2_DIF_SYSTEM) { 259 if (GFS2_I(inode)->i_di.di_flags & GFS2_DIF_SYSTEM) {
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c
index 064df8804582..550032c3b5f7 100644
--- a/fs/gfs2/ops_file.c
+++ b/fs/gfs2/ops_file.c
@@ -502,7 +502,7 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl)
502 struct gfs2_inode *ip = GFS2_I(file->f_mapping->host); 502 struct gfs2_inode *ip = GFS2_I(file->f_mapping->host);
503 struct gfs2_sbd *sdp = GFS2_SB(file->f_mapping->host); 503 struct gfs2_sbd *sdp = GFS2_SB(file->f_mapping->host);
504 struct lm_lockname name = 504 struct lm_lockname name =
505 { .ln_number = ip->i_num.no_addr, 505 { .ln_number = ip->i_no_addr,
506 .ln_type = LM_TYPE_PLOCK }; 506 .ln_type = LM_TYPE_PLOCK };
507 507
508 if (!(fl->fl_flags & FL_POSIX)) 508 if (!(fl->fl_flags & FL_POSIX))
@@ -557,7 +557,7 @@ static int do_flock(struct file *file, int cmd, struct file_lock *fl)
557 gfs2_glock_dq_uninit(fl_gh); 557 gfs2_glock_dq_uninit(fl_gh);
558 } else { 558 } else {
559 error = gfs2_glock_get(GFS2_SB(&ip->i_inode), 559 error = gfs2_glock_get(GFS2_SB(&ip->i_inode),
560 ip->i_num.no_addr, &gfs2_flock_glops, 560 ip->i_no_addr, &gfs2_flock_glops,
561 CREATE, &gl); 561 CREATE, &gl);
562 if (error) 562 if (error)
563 goto out; 563 goto out;
diff --git a/fs/gfs2/ops_fstype.c b/fs/gfs2/ops_fstype.c
index 2c5f8e7def0d..c682371717ff 100644
--- a/fs/gfs2/ops_fstype.c
+++ b/fs/gfs2/ops_fstype.c
@@ -236,17 +236,17 @@ fail:
236 return error; 236 return error;
237} 237}
238 238
239static struct inode *gfs2_lookup_root(struct super_block *sb, 239static inline struct inode *gfs2_lookup_root(struct super_block *sb,
240 struct gfs2_inum_host *inum) 240 u64 no_addr)
241{ 241{
242 return gfs2_inode_lookup(sb, inum, DT_DIR); 242 return gfs2_inode_lookup(sb, no_addr, DT_DIR);
243} 243}
244 244
245static int init_sb(struct gfs2_sbd *sdp, int silent, int undo) 245static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
246{ 246{
247 struct super_block *sb = sdp->sd_vfs; 247 struct super_block *sb = sdp->sd_vfs;
248 struct gfs2_holder sb_gh; 248 struct gfs2_holder sb_gh;
249 struct gfs2_inum_host *inum; 249 u64 no_addr;
250 struct inode *inode; 250 struct inode *inode;
251 int error = 0; 251 int error = 0;
252 252
@@ -289,10 +289,10 @@ static int init_sb(struct gfs2_sbd *sdp, int silent, int undo)
289 sb_set_blocksize(sb, sdp->sd_sb.sb_bsize); 289 sb_set_blocksize(sb, sdp->sd_sb.sb_bsize);
290 290
291 /* Get the root inode */ 291 /* Get the root inode */
292 inum = &sdp->sd_sb.sb_root_dir; 292 no_addr = sdp->sd_sb.sb_root_dir.no_addr;
293 if (sb->s_type == &gfs2meta_fs_type) 293 if (sb->s_type == &gfs2meta_fs_type)
294 inum = &sdp->sd_sb.sb_master_dir; 294 no_addr = sdp->sd_sb.sb_master_dir.no_addr;
295 inode = gfs2_lookup_root(sb, inum); 295 inode = gfs2_lookup_root(sb, no_addr);
296 if (IS_ERR(inode)) { 296 if (IS_ERR(inode)) {
297 error = PTR_ERR(inode); 297 error = PTR_ERR(inode);
298 fs_err(sdp, "can't read in root inode: %d\n", error); 298 fs_err(sdp, "can't read in root inode: %d\n", error);
@@ -449,7 +449,7 @@ static int init_inodes(struct gfs2_sbd *sdp, int undo)
449 if (undo) 449 if (undo)
450 goto fail_qinode; 450 goto fail_qinode;
451 451
452 inode = gfs2_lookup_root(sdp->sd_vfs, &sdp->sd_sb.sb_master_dir); 452 inode = gfs2_lookup_root(sdp->sd_vfs, sdp->sd_sb.sb_master_dir.no_addr);
453 if (IS_ERR(inode)) { 453 if (IS_ERR(inode)) {
454 error = PTR_ERR(inode); 454 error = PTR_ERR(inode);
455 fs_err(sdp, "can't read in master directory: %d\n", error); 455 fs_err(sdp, "can't read in master directory: %d\n", error);
diff --git a/fs/gfs2/ops_inode.c b/fs/gfs2/ops_inode.c
index d85f6e05cb95..f8ecfec4064b 100644
--- a/fs/gfs2/ops_inode.c
+++ b/fs/gfs2/ops_inode.c
@@ -157,7 +157,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
157 if (error) 157 if (error)
158 goto out_gunlock; 158 goto out_gunlock;
159 159
160 error = gfs2_dir_search(dir, &dentry->d_name, NULL, NULL); 160 error = gfs2_dir_check(dir, &dentry->d_name, NULL);
161 switch (error) { 161 switch (error) {
162 case -ENOENT: 162 case -ENOENT:
163 break; 163 break;
@@ -217,8 +217,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
217 goto out_ipres; 217 goto out_ipres;
218 } 218 }
219 219
220 error = gfs2_dir_add(dir, &dentry->d_name, &ip->i_num, 220 error = gfs2_dir_add(dir, &dentry->d_name, ip, IF2DT(inode->i_mode));
221 IF2DT(inode->i_mode));
222 if (error) 221 if (error)
223 goto out_end_trans; 222 goto out_end_trans;
224 223
@@ -275,7 +274,7 @@ static int gfs2_unlink(struct inode *dir, struct dentry *dentry)
275 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs); 274 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
276 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1); 275 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
277 276
278 rgd = gfs2_blk2rgrpd(sdp, ip->i_num.no_addr); 277 rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
279 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2); 278 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
280 279
281 280
@@ -420,7 +419,7 @@ static int gfs2_mkdir(struct inode *dir, struct dentry *dentry, int mode)
420 dent = (struct gfs2_dirent *)((char*)dent + GFS2_DIRENT_SIZE(1)); 419 dent = (struct gfs2_dirent *)((char*)dent + GFS2_DIRENT_SIZE(1));
421 gfs2_qstr2dirent(&str, dibh->b_size - GFS2_DIRENT_SIZE(1) - sizeof(struct gfs2_dinode), dent); 420 gfs2_qstr2dirent(&str, dibh->b_size - GFS2_DIRENT_SIZE(1) - sizeof(struct gfs2_dinode), dent);
422 421
423 gfs2_inum_out(&dip->i_num, &dent->de_inum); 422 gfs2_inum_out(dip, dent);
424 dent->de_type = cpu_to_be16(DT_DIR); 423 dent->de_type = cpu_to_be16(DT_DIR);
425 424
426 gfs2_dinode_out(ip, di); 425 gfs2_dinode_out(ip, di);
@@ -472,7 +471,7 @@ static int gfs2_rmdir(struct inode *dir, struct dentry *dentry)
472 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs); 471 gfs2_holder_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
473 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1); 472 gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, ghs + 1);
474 473
475 rgd = gfs2_blk2rgrpd(sdp, ip->i_num.no_addr); 474 rgd = gfs2_blk2rgrpd(sdp, ip->i_no_addr);
476 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2); 475 gfs2_holder_init(rgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + 2);
477 476
478 error = gfs2_glock_nq_m(3, ghs); 477 error = gfs2_glock_nq_m(3, ghs);
@@ -614,7 +613,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
614 * this is the case of the target file already existing 613 * this is the case of the target file already existing
615 * so we unlink before doing the rename 614 * so we unlink before doing the rename
616 */ 615 */
617 nrgd = gfs2_blk2rgrpd(sdp, nip->i_num.no_addr); 616 nrgd = gfs2_blk2rgrpd(sdp, nip->i_no_addr);
618 if (nrgd) 617 if (nrgd)
619 gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++); 618 gfs2_holder_init(nrgd->rd_gl, LM_ST_EXCLUSIVE, 0, ghs + num_gh++);
620 } 619 }
@@ -653,7 +652,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
653 if (error) 652 if (error)
654 goto out_gunlock; 653 goto out_gunlock;
655 654
656 error = gfs2_dir_search(ndir, &ndentry->d_name, NULL, NULL); 655 error = gfs2_dir_check(ndir, &ndentry->d_name, NULL);
657 switch (error) { 656 switch (error) {
658 case -ENOENT: 657 case -ENOENT:
659 error = 0; 658 error = 0;
@@ -750,7 +749,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
750 if (error) 749 if (error)
751 goto out_end_trans; 750 goto out_end_trans;
752 751
753 error = gfs2_dir_mvino(ip, &name, &ndip->i_num, DT_DIR); 752 error = gfs2_dir_mvino(ip, &name, nip, DT_DIR);
754 if (error) 753 if (error)
755 goto out_end_trans; 754 goto out_end_trans;
756 } else { 755 } else {
@@ -768,8 +767,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
768 if (error) 767 if (error)
769 goto out_end_trans; 768 goto out_end_trans;
770 769
771 error = gfs2_dir_add(ndir, &ndentry->d_name, &ip->i_num, 770 error = gfs2_dir_add(ndir, &ndentry->d_name, ip, IF2DT(ip->i_inode.i_mode));
772 IF2DT(ip->i_inode.i_mode));
773 if (error) 771 if (error)
774 goto out_end_trans; 772 goto out_end_trans;
775 773
diff --git a/fs/gfs2/rgrp.c b/fs/gfs2/rgrp.c
index a62c0f2d26d3..30eb428065c5 100644
--- a/fs/gfs2/rgrp.c
+++ b/fs/gfs2/rgrp.c
@@ -1470,7 +1470,7 @@ void gfs2_unlink_di(struct inode *inode)
1470 struct gfs2_inode *ip = GFS2_I(inode); 1470 struct gfs2_inode *ip = GFS2_I(inode);
1471 struct gfs2_sbd *sdp = GFS2_SB(inode); 1471 struct gfs2_sbd *sdp = GFS2_SB(inode);
1472 struct gfs2_rgrpd *rgd; 1472 struct gfs2_rgrpd *rgd;
1473 u64 blkno = ip->i_num.no_addr; 1473 u64 blkno = ip->i_no_addr;
1474 1474
1475 rgd = rgblk_free(sdp, blkno, 1, GFS2_BLKST_UNLINKED); 1475 rgd = rgblk_free(sdp, blkno, 1, GFS2_BLKST_UNLINKED);
1476 if (!rgd) 1476 if (!rgd)
@@ -1505,9 +1505,9 @@ static void gfs2_free_uninit_di(struct gfs2_rgrpd *rgd, u64 blkno)
1505 1505
1506void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip) 1506void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip)
1507{ 1507{
1508 gfs2_free_uninit_di(rgd, ip->i_num.no_addr); 1508 gfs2_free_uninit_di(rgd, ip->i_no_addr);
1509 gfs2_quota_change(ip, -1, ip->i_inode.i_uid, ip->i_inode.i_gid); 1509 gfs2_quota_change(ip, -1, ip->i_inode.i_uid, ip->i_inode.i_gid);
1510 gfs2_meta_wipe(ip, ip->i_num.no_addr, 1); 1510 gfs2_meta_wipe(ip, ip->i_no_addr, 1);
1511} 1511}
1512 1512
1513/** 1513/**
diff --git a/fs/gfs2/super.c b/fs/gfs2/super.c
index 4fdda974dc83..faccffd19907 100644
--- a/fs/gfs2/super.c
+++ b/fs/gfs2/super.c
@@ -360,7 +360,7 @@ int gfs2_jindex_hold(struct gfs2_sbd *sdp, struct gfs2_holder *ji_gh)
360 name.len = sprintf(buf, "journal%u", sdp->sd_journals); 360 name.len = sprintf(buf, "journal%u", sdp->sd_journals);
361 name.hash = gfs2_disk_hash(name.name, name.len); 361 name.hash = gfs2_disk_hash(name.name, name.len);
362 362
363 error = gfs2_dir_search(sdp->sd_jindex, &name, NULL, NULL); 363 error = gfs2_dir_check(sdp->sd_jindex, &name, NULL);
364 if (error == -ENOENT) { 364 if (error == -ENOENT) {
365 error = 0; 365 error = 0;
366 break; 366 break;
diff --git a/fs/gfs2/util.c b/fs/gfs2/util.c
index 601eaa1b9ed6..3f5edc54e80a 100644
--- a/fs/gfs2/util.c
+++ b/fs/gfs2/util.c
@@ -115,8 +115,8 @@ int gfs2_consist_inode_i(struct gfs2_inode *ip, int cluster_wide,
115 "GFS2: fsid=%s: inode = %llu %llu\n" 115 "GFS2: fsid=%s: inode = %llu %llu\n"
116 "GFS2: fsid=%s: function = %s, file = %s, line = %u\n", 116 "GFS2: fsid=%s: function = %s, file = %s, line = %u\n",
117 sdp->sd_fsname, 117 sdp->sd_fsname,
118 sdp->sd_fsname, (unsigned long long)ip->i_num.no_formal_ino, 118 sdp->sd_fsname, (unsigned long long)ip->i_no_formal_ino,
119 (unsigned long long)ip->i_num.no_addr, 119 (unsigned long long)ip->i_no_addr,
120 sdp->sd_fsname, function, file, line); 120 sdp->sd_fsname, function, file, line);
121 return rv; 121 return rv;
122} 122}
diff --git a/include/linux/gfs2_ondisk.h b/include/linux/gfs2_ondisk.h
index 8b7e4c1e32ae..a82ec8c62eff 100644
--- a/include/linux/gfs2_ondisk.h
+++ b/include/linux/gfs2_ondisk.h
@@ -59,13 +59,6 @@ struct gfs2_inum_host {
59 __u64 no_addr; 59 __u64 no_addr;
60}; 60};
61 61
62static inline int gfs2_inum_equal(const struct gfs2_inum_host *ino1,
63 const struct gfs2_inum_host *ino2)
64{
65 return ino1->no_formal_ino == ino2->no_formal_ino &&
66 ino1->no_addr == ino2->no_addr;
67}
68
69/* 62/*
70 * Generic metadata head structure 63 * Generic metadata head structure
71 * Every inplace buffer logged in the journal must start with this. 64 * Every inplace buffer logged in the journal must start with this.
@@ -509,9 +502,9 @@ struct gfs2_quota_change_host {
509 502
510#ifdef __KERNEL__ 503#ifdef __KERNEL__
511/* Translation functions */ 504/* Translation functions */
505struct gfs2_inode;
512 506
513extern void gfs2_inum_in(struct gfs2_inum_host *no, const void *buf); 507extern void gfs2_inum_out(const struct gfs2_inode *ip, struct gfs2_dirent *dent);
514extern void gfs2_inum_out(const struct gfs2_inum_host *no, void *buf);
515extern void gfs2_sb_in(struct gfs2_sb_host *sb, const void *buf); 508extern void gfs2_sb_in(struct gfs2_sb_host *sb, const void *buf);
516extern void gfs2_rindex_in(struct gfs2_rindex_host *ri, const void *buf); 509extern void gfs2_rindex_in(struct gfs2_rindex_host *ri, const void *buf);
517extern void gfs2_rindex_out(const struct gfs2_rindex_host *ri, void *buf); 510extern void gfs2_rindex_out(const struct gfs2_rindex_host *ri, void *buf);