aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fat/inode.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/fat/inode.c')
-rw-r--r--fs/fat/inode.c38
1 files changed, 14 insertions, 24 deletions
diff --git a/fs/fat/inode.c b/fs/fat/inode.c
index 31b7174176ba..ab96ae823753 100644
--- a/fs/fat/inode.c
+++ b/fs/fat/inode.c
@@ -50,14 +50,14 @@ static int fat_add_cluster(struct inode *inode)
50 return err; 50 return err;
51} 51}
52 52
53static int __fat_get_blocks(struct inode *inode, sector_t iblock, 53static inline int __fat_get_block(struct inode *inode, sector_t iblock,
54 unsigned long *max_blocks, 54 unsigned long *max_blocks,
55 struct buffer_head *bh_result, int create) 55 struct buffer_head *bh_result, int create)
56{ 56{
57 struct super_block *sb = inode->i_sb; 57 struct super_block *sb = inode->i_sb;
58 struct msdos_sb_info *sbi = MSDOS_SB(sb); 58 struct msdos_sb_info *sbi = MSDOS_SB(sb);
59 sector_t phys;
60 unsigned long mapped_blocks; 59 unsigned long mapped_blocks;
60 sector_t phys;
61 int err, offset; 61 int err, offset;
62 62
63 err = fat_bmap(inode, iblock, &phys, &mapped_blocks); 63 err = fat_bmap(inode, iblock, &phys, &mapped_blocks);
@@ -73,7 +73,7 @@ static int __fat_get_blocks(struct inode *inode, sector_t iblock,
73 73
74 if (iblock != MSDOS_I(inode)->mmu_private >> sb->s_blocksize_bits) { 74 if (iblock != MSDOS_I(inode)->mmu_private >> sb->s_blocksize_bits) {
75 fat_fs_panic(sb, "corrupted file size (i_pos %lld, %lld)", 75 fat_fs_panic(sb, "corrupted file size (i_pos %lld, %lld)",
76 MSDOS_I(inode)->i_pos, MSDOS_I(inode)->mmu_private); 76 MSDOS_I(inode)->i_pos, MSDOS_I(inode)->mmu_private);
77 return -EIO; 77 return -EIO;
78 } 78 }
79 79
@@ -93,34 +93,29 @@ static int __fat_get_blocks(struct inode *inode, sector_t iblock,
93 err = fat_bmap(inode, iblock, &phys, &mapped_blocks); 93 err = fat_bmap(inode, iblock, &phys, &mapped_blocks);
94 if (err) 94 if (err)
95 return err; 95 return err;
96
96 BUG_ON(!phys); 97 BUG_ON(!phys);
97 BUG_ON(*max_blocks != mapped_blocks); 98 BUG_ON(*max_blocks != mapped_blocks);
98 set_buffer_new(bh_result); 99 set_buffer_new(bh_result);
99 map_bh(bh_result, sb, phys); 100 map_bh(bh_result, sb, phys);
101
100 return 0; 102 return 0;
101} 103}
102 104
103static int fat_get_blocks(struct inode *inode, sector_t iblock, 105static int fat_get_block(struct inode *inode, sector_t iblock,
104 struct buffer_head *bh_result, int create) 106 struct buffer_head *bh_result, int create)
105{ 107{
106 struct super_block *sb = inode->i_sb; 108 struct super_block *sb = inode->i_sb;
107 int err;
108 unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits; 109 unsigned long max_blocks = bh_result->b_size >> inode->i_blkbits;
110 int err;
109 111
110 err = __fat_get_blocks(inode, iblock, &max_blocks, bh_result, create); 112 err = __fat_get_block(inode, iblock, &max_blocks, bh_result, create);
111 if (err) 113 if (err)
112 return err; 114 return err;
113 bh_result->b_size = max_blocks << sb->s_blocksize_bits; 115 bh_result->b_size = max_blocks << sb->s_blocksize_bits;
114 return 0; 116 return 0;
115} 117}
116 118
117static int fat_get_block(struct inode *inode, sector_t iblock,
118 struct buffer_head *bh_result, int create)
119{
120 unsigned long max_blocks = 1;
121 return __fat_get_blocks(inode, iblock, &max_blocks, bh_result, create);
122}
123
124static int fat_writepage(struct page *page, struct writeback_control *wbc) 119static int fat_writepage(struct page *page, struct writeback_control *wbc)
125{ 120{
126 return block_write_full_page(page, fat_get_block, wbc); 121 return block_write_full_page(page, fat_get_block, wbc);
@@ -188,7 +183,7 @@ static ssize_t fat_direct_IO(int rw, struct kiocb *iocb,
188 * condition of fat_get_block() and ->truncate(). 183 * condition of fat_get_block() and ->truncate().
189 */ 184 */
190 return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov, 185 return blockdev_direct_IO(rw, iocb, inode, inode->i_sb->s_bdev, iov,
191 offset, nr_segs, fat_get_blocks, NULL); 186 offset, nr_segs, fat_get_block, NULL);
192} 187}
193 188
194static sector_t _fat_bmap(struct address_space *mapping, sector_t block) 189static sector_t _fat_bmap(struct address_space *mapping, sector_t block)
@@ -375,8 +370,6 @@ static int fat_fill_inode(struct inode *inode, struct msdos_dir_entry *de)
375 inode->i_flags |= S_IMMUTABLE; 370 inode->i_flags |= S_IMMUTABLE;
376 } 371 }
377 MSDOS_I(inode)->i_attrs = de->attr & ATTR_UNUSED; 372 MSDOS_I(inode)->i_attrs = de->attr & ATTR_UNUSED;
378 /* this is as close to the truth as we can get ... */
379 inode->i_blksize = sbi->cluster_size;
380 inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1)) 373 inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1))
381 & ~((loff_t)sbi->cluster_size - 1)) >> 9; 374 & ~((loff_t)sbi->cluster_size - 1)) >> 9;
382 inode->i_mtime.tv_sec = 375 inode->i_mtime.tv_sec =
@@ -528,8 +521,7 @@ static int __init fat_init_inodecache(void)
528 521
529static void __exit fat_destroy_inodecache(void) 522static void __exit fat_destroy_inodecache(void)
530{ 523{
531 if (kmem_cache_destroy(fat_inode_cachep)) 524 kmem_cache_destroy(fat_inode_cachep);
532 printk(KERN_INFO "fat_inode_cache: not all structures were freed\n");
533} 525}
534 526
535static int fat_remount(struct super_block *sb, int *flags, char *data) 527static int fat_remount(struct super_block *sb, int *flags, char *data)
@@ -1137,7 +1129,6 @@ static int fat_read_root(struct inode *inode)
1137 MSDOS_I(inode)->i_start = 0; 1129 MSDOS_I(inode)->i_start = 0;
1138 inode->i_size = sbi->dir_entries * sizeof(struct msdos_dir_entry); 1130 inode->i_size = sbi->dir_entries * sizeof(struct msdos_dir_entry);
1139 } 1131 }
1140 inode->i_blksize = sbi->cluster_size;
1141 inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1)) 1132 inode->i_blocks = ((inode->i_size + (sbi->cluster_size - 1))
1142 & ~((loff_t)sbi->cluster_size - 1)) >> 9; 1133 & ~((loff_t)sbi->cluster_size - 1)) >> 9;
1143 MSDOS_I(inode)->i_logstart = 0; 1134 MSDOS_I(inode)->i_logstart = 0;
@@ -1168,11 +1159,10 @@ int fat_fill_super(struct super_block *sb, void *data, int silent,
1168 long error; 1159 long error;
1169 char buf[50]; 1160 char buf[50];
1170 1161
1171 sbi = kmalloc(sizeof(struct msdos_sb_info), GFP_KERNEL); 1162 sbi = kzalloc(sizeof(struct msdos_sb_info), GFP_KERNEL);
1172 if (!sbi) 1163 if (!sbi)
1173 return -ENOMEM; 1164 return -ENOMEM;
1174 sb->s_fs_info = sbi; 1165 sb->s_fs_info = sbi;
1175 memset(sbi, 0, sizeof(struct msdos_sb_info));
1176 1166
1177 sb->s_flags |= MS_NODIRATIME; 1167 sb->s_flags |= MS_NODIRATIME;
1178 sb->s_magic = MSDOS_SUPER_MAGIC; 1168 sb->s_magic = MSDOS_SUPER_MAGIC;