Whamcloud - gitweb
a25a0e709de469d489a1ea839b1817a3688e23a6
[fs/lustre-release.git] / ldiskfs / kernel_patches / patches / ext3-osd-iop-common.patch
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.
8   */
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)
13  {
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]);
18         return ret;
19  }
20 +EXPORT_SYMBOL(ext3_find_entry);
21  
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.
27   */
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)
32  {
33         struct inode *dir = dentry->d_parent->d_inode;
34         unsigned long offset;
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);
38  }
39 +EXPORT_SYMBOL(ext3_add_entry);
40  
41  #ifdef CONFIG_EXT3_INDEX
42  /*
43 @@ -1612,10 +1614,10 @@ cleanup:
44   * ext3_delete_entry deletes a directory entry by merging it with the
45   * previous entry
46   */
47 -static int ext3_delete_entry (handle_t *handle,
48 -                             struct inode * dir,
49 -                             struct ext3_dir_entry_2 * de_del,
50 -                             struct buffer_head * bh)
51 +int ext3_delete_entry (handle_t *handle,
52 +                       struct inode * dir,
53 +                       struct ext3_dir_entry_2 * de_del,
54 +                       struct buffer_head * bh)
55  {
56         struct ext3_dir_entry_2 * de, * pde;
57         int i;
58 @@ -1647,6 +1649,7 @@ static int ext3_delete_entry (handle_t *
59         }
60         return -ENOENT;
61  }
62 +EXPORT_SYMBOL(ext3_delete_entry);
63  
64  /*
65   * ext3_mark_inode_dirty is somewhat expensive, so unlike ext2 we
66 @@ -1751,12 +1754,64 @@ retry:
67         return err;
68  }
69  
70 +/**
71 + * This function will add dot & dotdot entries into ext3 directory.
72 + * Add considering interoperability (between 1.8 & 2.0) requirement.
73 + */
74 +int ext3_add_dot_dotdot(handle_t *handle, struct inode * dir,
75 +                        struct inode *inode)
76 +{
77 +       struct buffer_head * dir_block;
78 +       struct ext3_dir_entry_2 * de;
79 +       int err = 0;
80 +
81 +       if (IS_ERR(handle))
82 +               return PTR_ERR(handle);
83 +
84 +       if (IS_DIRSYNC(dir))
85 +               handle->h_sync = 1;
86 +
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);
91 +       if (!dir_block) {
92 +               inode->i_nlink--; /* is this nlink == 0? */
93 +               ext3_mark_inode_dirty(handle, inode);
94 +               iput (inode);
95 +               goto get_out;
96 +       }
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);
101 +       de->name_len = 1;
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));
109 +       de->name_len = 2;
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);
117 +
118 +get_out:
119 +       return err;
120 +
121 +}
122 +EXPORT_SYMBOL(ext3_add_dot_dotdot);
123 +
124  static int ext3_mkdir(struct inode * dir, struct dentry * dentry, int mode)
125  {
126         handle_t *handle;
127         struct inode * inode;
128 -       struct buffer_head * dir_block;
129 -       struct ext3_dir_entry_2 * de;
130         int err, retries = 0;
131  
132         if (dir->i_nlink >= EXT3_LINK_MAX)
133 @@ -1777,36 +1832,10 @@ retry:
134         if (IS_ERR(inode))
135                 goto out_stop;
136  
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);
141 -       if (!dir_block) {
142 -               inode->i_nlink--; /* is this nlink == 0? */
143 -               ext3_mark_inode_dirty(handle, inode);
144 -               iput (inode);
145 +       err = ext3_add_dot_dotdot(handle, dir, inode);
146 +       if (err)
147                 goto out_stop;
148 -       }
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);
153 -       de->name_len = 1;
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));
161 -       de->name_len = 2;
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);
169 +
170         err = ext3_add_entry (handle, dentry, inode);
171         if (err) {
172                 inode->i_nlink = 0;