diff options
Diffstat (limited to 'fs/minix/inode.c')
-rw-r--r-- | fs/minix/inode.c | 29 |
1 files changed, 25 insertions, 4 deletions
diff --git a/fs/minix/inode.c b/fs/minix/inode.c index e7d23e25bf1d..1d9e33966db0 100644 --- a/fs/minix/inode.c +++ b/fs/minix/inode.c | |||
@@ -279,6 +279,27 @@ static int minix_fill_super(struct super_block *s, void *data, int silent) | |||
279 | else if (sbi->s_mount_state & MINIX_ERROR_FS) | 279 | else if (sbi->s_mount_state & MINIX_ERROR_FS) |
280 | printk("MINIX-fs: mounting file system with errors, " | 280 | printk("MINIX-fs: mounting file system with errors, " |
281 | "running fsck is recommended\n"); | 281 | "running fsck is recommended\n"); |
282 | |||
283 | /* Apparently minix can create filesystems that allocate more blocks for | ||
284 | * the bitmaps than needed. We simply ignore that, but verify it didn't | ||
285 | * create one with not enough blocks and bail out if so. | ||
286 | */ | ||
287 | block = minix_blocks_needed(sbi->s_ninodes, s->s_blocksize); | ||
288 | if (sbi->s_imap_blocks < block) { | ||
289 | printk("MINIX-fs: file system does not have enough " | ||
290 | "imap blocks allocated. Refusing to mount\n"); | ||
291 | goto out_iput; | ||
292 | } | ||
293 | |||
294 | block = minix_blocks_needed( | ||
295 | (sbi->s_nzones - (sbi->s_firstdatazone + 1)), | ||
296 | s->s_blocksize); | ||
297 | if (sbi->s_zmap_blocks < block) { | ||
298 | printk("MINIX-fs: file system does not have enough " | ||
299 | "zmap blocks allocated. Refusing to mount.\n"); | ||
300 | goto out_iput; | ||
301 | } | ||
302 | |||
282 | return 0; | 303 | return 0; |
283 | 304 | ||
284 | out_iput: | 305 | out_iput: |
@@ -339,10 +360,10 @@ static int minix_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
339 | buf->f_type = sb->s_magic; | 360 | buf->f_type = sb->s_magic; |
340 | buf->f_bsize = sb->s_blocksize; | 361 | buf->f_bsize = sb->s_blocksize; |
341 | buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size; | 362 | buf->f_blocks = (sbi->s_nzones - sbi->s_firstdatazone) << sbi->s_log_zone_size; |
342 | buf->f_bfree = minix_count_free_blocks(sbi); | 363 | buf->f_bfree = minix_count_free_blocks(sb); |
343 | buf->f_bavail = buf->f_bfree; | 364 | buf->f_bavail = buf->f_bfree; |
344 | buf->f_files = sbi->s_ninodes; | 365 | buf->f_files = sbi->s_ninodes; |
345 | buf->f_ffree = minix_count_free_inodes(sbi); | 366 | buf->f_ffree = minix_count_free_inodes(sb); |
346 | buf->f_namelen = sbi->s_namelen; | 367 | buf->f_namelen = sbi->s_namelen; |
347 | buf->f_fsid.val[0] = (u32)id; | 368 | buf->f_fsid.val[0] = (u32)id; |
348 | buf->f_fsid.val[1] = (u32)(id >> 32); | 369 | buf->f_fsid.val[1] = (u32)(id >> 32); |
@@ -446,7 +467,7 @@ static struct inode *V1_minix_iget(struct inode *inode) | |||
446 | inode->i_mode = raw_inode->i_mode; | 467 | inode->i_mode = raw_inode->i_mode; |
447 | inode->i_uid = (uid_t)raw_inode->i_uid; | 468 | inode->i_uid = (uid_t)raw_inode->i_uid; |
448 | inode->i_gid = (gid_t)raw_inode->i_gid; | 469 | inode->i_gid = (gid_t)raw_inode->i_gid; |
449 | inode->i_nlink = raw_inode->i_nlinks; | 470 | set_nlink(inode, raw_inode->i_nlinks); |
450 | inode->i_size = raw_inode->i_size; | 471 | inode->i_size = raw_inode->i_size; |
451 | inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = raw_inode->i_time; | 472 | inode->i_mtime.tv_sec = inode->i_atime.tv_sec = inode->i_ctime.tv_sec = raw_inode->i_time; |
452 | inode->i_mtime.tv_nsec = 0; | 473 | inode->i_mtime.tv_nsec = 0; |
@@ -479,7 +500,7 @@ static struct inode *V2_minix_iget(struct inode *inode) | |||
479 | inode->i_mode = raw_inode->i_mode; | 500 | inode->i_mode = raw_inode->i_mode; |
480 | inode->i_uid = (uid_t)raw_inode->i_uid; | 501 | inode->i_uid = (uid_t)raw_inode->i_uid; |
481 | inode->i_gid = (gid_t)raw_inode->i_gid; | 502 | inode->i_gid = (gid_t)raw_inode->i_gid; |
482 | inode->i_nlink = raw_inode->i_nlinks; | 503 | set_nlink(inode, raw_inode->i_nlinks); |
483 | inode->i_size = raw_inode->i_size; | 504 | inode->i_size = raw_inode->i_size; |
484 | inode->i_mtime.tv_sec = raw_inode->i_mtime; | 505 | inode->i_mtime.tv_sec = raw_inode->i_mtime; |
485 | inode->i_atime.tv_sec = raw_inode->i_atime; | 506 | inode->i_atime.tv_sec = raw_inode->i_atime; |