diff options
Diffstat (limited to 'fs/ubifs/super.c')
| -rw-r--r-- | fs/ubifs/super.c | 255 |
1 files changed, 179 insertions, 76 deletions
diff --git a/fs/ubifs/super.c b/fs/ubifs/super.c index d80b2aef42b6..0d7564b95f8e 100644 --- a/fs/ubifs/super.c +++ b/fs/ubifs/super.c | |||
| @@ -34,6 +34,8 @@ | |||
| 34 | #include <linux/parser.h> | 34 | #include <linux/parser.h> |
| 35 | #include <linux/seq_file.h> | 35 | #include <linux/seq_file.h> |
| 36 | #include <linux/mount.h> | 36 | #include <linux/mount.h> |
| 37 | #include <linux/math64.h> | ||
| 38 | #include <linux/writeback.h> | ||
| 37 | #include "ubifs.h" | 39 | #include "ubifs.h" |
| 38 | 40 | ||
| 39 | /* | 41 | /* |
| @@ -417,39 +419,54 @@ static int ubifs_show_options(struct seq_file *s, struct vfsmount *mnt) | |||
| 417 | else if (c->mount_opts.chk_data_crc == 1) | 419 | else if (c->mount_opts.chk_data_crc == 1) |
| 418 | seq_printf(s, ",no_chk_data_crc"); | 420 | seq_printf(s, ",no_chk_data_crc"); |
| 419 | 421 | ||
| 422 | if (c->mount_opts.override_compr) { | ||
| 423 | seq_printf(s, ",compr="); | ||
| 424 | seq_printf(s, ubifs_compr_name(c->mount_opts.compr_type)); | ||
| 425 | } | ||
| 426 | |||
| 420 | return 0; | 427 | return 0; |
| 421 | } | 428 | } |
| 422 | 429 | ||
| 423 | static int ubifs_sync_fs(struct super_block *sb, int wait) | 430 | static int ubifs_sync_fs(struct super_block *sb, int wait) |
| 424 | { | 431 | { |
| 432 | int i, err; | ||
| 425 | struct ubifs_info *c = sb->s_fs_info; | 433 | struct ubifs_info *c = sb->s_fs_info; |
| 426 | int i, ret = 0, err; | 434 | struct writeback_control wbc = { |
| 427 | long long bud_bytes; | 435 | .sync_mode = wait ? WB_SYNC_ALL : WB_SYNC_HOLD, |
| 428 | 436 | .range_start = 0, | |
| 429 | if (c->jheads) { | 437 | .range_end = LLONG_MAX, |
| 430 | for (i = 0; i < c->jhead_cnt; i++) { | 438 | .nr_to_write = LONG_MAX, |
| 431 | err = ubifs_wbuf_sync(&c->jheads[i].wbuf); | 439 | }; |
| 432 | if (err && !ret) | 440 | |
| 433 | ret = err; | 441 | if (sb->s_flags & MS_RDONLY) |
| 434 | } | 442 | return 0; |
| 435 | 443 | ||
| 436 | /* Commit the journal unless it has too little data */ | 444 | /* |
| 437 | spin_lock(&c->buds_lock); | 445 | * Synchronize write buffers, because 'ubifs_run_commit()' does not |
| 438 | bud_bytes = c->bud_bytes; | 446 | * do this if it waits for an already running commit. |
| 439 | spin_unlock(&c->buds_lock); | 447 | */ |
| 440 | if (bud_bytes > c->leb_size) { | 448 | for (i = 0; i < c->jhead_cnt; i++) { |
| 441 | err = ubifs_run_commit(c); | 449 | err = ubifs_wbuf_sync(&c->jheads[i].wbuf); |
| 442 | if (err) | 450 | if (err) |
| 443 | return err; | 451 | return err; |
| 444 | } | ||
| 445 | } | 452 | } |
| 446 | 453 | ||
| 447 | /* | 454 | /* |
| 448 | * We ought to call sync for c->ubi but it does not have one. If it had | 455 | * VFS calls '->sync_fs()' before synchronizing all dirty inodes and |
| 449 | * it would in turn call mtd->sync, however mtd operations are | 456 | * pages, so synchronize them first, then commit the journal. Strictly |
| 450 | * synchronous anyway, so we don't lose any sleep here. | 457 | * speaking, it is not necessary to commit the journal here, |
| 458 | * synchronizing write-buffers would be enough. But committing makes | ||
| 459 | * UBIFS free space predictions much more accurate, so we want to let | ||
| 460 | * the user be able to get more accurate results of 'statfs()' after | ||
| 461 | * they synchronize the file system. | ||
| 451 | */ | 462 | */ |
| 452 | return ret; | 463 | generic_sync_sb_inodes(sb, &wbc); |
| 464 | |||
| 465 | err = ubifs_run_commit(c); | ||
| 466 | if (err) | ||
| 467 | return err; | ||
| 468 | |||
| 469 | return ubi_sync(c->vi.ubi_num); | ||
| 453 | } | 470 | } |
| 454 | 471 | ||
| 455 | /** | 472 | /** |
| @@ -596,7 +613,7 @@ static int bud_wbuf_callback(struct ubifs_info *c, int lnum, int free, int pad) | |||
| 596 | } | 613 | } |
| 597 | 614 | ||
| 598 | /* | 615 | /* |
| 599 | * init_constants_late - initialize UBIFS constants. | 616 | * init_constants_sb - initialize UBIFS constants. |
| 600 | * @c: UBIFS file-system description object | 617 | * @c: UBIFS file-system description object |
| 601 | * | 618 | * |
| 602 | * This is a helper function which initializes various UBIFS constants after | 619 | * This is a helper function which initializes various UBIFS constants after |
| @@ -604,10 +621,10 @@ static int bud_wbuf_callback(struct ubifs_info *c, int lnum, int free, int pad) | |||
| 604 | * makes sure they are all right. Returns zero in case of success and a | 621 | * makes sure they are all right. Returns zero in case of success and a |
| 605 | * negative error code in case of failure. | 622 | * negative error code in case of failure. |
| 606 | */ | 623 | */ |
| 607 | static int init_constants_late(struct ubifs_info *c) | 624 | static int init_constants_sb(struct ubifs_info *c) |
| 608 | { | 625 | { |
| 609 | int tmp, err; | 626 | int tmp, err; |
| 610 | uint64_t tmp64; | 627 | long long tmp64; |
| 611 | 628 | ||
| 612 | c->main_bytes = (long long)c->main_lebs * c->leb_size; | 629 | c->main_bytes = (long long)c->main_lebs * c->leb_size; |
| 613 | c->max_znode_sz = sizeof(struct ubifs_znode) + | 630 | c->max_znode_sz = sizeof(struct ubifs_znode) + |
| @@ -634,9 +651,8 @@ static int init_constants_late(struct ubifs_info *c) | |||
| 634 | * Make sure that the log is large enough to fit reference nodes for | 651 | * Make sure that the log is large enough to fit reference nodes for |
| 635 | * all buds plus one reserved LEB. | 652 | * all buds plus one reserved LEB. |
| 636 | */ | 653 | */ |
| 637 | tmp64 = c->max_bud_bytes; | 654 | tmp64 = c->max_bud_bytes + c->leb_size - 1; |
| 638 | tmp = do_div(tmp64, c->leb_size); | 655 | c->max_bud_cnt = div_u64(tmp64, c->leb_size); |
| 639 | c->max_bud_cnt = tmp64 + !!tmp; | ||
| 640 | tmp = (c->ref_node_alsz * c->max_bud_cnt + c->leb_size - 1); | 656 | tmp = (c->ref_node_alsz * c->max_bud_cnt + c->leb_size - 1); |
| 641 | tmp /= c->leb_size; | 657 | tmp /= c->leb_size; |
| 642 | tmp += 1; | 658 | tmp += 1; |
| @@ -672,7 +688,7 @@ static int init_constants_late(struct ubifs_info *c) | |||
| 672 | * Consequently, if the journal is too small, UBIFS will treat it as | 688 | * Consequently, if the journal is too small, UBIFS will treat it as |
| 673 | * always full. | 689 | * always full. |
| 674 | */ | 690 | */ |
| 675 | tmp64 = (uint64_t)(c->jhead_cnt + 1) * c->leb_size + 1; | 691 | tmp64 = (long long)(c->jhead_cnt + 1) * c->leb_size + 1; |
| 676 | if (c->bg_bud_bytes < tmp64) | 692 | if (c->bg_bud_bytes < tmp64) |
| 677 | c->bg_bud_bytes = tmp64; | 693 | c->bg_bud_bytes = tmp64; |
| 678 | if (c->max_bud_bytes < tmp64 + c->leb_size) | 694 | if (c->max_bud_bytes < tmp64 + c->leb_size) |
| @@ -682,6 +698,21 @@ static int init_constants_late(struct ubifs_info *c) | |||
| 682 | if (err) | 698 | if (err) |
| 683 | return err; | 699 | return err; |
| 684 | 700 | ||
| 701 | return 0; | ||
| 702 | } | ||
| 703 | |||
| 704 | /* | ||
| 705 | * init_constants_master - initialize UBIFS constants. | ||
| 706 | * @c: UBIFS file-system description object | ||
| 707 | * | ||
| 708 | * This is a helper function which initializes various UBIFS constants after | ||
| 709 | * the master node has been read. It also checks various UBIFS parameters and | ||
| 710 | * makes sure they are all right. | ||
| 711 | */ | ||
| 712 | static void init_constants_master(struct ubifs_info *c) | ||
| 713 | { | ||
| 714 | long long tmp64; | ||
| 715 | |||
| 685 | c->min_idx_lebs = ubifs_calc_min_idx_lebs(c); | 716 | c->min_idx_lebs = ubifs_calc_min_idx_lebs(c); |
| 686 | 717 | ||
| 687 | /* | 718 | /* |
| @@ -690,14 +721,13 @@ static int init_constants_late(struct ubifs_info *c) | |||
| 690 | * necessary to report something for the 'statfs()' call. | 721 | * necessary to report something for the 'statfs()' call. |
| 691 | * | 722 | * |
| 692 | * Subtract the LEB reserved for GC, the LEB which is reserved for | 723 | * Subtract the LEB reserved for GC, the LEB which is reserved for |
| 693 | * deletions, and assume only one journal head is available. | 724 | * deletions, minimum LEBs for the index, and assume only one journal |
| 725 | * head is available. | ||
| 694 | */ | 726 | */ |
| 695 | tmp64 = c->main_lebs - 2 - c->jhead_cnt + 1; | 727 | tmp64 = c->main_lebs - 1 - 1 - MIN_INDEX_LEBS - c->jhead_cnt + 1; |
| 696 | tmp64 *= (uint64_t)c->leb_size - c->leb_overhead; | 728 | tmp64 *= (long long)c->leb_size - c->leb_overhead; |
| 697 | tmp64 = ubifs_reported_space(c, tmp64); | 729 | tmp64 = ubifs_reported_space(c, tmp64); |
| 698 | c->block_cnt = tmp64 >> UBIFS_BLOCK_SHIFT; | 730 | c->block_cnt = tmp64 >> UBIFS_BLOCK_SHIFT; |
| 699 | |||
| 700 | return 0; | ||
| 701 | } | 731 | } |
| 702 | 732 | ||
| 703 | /** | 733 | /** |
| @@ -878,6 +908,7 @@ static int check_volume_empty(struct ubifs_info *c) | |||
| 878 | * Opt_no_bulk_read: disable bulk-reads | 908 | * Opt_no_bulk_read: disable bulk-reads |
| 879 | * Opt_chk_data_crc: check CRCs when reading data nodes | 909 | * Opt_chk_data_crc: check CRCs when reading data nodes |
| 880 | * Opt_no_chk_data_crc: do not check CRCs when reading data nodes | 910 | * Opt_no_chk_data_crc: do not check CRCs when reading data nodes |
| 911 | * Opt_override_compr: override default compressor | ||
| 881 | * Opt_err: just end of array marker | 912 | * Opt_err: just end of array marker |
| 882 | */ | 913 | */ |
| 883 | enum { | 914 | enum { |
| @@ -887,6 +918,7 @@ enum { | |||
| 887 | Opt_no_bulk_read, | 918 | Opt_no_bulk_read, |
| 888 | Opt_chk_data_crc, | 919 | Opt_chk_data_crc, |
| 889 | Opt_no_chk_data_crc, | 920 | Opt_no_chk_data_crc, |
| 921 | Opt_override_compr, | ||
| 890 | Opt_err, | 922 | Opt_err, |
| 891 | }; | 923 | }; |
| 892 | 924 | ||
| @@ -897,6 +929,7 @@ static const match_table_t tokens = { | |||
| 897 | {Opt_no_bulk_read, "no_bulk_read"}, | 929 | {Opt_no_bulk_read, "no_bulk_read"}, |
| 898 | {Opt_chk_data_crc, "chk_data_crc"}, | 930 | {Opt_chk_data_crc, "chk_data_crc"}, |
| 899 | {Opt_no_chk_data_crc, "no_chk_data_crc"}, | 931 | {Opt_no_chk_data_crc, "no_chk_data_crc"}, |
| 932 | {Opt_override_compr, "compr=%s"}, | ||
| 900 | {Opt_err, NULL}, | 933 | {Opt_err, NULL}, |
| 901 | }; | 934 | }; |
| 902 | 935 | ||
| @@ -950,6 +983,28 @@ static int ubifs_parse_options(struct ubifs_info *c, char *options, | |||
| 950 | c->mount_opts.chk_data_crc = 1; | 983 | c->mount_opts.chk_data_crc = 1; |
| 951 | c->no_chk_data_crc = 1; | 984 | c->no_chk_data_crc = 1; |
| 952 | break; | 985 | break; |
| 986 | case Opt_override_compr: | ||
| 987 | { | ||
| 988 | char *name = match_strdup(&args[0]); | ||
| 989 | |||
| 990 | if (!name) | ||
| 991 | return -ENOMEM; | ||
| 992 | if (!strcmp(name, "none")) | ||
| 993 | c->mount_opts.compr_type = UBIFS_COMPR_NONE; | ||
| 994 | else if (!strcmp(name, "lzo")) | ||
| 995 | c->mount_opts.compr_type = UBIFS_COMPR_LZO; | ||
| 996 | else if (!strcmp(name, "zlib")) | ||
| 997 | c->mount_opts.compr_type = UBIFS_COMPR_ZLIB; | ||
| 998 | else { | ||
| 999 | ubifs_err("unknown compressor \"%s\"", name); | ||
| 1000 | kfree(name); | ||
| 1001 | return -EINVAL; | ||
| 1002 | } | ||
| 1003 | kfree(name); | ||
| 1004 | c->mount_opts.override_compr = 1; | ||
| 1005 | c->default_compr = c->mount_opts.compr_type; | ||
| 1006 | break; | ||
| 1007 | } | ||
| 953 | default: | 1008 | default: |
| 954 | ubifs_err("unrecognized mount option \"%s\" " | 1009 | ubifs_err("unrecognized mount option \"%s\" " |
| 955 | "or missing value", p); | 1010 | "or missing value", p); |
| @@ -1019,6 +1074,30 @@ again: | |||
| 1019 | } | 1074 | } |
| 1020 | 1075 | ||
| 1021 | /** | 1076 | /** |
| 1077 | * check_free_space - check if there is enough free space to mount. | ||
| 1078 | * @c: UBIFS file-system description object | ||
| 1079 | * | ||
| 1080 | * This function makes sure UBIFS has enough free space to be mounted in | ||
| 1081 | * read/write mode. UBIFS must always have some free space to allow deletions. | ||
| 1082 | */ | ||
| 1083 | static int check_free_space(struct ubifs_info *c) | ||
| 1084 | { | ||
| 1085 | ubifs_assert(c->dark_wm > 0); | ||
| 1086 | if (c->lst.total_free + c->lst.total_dirty < c->dark_wm) { | ||
| 1087 | ubifs_err("insufficient free space to mount in read/write mode"); | ||
| 1088 | dbg_dump_budg(c); | ||
| 1089 | dbg_dump_lprops(c); | ||
| 1090 | /* | ||
| 1091 | * We return %-EINVAL instead of %-ENOSPC because it seems to | ||
| 1092 | * be the closest error code mentioned in the mount function | ||
| 1093 | * documentation. | ||
| 1094 | */ | ||
| 1095 | return -EINVAL; | ||
| 1096 | } | ||
| 1097 | return 0; | ||
| 1098 | } | ||
| 1099 | |||
| 1100 | /** | ||
| 1022 | * mount_ubifs - mount UBIFS file-system. | 1101 | * mount_ubifs - mount UBIFS file-system. |
| 1023 | * @c: UBIFS file-system description object | 1102 | * @c: UBIFS file-system description object |
| 1024 | * | 1103 | * |
| @@ -1039,11 +1118,9 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1039 | if (err) | 1118 | if (err) |
| 1040 | return err; | 1119 | return err; |
| 1041 | 1120 | ||
| 1042 | #ifdef CONFIG_UBIFS_FS_DEBUG | 1121 | err = ubifs_debugging_init(c); |
| 1043 | c->dbg_buf = vmalloc(c->leb_size); | 1122 | if (err) |
| 1044 | if (!c->dbg_buf) | 1123 | return err; |
| 1045 | return -ENOMEM; | ||
| 1046 | #endif | ||
| 1047 | 1124 | ||
| 1048 | err = check_volume_empty(c); | 1125 | err = check_volume_empty(c); |
| 1049 | if (err) | 1126 | if (err) |
| @@ -1100,27 +1177,25 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1100 | goto out_free; | 1177 | goto out_free; |
| 1101 | 1178 | ||
| 1102 | /* | 1179 | /* |
| 1103 | * Make sure the compressor which is set as the default on in the | 1180 | * Make sure the compressor which is set as default in the superblock |
| 1104 | * superblock was actually compiled in. | 1181 | * or overridden by mount options is actually compiled in. |
| 1105 | */ | 1182 | */ |
| 1106 | if (!ubifs_compr_present(c->default_compr)) { | 1183 | if (!ubifs_compr_present(c->default_compr)) { |
| 1107 | ubifs_warn("'%s' compressor is set by superblock, but not " | 1184 | ubifs_err("'compressor \"%s\" is not compiled in", |
| 1108 | "compiled in", ubifs_compr_name(c->default_compr)); | 1185 | ubifs_compr_name(c->default_compr)); |
| 1109 | c->default_compr = UBIFS_COMPR_NONE; | 1186 | goto out_free; |
| 1110 | } | 1187 | } |
| 1111 | 1188 | ||
| 1112 | dbg_failure_mode_registration(c); | 1189 | err = init_constants_sb(c); |
| 1113 | |||
| 1114 | err = init_constants_late(c); | ||
| 1115 | if (err) | 1190 | if (err) |
| 1116 | goto out_dereg; | 1191 | goto out_free; |
| 1117 | 1192 | ||
| 1118 | sz = ALIGN(c->max_idx_node_sz, c->min_io_size); | 1193 | sz = ALIGN(c->max_idx_node_sz, c->min_io_size); |
| 1119 | sz = ALIGN(sz + c->max_idx_node_sz, c->min_io_size); | 1194 | sz = ALIGN(sz + c->max_idx_node_sz, c->min_io_size); |
| 1120 | c->cbuf = kmalloc(sz, GFP_NOFS); | 1195 | c->cbuf = kmalloc(sz, GFP_NOFS); |
| 1121 | if (!c->cbuf) { | 1196 | if (!c->cbuf) { |
| 1122 | err = -ENOMEM; | 1197 | err = -ENOMEM; |
| 1123 | goto out_dereg; | 1198 | goto out_free; |
| 1124 | } | 1199 | } |
| 1125 | 1200 | ||
| 1126 | sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); | 1201 | sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); |
| @@ -1145,6 +1220,8 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1145 | if (err) | 1220 | if (err) |
| 1146 | goto out_master; | 1221 | goto out_master; |
| 1147 | 1222 | ||
| 1223 | init_constants_master(c); | ||
| 1224 | |||
| 1148 | if ((c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY)) != 0) { | 1225 | if ((c->mst_node->flags & cpu_to_le32(UBIFS_MST_DIRTY)) != 0) { |
| 1149 | ubifs_msg("recovery needed"); | 1226 | ubifs_msg("recovery needed"); |
| 1150 | c->need_recovery = 1; | 1227 | c->need_recovery = 1; |
| @@ -1183,12 +1260,9 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1183 | if (!mounted_read_only) { | 1260 | if (!mounted_read_only) { |
| 1184 | int lnum; | 1261 | int lnum; |
| 1185 | 1262 | ||
| 1186 | /* Check for enough free space */ | 1263 | err = check_free_space(c); |
| 1187 | if (ubifs_calc_available(c, c->min_idx_lebs) <= 0) { | 1264 | if (err) |
| 1188 | ubifs_err("insufficient available space"); | ||
| 1189 | err = -EINVAL; | ||
| 1190 | goto out_orphans; | 1265 | goto out_orphans; |
| 1191 | } | ||
| 1192 | 1266 | ||
| 1193 | /* Check for enough log space */ | 1267 | /* Check for enough log space */ |
| 1194 | lnum = c->lhead_lnum + 1; | 1268 | lnum = c->lhead_lnum + 1; |
| @@ -1232,6 +1306,10 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1232 | } | 1306 | } |
| 1233 | } | 1307 | } |
| 1234 | 1308 | ||
| 1309 | err = dbg_debugfs_init_fs(c); | ||
| 1310 | if (err) | ||
| 1311 | goto out_infos; | ||
| 1312 | |||
| 1235 | err = dbg_check_filesystem(c); | 1313 | err = dbg_check_filesystem(c); |
| 1236 | if (err) | 1314 | if (err) |
| 1237 | goto out_infos; | 1315 | goto out_infos; |
| @@ -1283,8 +1361,20 @@ static int mount_ubifs(struct ubifs_info *c) | |||
| 1283 | dbg_msg("tree fanout: %d", c->fanout); | 1361 | dbg_msg("tree fanout: %d", c->fanout); |
| 1284 | dbg_msg("reserved GC LEB: %d", c->gc_lnum); | 1362 | dbg_msg("reserved GC LEB: %d", c->gc_lnum); |
| 1285 | dbg_msg("first main LEB: %d", c->main_first); | 1363 | dbg_msg("first main LEB: %d", c->main_first); |
| 1364 | dbg_msg("max. znode size %d", c->max_znode_sz); | ||
| 1365 | dbg_msg("max. index node size %d", c->max_idx_node_sz); | ||
| 1366 | dbg_msg("node sizes: data %zu, inode %zu, dentry %zu", | ||
| 1367 | UBIFS_DATA_NODE_SZ, UBIFS_INO_NODE_SZ, UBIFS_DENT_NODE_SZ); | ||
| 1368 | dbg_msg("node sizes: trun %zu, sb %zu, master %zu", | ||
| 1369 | UBIFS_TRUN_NODE_SZ, UBIFS_SB_NODE_SZ, UBIFS_MST_NODE_SZ); | ||
| 1370 | dbg_msg("node sizes: ref %zu, cmt. start %zu, orph %zu", | ||
| 1371 | UBIFS_REF_NODE_SZ, UBIFS_CS_NODE_SZ, UBIFS_ORPH_NODE_SZ); | ||
| 1372 | dbg_msg("max. node sizes: data %zu, inode %zu dentry %zu", | ||
| 1373 | UBIFS_MAX_DATA_NODE_SZ, UBIFS_MAX_INO_NODE_SZ, | ||
| 1374 | UBIFS_MAX_DENT_NODE_SZ); | ||
| 1286 | dbg_msg("dead watermark: %d", c->dead_wm); | 1375 | dbg_msg("dead watermark: %d", c->dead_wm); |
| 1287 | dbg_msg("dark watermark: %d", c->dark_wm); | 1376 | dbg_msg("dark watermark: %d", c->dark_wm); |
| 1377 | dbg_msg("LEB overhead: %d", c->leb_overhead); | ||
| 1288 | x = (long long)c->main_lebs * c->dark_wm; | 1378 | x = (long long)c->main_lebs * c->dark_wm; |
| 1289 | dbg_msg("max. dark space: %lld (%lld KiB, %lld MiB)", | 1379 | dbg_msg("max. dark space: %lld (%lld KiB, %lld MiB)", |
| 1290 | x, x >> 10, x >> 20); | 1380 | x, x >> 10, x >> 20); |
| @@ -1320,14 +1410,12 @@ out_wbufs: | |||
| 1320 | free_wbufs(c); | 1410 | free_wbufs(c); |
| 1321 | out_cbuf: | 1411 | out_cbuf: |
| 1322 | kfree(c->cbuf); | 1412 | kfree(c->cbuf); |
| 1323 | out_dereg: | ||
| 1324 | dbg_failure_mode_deregistration(c); | ||
| 1325 | out_free: | 1413 | out_free: |
| 1326 | kfree(c->bu.buf); | 1414 | kfree(c->bu.buf); |
| 1327 | vfree(c->ileb_buf); | 1415 | vfree(c->ileb_buf); |
| 1328 | vfree(c->sbuf); | 1416 | vfree(c->sbuf); |
| 1329 | kfree(c->bottom_up_buf); | 1417 | kfree(c->bottom_up_buf); |
| 1330 | UBIFS_DBG(vfree(c->dbg_buf)); | 1418 | ubifs_debugging_exit(c); |
| 1331 | return err; | 1419 | return err; |
| 1332 | } | 1420 | } |
| 1333 | 1421 | ||
| @@ -1345,6 +1433,7 @@ static void ubifs_umount(struct ubifs_info *c) | |||
| 1345 | dbg_gen("un-mounting UBI device %d, volume %d", c->vi.ubi_num, | 1433 | dbg_gen("un-mounting UBI device %d, volume %d", c->vi.ubi_num, |
| 1346 | c->vi.vol_id); | 1434 | c->vi.vol_id); |
| 1347 | 1435 | ||
| 1436 | dbg_debugfs_exit_fs(c); | ||
| 1348 | spin_lock(&ubifs_infos_lock); | 1437 | spin_lock(&ubifs_infos_lock); |
| 1349 | list_del(&c->infos_list); | 1438 | list_del(&c->infos_list); |
| 1350 | spin_unlock(&ubifs_infos_lock); | 1439 | spin_unlock(&ubifs_infos_lock); |
| @@ -1364,8 +1453,7 @@ static void ubifs_umount(struct ubifs_info *c) | |||
| 1364 | vfree(c->ileb_buf); | 1453 | vfree(c->ileb_buf); |
| 1365 | vfree(c->sbuf); | 1454 | vfree(c->sbuf); |
| 1366 | kfree(c->bottom_up_buf); | 1455 | kfree(c->bottom_up_buf); |
| 1367 | UBIFS_DBG(vfree(c->dbg_buf)); | 1456 | ubifs_debugging_exit(c); |
| 1368 | dbg_failure_mode_deregistration(c); | ||
| 1369 | } | 1457 | } |
| 1370 | 1458 | ||
| 1371 | /** | 1459 | /** |
| @@ -1387,12 +1475,9 @@ static int ubifs_remount_rw(struct ubifs_info *c) | |||
| 1387 | c->remounting_rw = 1; | 1475 | c->remounting_rw = 1; |
| 1388 | c->always_chk_crc = 1; | 1476 | c->always_chk_crc = 1; |
| 1389 | 1477 | ||
| 1390 | /* Check for enough free space */ | 1478 | err = check_free_space(c); |
| 1391 | if (ubifs_calc_available(c, c->min_idx_lebs) <= 0) { | 1479 | if (err) |
| 1392 | ubifs_err("insufficient available space"); | ||
| 1393 | err = -EINVAL; | ||
| 1394 | goto out; | 1480 | goto out; |
| 1395 | } | ||
| 1396 | 1481 | ||
| 1397 | if (c->old_leb_cnt != c->leb_cnt) { | 1482 | if (c->old_leb_cnt != c->leb_cnt) { |
| 1398 | struct ubifs_sb_node *sup; | 1483 | struct ubifs_sb_node *sup; |
| @@ -1515,20 +1600,24 @@ out: | |||
| 1515 | * @c: UBIFS file-system description object | 1600 | * @c: UBIFS file-system description object |
| 1516 | * | 1601 | * |
| 1517 | * This function is called during un-mounting and re-mounting, and it commits | 1602 | * This function is called during un-mounting and re-mounting, and it commits |
| 1518 | * the journal unless the "fast unmount" mode is enabled. It also avoids | 1603 | * the journal unless the "fast unmount" mode is enabled. |
| 1519 | * committing the journal if it contains too few data. | ||
| 1520 | */ | 1604 | */ |
| 1521 | static void commit_on_unmount(struct ubifs_info *c) | 1605 | static void commit_on_unmount(struct ubifs_info *c) |
| 1522 | { | 1606 | { |
| 1523 | if (!c->fast_unmount) { | 1607 | struct super_block *sb = c->vfs_sb; |
| 1524 | long long bud_bytes; | 1608 | long long bud_bytes; |
| 1525 | 1609 | ||
| 1526 | spin_lock(&c->buds_lock); | 1610 | /* |
| 1527 | bud_bytes = c->bud_bytes; | 1611 | * This function is called before the background thread is stopped, so |
| 1528 | spin_unlock(&c->buds_lock); | 1612 | * we may race with ongoing commit, which means we have to take |
| 1529 | if (bud_bytes > c->leb_size) | 1613 | * @c->bud_lock to access @c->bud_bytes. |
| 1530 | ubifs_run_commit(c); | 1614 | */ |
| 1531 | } | 1615 | spin_lock(&c->buds_lock); |
| 1616 | bud_bytes = c->bud_bytes; | ||
| 1617 | spin_unlock(&c->buds_lock); | ||
| 1618 | |||
| 1619 | if (!c->fast_unmount && !(sb->s_flags & MS_RDONLY) && bud_bytes) | ||
| 1620 | ubifs_run_commit(c); | ||
| 1532 | } | 1621 | } |
| 1533 | 1622 | ||
| 1534 | /** | 1623 | /** |
| @@ -1849,7 +1938,6 @@ static int ubifs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 1849 | goto out_iput; | 1938 | goto out_iput; |
| 1850 | 1939 | ||
| 1851 | mutex_unlock(&c->umount_mutex); | 1940 | mutex_unlock(&c->umount_mutex); |
| 1852 | |||
| 1853 | return 0; | 1941 | return 0; |
| 1854 | 1942 | ||
| 1855 | out_iput: | 1943 | out_iput: |
| @@ -1955,7 +2043,7 @@ static void ubifs_kill_sb(struct super_block *sb) | |||
| 1955 | * We do 'commit_on_unmount()' here instead of 'ubifs_put_super()' | 2043 | * We do 'commit_on_unmount()' here instead of 'ubifs_put_super()' |
| 1956 | * in order to be outside BKL. | 2044 | * in order to be outside BKL. |
| 1957 | */ | 2045 | */ |
| 1958 | if (sb->s_root && !(sb->s_flags & MS_RDONLY)) | 2046 | if (sb->s_root) |
| 1959 | commit_on_unmount(c); | 2047 | commit_on_unmount(c); |
| 1960 | /* The un-mount routine is actually done in put_super() */ | 2048 | /* The un-mount routine is actually done in put_super() */ |
| 1961 | generic_shutdown_super(sb); | 2049 | generic_shutdown_super(sb); |
| @@ -2021,6 +2109,14 @@ static int __init ubifs_init(void) | |||
| 2021 | BUILD_BUG_ON(UBIFS_REF_NODE_SZ != 64); | 2109 | BUILD_BUG_ON(UBIFS_REF_NODE_SZ != 64); |
| 2022 | 2110 | ||
| 2023 | /* | 2111 | /* |
| 2112 | * We use 2 bit wide bit-fields to store compression type, which should | ||
| 2113 | * be amended if more compressors are added. The bit-fields are: | ||
| 2114 | * @compr_type in 'struct ubifs_inode', @default_compr in | ||
| 2115 | * 'struct ubifs_info' and @compr_type in 'struct ubifs_mount_opts'. | ||
| 2116 | */ | ||
| 2117 | BUILD_BUG_ON(UBIFS_COMPR_TYPES_CNT > 4); | ||
| 2118 | |||
| 2119 | /* | ||
| 2024 | * We require that PAGE_CACHE_SIZE is greater-than-or-equal-to | 2120 | * We require that PAGE_CACHE_SIZE is greater-than-or-equal-to |
| 2025 | * UBIFS_BLOCK_SIZE. It is assumed that both are powers of 2. | 2121 | * UBIFS_BLOCK_SIZE. It is assumed that both are powers of 2. |
| 2026 | */ | 2122 | */ |
| @@ -2049,11 +2145,17 @@ static int __init ubifs_init(void) | |||
| 2049 | 2145 | ||
| 2050 | err = ubifs_compressors_init(); | 2146 | err = ubifs_compressors_init(); |
| 2051 | if (err) | 2147 | if (err) |
| 2148 | goto out_shrinker; | ||
| 2149 | |||
| 2150 | err = dbg_debugfs_init(); | ||
| 2151 | if (err) | ||
| 2052 | goto out_compr; | 2152 | goto out_compr; |
| 2053 | 2153 | ||
| 2054 | return 0; | 2154 | return 0; |
| 2055 | 2155 | ||
| 2056 | out_compr: | 2156 | out_compr: |
| 2157 | ubifs_compressors_exit(); | ||
| 2158 | out_shrinker: | ||
| 2057 | unregister_shrinker(&ubifs_shrinker_info); | 2159 | unregister_shrinker(&ubifs_shrinker_info); |
| 2058 | kmem_cache_destroy(ubifs_inode_slab); | 2160 | kmem_cache_destroy(ubifs_inode_slab); |
| 2059 | out_reg: | 2161 | out_reg: |
| @@ -2068,6 +2170,7 @@ static void __exit ubifs_exit(void) | |||
| 2068 | ubifs_assert(list_empty(&ubifs_infos)); | 2170 | ubifs_assert(list_empty(&ubifs_infos)); |
| 2069 | ubifs_assert(atomic_long_read(&ubifs_clean_zn_cnt) == 0); | 2171 | ubifs_assert(atomic_long_read(&ubifs_clean_zn_cnt) == 0); |
| 2070 | 2172 | ||
| 2173 | dbg_debugfs_exit(); | ||
| 2071 | ubifs_compressors_exit(); | 2174 | ubifs_compressors_exit(); |
| 2072 | unregister_shrinker(&ubifs_shrinker_info); | 2175 | unregister_shrinker(&ubifs_shrinker_info); |
| 2073 | kmem_cache_destroy(ubifs_inode_slab); | 2176 | kmem_cache_destroy(ubifs_inode_slab); |
