1 Index: linux-2.6.18-53.1.14/fs/ext3/namei.c
2 ===================================================================
3 --- linux-2.6.18-53.1.14.org/fs/ext3/namei.c 2008-09-02 13:24:58.000000000 +0530
4 +++ linux-2.6.18-53.1.14/fs/ext3/namei.c 2008-09-02 15:48:16.000000000 +0530
5 @@ -820,8 +820,8 @@ static inline int search_dirblock(struct
6 * The returned buffer_head has ->b_count elevated. The caller is expected
7 * to brelse() it when appropriate.
9 -static struct buffer_head * ext3_find_entry (struct dentry *dentry,
10 - struct ext3_dir_entry_2 ** res_dir)
11 +struct buffer_head * ext3_find_entry (struct dentry *dentry,
12 + struct ext3_dir_entry_2 ** res_dir)
14 struct super_block * sb;
15 struct buffer_head * bh_use[NAMEI_RA_SIZE];
16 @@ -932,6 +932,7 @@ cleanup_and_exit:
17 brelse (bh_use[ra_ptr]);
20 +EXPORT_SYMBOL(ext3_find_entry);
22 #ifdef CONFIG_EXT3_INDEX
23 static struct buffer_head * ext3_dx_find_entry(struct dentry *dentry,
24 @@ -1417,8 +1418,8 @@ static int make_indexed_dir(handle_t *ha
25 * may not sleep between calling this and putting something into
26 * the entry, as someone else might have used it while you slept.
28 -static int ext3_add_entry (handle_t *handle, struct dentry *dentry,
29 - struct inode *inode)
30 +int ext3_add_entry (handle_t *handle, struct dentry *dentry,
31 + struct inode *inode)
33 struct inode *dir = dentry->d_parent->d_inode;
35 @@ -1470,6 +1471,7 @@ static int ext3_add_entry (handle_t *han
36 de->rec_len = cpu_to_le16(blocksize);
37 return add_dirent_to_buf(handle, dentry, inode, de, bh);
39 +EXPORT_SYMBOL(ext3_add_entry);
41 #ifdef CONFIG_EXT3_INDEX
43 @@ -1612,10 +1614,10 @@ cleanup:
44 * ext3_delete_entry deletes a directory entry by merging it with the
47 -static int ext3_delete_entry (handle_t *handle,
49 - struct ext3_dir_entry_2 * de_del,
50 - struct buffer_head * bh)
51 +int ext3_delete_entry (handle_t *handle,
53 + struct ext3_dir_entry_2 * de_del,
54 + struct buffer_head * bh)
56 struct ext3_dir_entry_2 * de, * pde;
58 @@ -1647,6 +1649,7 @@ static int ext3_delete_entry (handle_t *
62 +EXPORT_SYMBOL(ext3_delete_entry);
65 * ext3_mark_inode_dirty is somewhat expensive, so unlike ext2 we
66 @@ -1751,12 +1754,64 @@ retry:
71 + * This function will add dot & dotdot entries into ext3 directory.
72 + * Add considering interoperability (between 1.8 & 2.0) requirement.
74 +int ext3_add_dot_dotdot(handle_t *handle, struct inode * dir,
75 + struct inode *inode)
77 + struct buffer_head * dir_block;
78 + struct ext3_dir_entry_2 * de;
82 + return PTR_ERR(handle);
84 + if (IS_DIRSYNC(dir))
87 + inode->i_op = &ext3_dir_inode_operations;
88 + inode->i_fop = &ext3_dir_operations;
89 + inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize;
90 + dir_block = ext3_bread (handle, inode, 0, 1, &err);
92 + inode->i_nlink--; /* is this nlink == 0? */
93 + ext3_mark_inode_dirty(handle, inode);
97 + BUFFER_TRACE(dir_block, "get_write_access");
98 + ext3_journal_get_write_access(handle, dir_block);
99 + de = (struct ext3_dir_entry_2 *) dir_block->b_data;
100 + de->inode = cpu_to_le32(inode->i_ino);
102 + de->rec_len = cpu_to_le16(EXT3_DIR_REC_LEN(de->name_len));
103 + strcpy (de->name, ".");
104 + ext3_set_de_type(dir->i_sb, de, S_IFDIR);
105 + de = (struct ext3_dir_entry_2 *)
106 + ((char *) de + le16_to_cpu(de->rec_len));
107 + de->inode = cpu_to_le32(dir->i_ino);
108 + de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize-EXT3_DIR_REC_LEN(1));
110 + strcpy (de->name, "..");
111 + ext3_set_de_type(dir->i_sb, de, S_IFDIR);
112 + inode->i_nlink = 2;
113 + BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata");
114 + ext3_journal_dirty_metadata(handle, dir_block);
115 + brelse (dir_block);
116 + ext3_mark_inode_dirty(handle, inode);
122 +EXPORT_SYMBOL(ext3_add_dot_dotdot);
124 static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
127 struct inode * inode;
128 - struct buffer_head * dir_block;
129 - struct ext3_dir_entry_2 * de;
130 int err, retries = 0;
132 if (dir->i_nlink >= EXT3_LINK_MAX)
133 @@ -1777,36 +1832,10 @@ retry:
137 - inode->i_op = &ext3_dir_inode_operations;
138 - inode->i_fop = &ext3_dir_operations;
139 - inode->i_size = EXT3_I(inode)->i_disksize = inode->i_sb->s_blocksize;
140 - dir_block = ext3_bread (handle, inode, 0, 1, &err);
142 - inode->i_nlink--; /* is this nlink == 0? */
143 - ext3_mark_inode_dirty(handle, inode);
145 + err = ext3_add_dot_dotdot(handle, dir, inode);
149 - BUFFER_TRACE(dir_block, "get_write_access");
150 - ext3_journal_get_write_access(handle, dir_block);
151 - de = (struct ext3_dir_entry_2 *) dir_block->b_data;
152 - de->inode = cpu_to_le32(inode->i_ino);
154 - de->rec_len = cpu_to_le16(EXT3_DIR_REC_LEN(de->name_len));
155 - strcpy (de->name, ".");
156 - ext3_set_de_type(dir->i_sb, de, S_IFDIR);
157 - de = (struct ext3_dir_entry_2 *)
158 - ((char *) de + le16_to_cpu(de->rec_len));
159 - de->inode = cpu_to_le32(dir->i_ino);
160 - de->rec_len = cpu_to_le16(inode->i_sb->s_blocksize-EXT3_DIR_REC_LEN(1));
162 - strcpy (de->name, "..");
163 - ext3_set_de_type(dir->i_sb, de, S_IFDIR);
164 - inode->i_nlink = 2;
165 - BUFFER_TRACE(dir_block, "call ext3_journal_dirty_metadata");
166 - ext3_journal_dirty_metadata(handle, dir_block);
167 - brelse (dir_block);
168 - ext3_mark_inode_dirty(handle, inode);
170 err = ext3_add_entry (handle, dentry, inode);