diff options
Diffstat (limited to 'fs/fat/inode.c')
-rw-r--r-- | fs/fat/inode.c | 74 |
1 files changed, 36 insertions, 38 deletions
diff --git a/fs/fat/inode.c b/fs/fat/inode.c index 8d68690bdcf1..cb8d8391ac0b 100644 --- a/fs/fat/inode.c +++ b/fs/fat/inode.c | |||
@@ -581,7 +581,8 @@ static int fat_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
581 | buf->f_bavail = sbi->free_clusters; | 581 | buf->f_bavail = sbi->free_clusters; |
582 | buf->f_fsid.val[0] = (u32)id; | 582 | buf->f_fsid.val[0] = (u32)id; |
583 | buf->f_fsid.val[1] = (u32)(id >> 32); | 583 | buf->f_fsid.val[1] = (u32)(id >> 32); |
584 | buf->f_namelen = sbi->options.isvfat ? FAT_LFN_LEN : 12; | 584 | buf->f_namelen = |
585 | (sbi->options.isvfat ? FAT_LFN_LEN : 12) * NLS_MAX_CHARSET_SIZE; | ||
585 | 586 | ||
586 | return 0; | 587 | return 0; |
587 | } | 588 | } |
@@ -619,8 +620,8 @@ retry: | |||
619 | 620 | ||
620 | bh = sb_bread(sb, i_pos >> sbi->dir_per_block_bits); | 621 | bh = sb_bread(sb, i_pos >> sbi->dir_per_block_bits); |
621 | if (!bh) { | 622 | if (!bh) { |
622 | printk(KERN_ERR "FAT: unable to read inode block " | 623 | fat_msg(sb, KERN_ERR, "unable to read inode block " |
623 | "for updating (i_pos %lld)\n", i_pos); | 624 | "for updating (i_pos %lld)", i_pos); |
624 | return -EIO; | 625 | return -EIO; |
625 | } | 626 | } |
626 | spin_lock(&sbi->inode_hash_lock); | 627 | spin_lock(&sbi->inode_hash_lock); |
@@ -976,8 +977,8 @@ static const match_table_t vfat_tokens = { | |||
976 | {Opt_err, NULL} | 977 | {Opt_err, NULL} |
977 | }; | 978 | }; |
978 | 979 | ||
979 | static int parse_options(char *options, int is_vfat, int silent, int *debug, | 980 | static int parse_options(struct super_block *sb, char *options, int is_vfat, |
980 | struct fat_mount_options *opts) | 981 | int silent, int *debug, struct fat_mount_options *opts) |
981 | { | 982 | { |
982 | char *p; | 983 | char *p; |
983 | substring_t args[MAX_OPT_ARGS]; | 984 | substring_t args[MAX_OPT_ARGS]; |
@@ -1168,15 +1169,15 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug, | |||
1168 | 1169 | ||
1169 | /* obsolete mount options */ | 1170 | /* obsolete mount options */ |
1170 | case Opt_obsolate: | 1171 | case Opt_obsolate: |
1171 | printk(KERN_INFO "FAT: \"%s\" option is obsolete, " | 1172 | fat_msg(sb, KERN_INFO, "\"%s\" option is obsolete, " |
1172 | "not supported now\n", p); | 1173 | "not supported now", p); |
1173 | break; | 1174 | break; |
1174 | /* unknown option */ | 1175 | /* unknown option */ |
1175 | default: | 1176 | default: |
1176 | if (!silent) { | 1177 | if (!silent) { |
1177 | printk(KERN_ERR | 1178 | fat_msg(sb, KERN_ERR, |
1178 | "FAT: Unrecognized mount option \"%s\" " | 1179 | "Unrecognized mount option \"%s\" " |
1179 | "or missing value\n", p); | 1180 | "or missing value", p); |
1180 | } | 1181 | } |
1181 | return -EINVAL; | 1182 | return -EINVAL; |
1182 | } | 1183 | } |
@@ -1185,7 +1186,7 @@ static int parse_options(char *options, int is_vfat, int silent, int *debug, | |||
1185 | out: | 1186 | out: |
1186 | /* UTF-8 doesn't provide FAT semantics */ | 1187 | /* UTF-8 doesn't provide FAT semantics */ |
1187 | if (!strcmp(opts->iocharset, "utf8")) { | 1188 | if (!strcmp(opts->iocharset, "utf8")) { |
1188 | printk(KERN_ERR "FAT: utf8 is not a recommended IO charset" | 1189 | fat_msg(sb, KERN_ERR, "utf8 is not a recommended IO charset" |
1189 | " for FAT filesystems, filesystem will be " | 1190 | " for FAT filesystems, filesystem will be " |
1190 | "case sensitive!\n"); | 1191 | "case sensitive!\n"); |
1191 | } | 1192 | } |
@@ -1238,8 +1239,7 @@ static int fat_read_root(struct inode *inode) | |||
1238 | /* | 1239 | /* |
1239 | * Read the super block of an MS-DOS FS. | 1240 | * Read the super block of an MS-DOS FS. |
1240 | */ | 1241 | */ |
1241 | int fat_fill_super(struct super_block *sb, void *data, int silent, | 1242 | int fat_fill_super(struct super_block *sb, void *data, int silent, int isvfat, |
1242 | const struct inode_operations *fs_dir_inode_ops, int isvfat, | ||
1243 | void (*setup)(struct super_block *)) | 1243 | void (*setup)(struct super_block *)) |
1244 | { | 1244 | { |
1245 | struct inode *root_inode = NULL, *fat_inode = NULL; | 1245 | struct inode *root_inode = NULL, *fat_inode = NULL; |
@@ -1268,11 +1268,10 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1268 | sb->s_magic = MSDOS_SUPER_MAGIC; | 1268 | sb->s_magic = MSDOS_SUPER_MAGIC; |
1269 | sb->s_op = &fat_sops; | 1269 | sb->s_op = &fat_sops; |
1270 | sb->s_export_op = &fat_export_ops; | 1270 | sb->s_export_op = &fat_export_ops; |
1271 | sbi->dir_ops = fs_dir_inode_ops; | ||
1272 | ratelimit_state_init(&sbi->ratelimit, DEFAULT_RATELIMIT_INTERVAL, | 1271 | ratelimit_state_init(&sbi->ratelimit, DEFAULT_RATELIMIT_INTERVAL, |
1273 | DEFAULT_RATELIMIT_BURST); | 1272 | DEFAULT_RATELIMIT_BURST); |
1274 | 1273 | ||
1275 | error = parse_options(data, isvfat, silent, &debug, &sbi->options); | 1274 | error = parse_options(sb, data, isvfat, silent, &debug, &sbi->options); |
1276 | if (error) | 1275 | if (error) |
1277 | goto out_fail; | 1276 | goto out_fail; |
1278 | 1277 | ||
@@ -1282,20 +1281,20 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1282 | sb_min_blocksize(sb, 512); | 1281 | sb_min_blocksize(sb, 512); |
1283 | bh = sb_bread(sb, 0); | 1282 | bh = sb_bread(sb, 0); |
1284 | if (bh == NULL) { | 1283 | if (bh == NULL) { |
1285 | printk(KERN_ERR "FAT: unable to read boot sector\n"); | 1284 | fat_msg(sb, KERN_ERR, "unable to read boot sector"); |
1286 | goto out_fail; | 1285 | goto out_fail; |
1287 | } | 1286 | } |
1288 | 1287 | ||
1289 | b = (struct fat_boot_sector *) bh->b_data; | 1288 | b = (struct fat_boot_sector *) bh->b_data; |
1290 | if (!b->reserved) { | 1289 | if (!b->reserved) { |
1291 | if (!silent) | 1290 | if (!silent) |
1292 | printk(KERN_ERR "FAT: bogus number of reserved sectors\n"); | 1291 | fat_msg(sb, KERN_ERR, "bogus number of reserved sectors"); |
1293 | brelse(bh); | 1292 | brelse(bh); |
1294 | goto out_invalid; | 1293 | goto out_invalid; |
1295 | } | 1294 | } |
1296 | if (!b->fats) { | 1295 | if (!b->fats) { |
1297 | if (!silent) | 1296 | if (!silent) |
1298 | printk(KERN_ERR "FAT: bogus number of FAT structure\n"); | 1297 | fat_msg(sb, KERN_ERR, "bogus number of FAT structure"); |
1299 | brelse(bh); | 1298 | brelse(bh); |
1300 | goto out_invalid; | 1299 | goto out_invalid; |
1301 | } | 1300 | } |
@@ -1308,7 +1307,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1308 | media = b->media; | 1307 | media = b->media; |
1309 | if (!fat_valid_media(media)) { | 1308 | if (!fat_valid_media(media)) { |
1310 | if (!silent) | 1309 | if (!silent) |
1311 | printk(KERN_ERR "FAT: invalid media value (0x%02x)\n", | 1310 | fat_msg(sb, KERN_ERR, "invalid media value (0x%02x)", |
1312 | media); | 1311 | media); |
1313 | brelse(bh); | 1312 | brelse(bh); |
1314 | goto out_invalid; | 1313 | goto out_invalid; |
@@ -1318,7 +1317,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1318 | || (logical_sector_size < 512) | 1317 | || (logical_sector_size < 512) |
1319 | || (logical_sector_size > 4096)) { | 1318 | || (logical_sector_size > 4096)) { |
1320 | if (!silent) | 1319 | if (!silent) |
1321 | printk(KERN_ERR "FAT: bogus logical sector size %u\n", | 1320 | fat_msg(sb, KERN_ERR, "bogus logical sector size %u", |
1322 | logical_sector_size); | 1321 | logical_sector_size); |
1323 | brelse(bh); | 1322 | brelse(bh); |
1324 | goto out_invalid; | 1323 | goto out_invalid; |
@@ -1326,15 +1325,15 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1326 | sbi->sec_per_clus = b->sec_per_clus; | 1325 | sbi->sec_per_clus = b->sec_per_clus; |
1327 | if (!is_power_of_2(sbi->sec_per_clus)) { | 1326 | if (!is_power_of_2(sbi->sec_per_clus)) { |
1328 | if (!silent) | 1327 | if (!silent) |
1329 | printk(KERN_ERR "FAT: bogus sectors per cluster %u\n", | 1328 | fat_msg(sb, KERN_ERR, "bogus sectors per cluster %u", |
1330 | sbi->sec_per_clus); | 1329 | sbi->sec_per_clus); |
1331 | brelse(bh); | 1330 | brelse(bh); |
1332 | goto out_invalid; | 1331 | goto out_invalid; |
1333 | } | 1332 | } |
1334 | 1333 | ||
1335 | if (logical_sector_size < sb->s_blocksize) { | 1334 | if (logical_sector_size < sb->s_blocksize) { |
1336 | printk(KERN_ERR "FAT: logical sector size too small for device" | 1335 | fat_msg(sb, KERN_ERR, "logical sector size too small for device" |
1337 | " (logical sector size = %u)\n", logical_sector_size); | 1336 | " (logical sector size = %u)", logical_sector_size); |
1338 | brelse(bh); | 1337 | brelse(bh); |
1339 | goto out_fail; | 1338 | goto out_fail; |
1340 | } | 1339 | } |
@@ -1342,14 +1341,14 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1342 | brelse(bh); | 1341 | brelse(bh); |
1343 | 1342 | ||
1344 | if (!sb_set_blocksize(sb, logical_sector_size)) { | 1343 | if (!sb_set_blocksize(sb, logical_sector_size)) { |
1345 | printk(KERN_ERR "FAT: unable to set blocksize %u\n", | 1344 | fat_msg(sb, KERN_ERR, "unable to set blocksize %u", |
1346 | logical_sector_size); | 1345 | logical_sector_size); |
1347 | goto out_fail; | 1346 | goto out_fail; |
1348 | } | 1347 | } |
1349 | bh = sb_bread(sb, 0); | 1348 | bh = sb_bread(sb, 0); |
1350 | if (bh == NULL) { | 1349 | if (bh == NULL) { |
1351 | printk(KERN_ERR "FAT: unable to read boot sector" | 1350 | fat_msg(sb, KERN_ERR, "unable to read boot sector" |
1352 | " (logical sector size = %lu)\n", | 1351 | " (logical sector size = %lu)", |
1353 | sb->s_blocksize); | 1352 | sb->s_blocksize); |
1354 | goto out_fail; | 1353 | goto out_fail; |
1355 | } | 1354 | } |
@@ -1385,16 +1384,16 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1385 | 1384 | ||
1386 | fsinfo_bh = sb_bread(sb, sbi->fsinfo_sector); | 1385 | fsinfo_bh = sb_bread(sb, sbi->fsinfo_sector); |
1387 | if (fsinfo_bh == NULL) { | 1386 | if (fsinfo_bh == NULL) { |
1388 | printk(KERN_ERR "FAT: bread failed, FSINFO block" | 1387 | fat_msg(sb, KERN_ERR, "bread failed, FSINFO block" |
1389 | " (sector = %lu)\n", sbi->fsinfo_sector); | 1388 | " (sector = %lu)", sbi->fsinfo_sector); |
1390 | brelse(bh); | 1389 | brelse(bh); |
1391 | goto out_fail; | 1390 | goto out_fail; |
1392 | } | 1391 | } |
1393 | 1392 | ||
1394 | fsinfo = (struct fat_boot_fsinfo *)fsinfo_bh->b_data; | 1393 | fsinfo = (struct fat_boot_fsinfo *)fsinfo_bh->b_data; |
1395 | if (!IS_FSINFO(fsinfo)) { | 1394 | if (!IS_FSINFO(fsinfo)) { |
1396 | printk(KERN_WARNING "FAT: Invalid FSINFO signature: " | 1395 | fat_msg(sb, KERN_WARNING, "Invalid FSINFO signature: " |
1397 | "0x%08x, 0x%08x (sector = %lu)\n", | 1396 | "0x%08x, 0x%08x (sector = %lu)", |
1398 | le32_to_cpu(fsinfo->signature1), | 1397 | le32_to_cpu(fsinfo->signature1), |
1399 | le32_to_cpu(fsinfo->signature2), | 1398 | le32_to_cpu(fsinfo->signature2), |
1400 | sbi->fsinfo_sector); | 1399 | sbi->fsinfo_sector); |
@@ -1415,8 +1414,8 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1415 | sbi->dir_entries = get_unaligned_le16(&b->dir_entries); | 1414 | sbi->dir_entries = get_unaligned_le16(&b->dir_entries); |
1416 | if (sbi->dir_entries & (sbi->dir_per_block - 1)) { | 1415 | if (sbi->dir_entries & (sbi->dir_per_block - 1)) { |
1417 | if (!silent) | 1416 | if (!silent) |
1418 | printk(KERN_ERR "FAT: bogus directroy-entries per block" | 1417 | fat_msg(sb, KERN_ERR, "bogus directroy-entries per block" |
1419 | " (%u)\n", sbi->dir_entries); | 1418 | " (%u)", sbi->dir_entries); |
1420 | brelse(bh); | 1419 | brelse(bh); |
1421 | goto out_invalid; | 1420 | goto out_invalid; |
1422 | } | 1421 | } |
@@ -1438,7 +1437,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1438 | total_clusters = min(total_clusters, fat_clusters - FAT_START_ENT); | 1437 | total_clusters = min(total_clusters, fat_clusters - FAT_START_ENT); |
1439 | if (total_clusters > MAX_FAT(sb)) { | 1438 | if (total_clusters > MAX_FAT(sb)) { |
1440 | if (!silent) | 1439 | if (!silent) |
1441 | printk(KERN_ERR "FAT: count of clusters too big (%u)\n", | 1440 | fat_msg(sb, KERN_ERR, "count of clusters too big (%u)", |
1442 | total_clusters); | 1441 | total_clusters); |
1443 | brelse(bh); | 1442 | brelse(bh); |
1444 | goto out_invalid; | 1443 | goto out_invalid; |
@@ -1471,7 +1470,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1471 | sprintf(buf, "cp%d", sbi->options.codepage); | 1470 | sprintf(buf, "cp%d", sbi->options.codepage); |
1472 | sbi->nls_disk = load_nls(buf); | 1471 | sbi->nls_disk = load_nls(buf); |
1473 | if (!sbi->nls_disk) { | 1472 | if (!sbi->nls_disk) { |
1474 | printk(KERN_ERR "FAT: codepage %s not found\n", buf); | 1473 | fat_msg(sb, KERN_ERR, "codepage %s not found", buf); |
1475 | goto out_fail; | 1474 | goto out_fail; |
1476 | } | 1475 | } |
1477 | 1476 | ||
@@ -1479,7 +1478,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1479 | if (sbi->options.isvfat) { | 1478 | if (sbi->options.isvfat) { |
1480 | sbi->nls_io = load_nls(sbi->options.iocharset); | 1479 | sbi->nls_io = load_nls(sbi->options.iocharset); |
1481 | if (!sbi->nls_io) { | 1480 | if (!sbi->nls_io) { |
1482 | printk(KERN_ERR "FAT: IO charset %s not found\n", | 1481 | fat_msg(sb, KERN_ERR, "IO charset %s not found", |
1483 | sbi->options.iocharset); | 1482 | sbi->options.iocharset); |
1484 | goto out_fail; | 1483 | goto out_fail; |
1485 | } | 1484 | } |
@@ -1503,7 +1502,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1503 | insert_inode_hash(root_inode); | 1502 | insert_inode_hash(root_inode); |
1504 | sb->s_root = d_alloc_root(root_inode); | 1503 | sb->s_root = d_alloc_root(root_inode); |
1505 | if (!sb->s_root) { | 1504 | if (!sb->s_root) { |
1506 | printk(KERN_ERR "FAT: get root inode failed\n"); | 1505 | fat_msg(sb, KERN_ERR, "get root inode failed"); |
1507 | goto out_fail; | 1506 | goto out_fail; |
1508 | } | 1507 | } |
1509 | 1508 | ||
@@ -1512,8 +1511,7 @@ int fat_fill_super(struct super_block *sb, void *data, int silent, | |||
1512 | out_invalid: | 1511 | out_invalid: |
1513 | error = -EINVAL; | 1512 | error = -EINVAL; |
1514 | if (!silent) | 1513 | if (!silent) |
1515 | printk(KERN_INFO "VFS: Can't find a valid FAT filesystem" | 1514 | fat_msg(sb, KERN_INFO, "Can't find a valid FAT filesystem"); |
1516 | " on dev %s.\n", sb->s_id); | ||
1517 | 1515 | ||
1518 | out_fail: | 1516 | out_fail: |
1519 | if (fat_inode) | 1517 | if (fat_inode) |