diff options
Diffstat (limited to 'fs/qnx4')
-rw-r--r-- | fs/qnx4/inode.c | 56 |
1 files changed, 22 insertions, 34 deletions
diff --git a/fs/qnx4/inode.c b/fs/qnx4/inode.c index 63e0f7471fb5..3fd121c7c30a 100644 --- a/fs/qnx4/inode.c +++ b/fs/qnx4/inode.c | |||
@@ -179,45 +179,33 @@ static const char *qnx4_checkroot(struct super_block *sb) | |||
179 | struct qnx4_inode_entry *rootdir; | 179 | struct qnx4_inode_entry *rootdir; |
180 | int rd, rl; | 180 | int rd, rl; |
181 | int i, j; | 181 | int i, j; |
182 | int found = 0; | ||
183 | 182 | ||
184 | if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/') { | 183 | if (*(qnx4_sb(sb)->sb->RootDir.di_fname) != '/') |
185 | return "no qnx4 filesystem (no root dir)."; | 184 | return "no qnx4 filesystem (no root dir)."; |
186 | } else { | 185 | QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id)); |
187 | QNX4DEBUG((KERN_NOTICE "QNX4 filesystem found on dev %s.\n", sb->s_id)); | 186 | rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1; |
188 | rd = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_blk) - 1; | 187 | rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size); |
189 | rl = le32_to_cpu(qnx4_sb(sb)->sb->RootDir.di_first_xtnt.xtnt_size); | 188 | for (j = 0; j < rl; j++) { |
190 | for (j = 0; j < rl; j++) { | 189 | bh = sb_bread(sb, rd + j); /* root dir, first block */ |
191 | bh = sb_bread(sb, rd + j); /* root dir, first block */ | 190 | if (bh == NULL) |
192 | if (bh == NULL) { | 191 | return "unable to read root entry."; |
193 | return "unable to read root entry."; | 192 | rootdir = (struct qnx4_inode_entry *) bh->b_data; |
194 | } | 193 | for (i = 0; i < QNX4_INODES_PER_BLOCK; i++, rootdir++) { |
195 | for (i = 0; i < QNX4_INODES_PER_BLOCK; i++) { | 194 | QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname)); |
196 | rootdir = (struct qnx4_inode_entry *) (bh->b_data + i * QNX4_DIR_ENTRY_SIZE); | 195 | if (strcmp(rootdir->di_fname, QNX4_BMNAME) != 0) |
197 | QNX4DEBUG((KERN_INFO "rootdir entry found : [%s]\n", rootdir->di_fname)); | 196 | continue; |
198 | if (!strcmp(rootdir->di_fname, | 197 | qnx4_sb(sb)->BitMap = kmemdup(rootdir, |
199 | QNX4_BMNAME)) { | 198 | sizeof(struct qnx4_inode_entry), |
200 | found = 1; | 199 | GFP_KERNEL); |
201 | qnx4_sb(sb)->BitMap = kmemdup(rootdir, | ||
202 | sizeof(struct qnx4_inode_entry), | ||
203 | GFP_KERNEL); | ||
204 | if (!qnx4_sb(sb)->BitMap) { | ||
205 | brelse (bh); | ||
206 | return "not enough memory for bitmap inode"; | ||
207 | }/* keep bitmap inode known */ | ||
208 | break; | ||
209 | } | ||
210 | } | ||
211 | brelse(bh); | 200 | brelse(bh); |
212 | if (found != 0) { | 201 | if (!qnx4_sb(sb)->BitMap) |
213 | break; | 202 | return "not enough memory for bitmap inode"; |
214 | } | 203 | /* keep bitmap inode known */ |
215 | } | 204 | return NULL; |
216 | if (found == 0) { | ||
217 | return "bitmap file not found."; | ||
218 | } | 205 | } |
206 | brelse(bh); | ||
219 | } | 207 | } |
220 | return NULL; | 208 | return "bitmap file not found."; |
221 | } | 209 | } |
222 | 210 | ||
223 | static int qnx4_fill_super(struct super_block *s, void *data, int silent) | 211 | static int qnx4_fill_super(struct super_block *s, void *data, int silent) |