diff options
Diffstat (limited to 'fs/ext3/namei.c')
-rw-r--r-- | fs/ext3/namei.c | 37 |
1 files changed, 23 insertions, 14 deletions
diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c index 79742d824a0a..50378d8ff84b 100644 --- a/fs/ext3/namei.c +++ b/fs/ext3/namei.c | |||
@@ -932,8 +932,16 @@ static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry, | |||
932 | struct inode *dir = dentry->d_parent->d_inode; | 932 | struct inode *dir = dentry->d_parent->d_inode; |
933 | 933 | ||
934 | sb = dir->i_sb; | 934 | sb = dir->i_sb; |
935 | if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err))) | 935 | /* NFS may look up ".." - look at dx_root directory block */ |
936 | return NULL; | 936 | if (namelen > 2 || name[0] != '.'||(name[1] != '.' && name[1] != '\0')){ |
937 | if (!(frame = dx_probe(dentry, NULL, &hinfo, frames, err))) | ||
938 | return NULL; | ||
939 | } else { | ||
940 | frame = frames; | ||
941 | frame->bh = NULL; /* for dx_release() */ | ||
942 | frame->at = (struct dx_entry *)frames; /* hack for zero entry*/ | ||
943 | dx_set_block(frame->at, 0); /* dx_root block is 0 */ | ||
944 | } | ||
937 | hash = hinfo.hash; | 945 | hash = hinfo.hash; |
938 | do { | 946 | do { |
939 | block = dx_get_block(frame->at); | 947 | block = dx_get_block(frame->at); |
@@ -1637,9 +1645,9 @@ static int ext3_create (struct inode * dir, struct dentry * dentry, int mode, | |||
1637 | int err, retries = 0; | 1645 | int err, retries = 0; |
1638 | 1646 | ||
1639 | retry: | 1647 | retry: |
1640 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 1648 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
1641 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1649 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1642 | 2*EXT3_QUOTA_INIT_BLOCKS); | 1650 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
1643 | if (IS_ERR(handle)) | 1651 | if (IS_ERR(handle)) |
1644 | return PTR_ERR(handle); | 1652 | return PTR_ERR(handle); |
1645 | 1653 | ||
@@ -1671,9 +1679,9 @@ static int ext3_mknod (struct inode * dir, struct dentry *dentry, | |||
1671 | return -EINVAL; | 1679 | return -EINVAL; |
1672 | 1680 | ||
1673 | retry: | 1681 | retry: |
1674 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 1682 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
1675 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1683 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1676 | 2*EXT3_QUOTA_INIT_BLOCKS); | 1684 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
1677 | if (IS_ERR(handle)) | 1685 | if (IS_ERR(handle)) |
1678 | return PTR_ERR(handle); | 1686 | return PTR_ERR(handle); |
1679 | 1687 | ||
@@ -1707,9 +1715,9 @@ static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode) | |||
1707 | return -EMLINK; | 1715 | return -EMLINK; |
1708 | 1716 | ||
1709 | retry: | 1717 | retry: |
1710 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 1718 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
1711 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + | 1719 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3 + |
1712 | 2*EXT3_QUOTA_INIT_BLOCKS); | 1720 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
1713 | if (IS_ERR(handle)) | 1721 | if (IS_ERR(handle)) |
1714 | return PTR_ERR(handle); | 1722 | return PTR_ERR(handle); |
1715 | 1723 | ||
@@ -1998,7 +2006,7 @@ static int ext3_rmdir (struct inode * dir, struct dentry *dentry) | |||
1998 | /* Initialize quotas before so that eventual writes go in | 2006 | /* Initialize quotas before so that eventual writes go in |
1999 | * separate transaction */ | 2007 | * separate transaction */ |
2000 | DQUOT_INIT(dentry->d_inode); | 2008 | DQUOT_INIT(dentry->d_inode); |
2001 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); | 2009 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb)); |
2002 | if (IS_ERR(handle)) | 2010 | if (IS_ERR(handle)) |
2003 | return PTR_ERR(handle); | 2011 | return PTR_ERR(handle); |
2004 | 2012 | ||
@@ -2057,7 +2065,7 @@ static int ext3_unlink(struct inode * dir, struct dentry *dentry) | |||
2057 | /* Initialize quotas before so that eventual writes go | 2065 | /* Initialize quotas before so that eventual writes go |
2058 | * in separate transaction */ | 2066 | * in separate transaction */ |
2059 | DQUOT_INIT(dentry->d_inode); | 2067 | DQUOT_INIT(dentry->d_inode); |
2060 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS); | 2068 | handle = ext3_journal_start(dir, EXT3_DELETE_TRANS_BLOCKS(dir->i_sb)); |
2061 | if (IS_ERR(handle)) | 2069 | if (IS_ERR(handle)) |
2062 | return PTR_ERR(handle); | 2070 | return PTR_ERR(handle); |
2063 | 2071 | ||
@@ -2112,9 +2120,9 @@ static int ext3_symlink (struct inode * dir, | |||
2112 | return -ENAMETOOLONG; | 2120 | return -ENAMETOOLONG; |
2113 | 2121 | ||
2114 | retry: | 2122 | retry: |
2115 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 2123 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
2116 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 + | 2124 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 5 + |
2117 | 2*EXT3_QUOTA_INIT_BLOCKS); | 2125 | 2*EXT3_QUOTA_INIT_BLOCKS(dir->i_sb)); |
2118 | if (IS_ERR(handle)) | 2126 | if (IS_ERR(handle)) |
2119 | return PTR_ERR(handle); | 2127 | return PTR_ERR(handle); |
2120 | 2128 | ||
@@ -2166,7 +2174,7 @@ static int ext3_link (struct dentry * old_dentry, | |||
2166 | return -EMLINK; | 2174 | return -EMLINK; |
2167 | 2175 | ||
2168 | retry: | 2176 | retry: |
2169 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS + | 2177 | handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS(dir->i_sb) + |
2170 | EXT3_INDEX_EXTRA_TRANS_BLOCKS); | 2178 | EXT3_INDEX_EXTRA_TRANS_BLOCKS); |
2171 | if (IS_ERR(handle)) | 2179 | if (IS_ERR(handle)) |
2172 | return PTR_ERR(handle); | 2180 | return PTR_ERR(handle); |
@@ -2208,7 +2216,8 @@ static int ext3_rename (struct inode * old_dir, struct dentry *old_dentry, | |||
2208 | * in separate transaction */ | 2216 | * in separate transaction */ |
2209 | if (new_dentry->d_inode) | 2217 | if (new_dentry->d_inode) |
2210 | DQUOT_INIT(new_dentry->d_inode); | 2218 | DQUOT_INIT(new_dentry->d_inode); |
2211 | handle = ext3_journal_start(old_dir, 2 * EXT3_DATA_TRANS_BLOCKS + | 2219 | handle = ext3_journal_start(old_dir, 2 * |
2220 | EXT3_DATA_TRANS_BLOCKS(old_dir->i_sb) + | ||
2212 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); | 2221 | EXT3_INDEX_EXTRA_TRANS_BLOCKS + 2); |
2213 | if (IS_ERR(handle)) | 2222 | if (IS_ERR(handle)) |
2214 | return PTR_ERR(handle); | 2223 | return PTR_ERR(handle); |