Merge branch 'for-linus' of git://git.infradead.org/ubifs-2.6

* 'for-linus' of git://git.infradead.org/ubifs-2.6:
UBIFS: seek journal heads to the latest bud in replay
UBIFS: do not free write-buffers when in R/O mode

+16 -37
-20
fs/ubifs/log.c
··· 175 175 } 176 176 177 177 /** 178 - * ubifs_create_buds_lists - create journal head buds lists for remount rw. 179 - * @c: UBIFS file-system description object 180 - */ 181 - void ubifs_create_buds_lists(struct ubifs_info *c) 182 - { 183 - struct rb_node *p; 184 - 185 - spin_lock(&c->buds_lock); 186 - p = rb_first(&c->buds); 187 - while (p) { 188 - struct ubifs_bud *bud = rb_entry(p, struct ubifs_bud, rb); 189 - struct ubifs_jhead *jhead = &c->jheads[bud->jhead]; 190 - 191 - list_add_tail(&bud->list, &jhead->buds_list); 192 - p = rb_next(p); 193 - } 194 - spin_unlock(&c->buds_lock); 195 - } 196 - 197 - /** 198 178 * ubifs_add_bud_to_log - add a new bud to the log. 199 179 * @c: UBIFS file-system description object 200 180 * @jhead: journal head the bud belongs to
+12 -6
fs/ubifs/replay.c
··· 59 59 * @new_size: truncation new size 60 60 * @free: amount of free space in a bud 61 61 * @dirty: amount of dirty space in a bud from padding and deletion nodes 62 + * @jhead: journal head number of the bud 62 63 * 63 64 * UBIFS journal replay must compare node sequence numbers, which means it must 64 65 * build a tree of node information to insert into the TNC. ··· 81 80 struct { 82 81 int free; 83 82 int dirty; 83 + int jhead; 84 84 }; 85 85 }; 86 86 }; ··· 161 159 err = PTR_ERR(lp); 162 160 goto out; 163 161 } 162 + 163 + /* Make sure the journal head points to the latest bud */ 164 + err = ubifs_wbuf_seek_nolock(&c->jheads[r->jhead].wbuf, r->lnum, 165 + c->leb_size - r->free, UBI_SHORTTERM); 166 + 164 167 out: 165 168 ubifs_release_lprops(c); 166 169 return err; ··· 634 627 ubifs_assert(sleb->endpt - offs >= used); 635 628 ubifs_assert(sleb->endpt % c->min_io_size == 0); 636 629 637 - if (sleb->endpt + c->min_io_size <= c->leb_size && !c->ro_mount) 638 - err = ubifs_wbuf_seek_nolock(&c->jheads[jhead].wbuf, lnum, 639 - sleb->endpt, UBI_SHORTTERM); 640 - 641 630 *dirty = sleb->endpt - offs - used; 642 631 *free = c->leb_size - sleb->endpt; 643 632 ··· 656 653 * @sqnum: sequence number 657 654 * @free: amount of free space in bud 658 655 * @dirty: amount of dirty space from padding and deletion nodes 656 + * @jhead: journal head number for the bud 659 657 * 660 658 * This function inserts a reference node to the replay tree and returns zero 661 659 * in case of success or a negative error code in case of failure. 662 660 */ 663 661 static int insert_ref_node(struct ubifs_info *c, int lnum, int offs, 664 - unsigned long long sqnum, int free, int dirty) 662 + unsigned long long sqnum, int free, int dirty, 663 + int jhead) 665 664 { 666 665 struct rb_node **p = &c->replay_tree.rb_node, *parent = NULL; 667 666 struct replay_entry *r; ··· 693 688 r->flags = REPLAY_REF; 694 689 r->free = free; 695 690 r->dirty = dirty; 691 + r->jhead = jhead; 696 692 697 693 rb_link_node(&r->rb, parent, p); 698 694 rb_insert_color(&r->rb, &c->replay_tree); ··· 718 712 if (err) 719 713 return err; 720 714 err = insert_ref_node(c, b->bud->lnum, b->bud->start, b->sqnum, 721 - free, dirty); 715 + free, dirty, b->bud->jhead); 722 716 if (err) 723 717 return err; 724 718 }
+4 -11
fs/ubifs/super.c
··· 1257 1257 goto out_free; 1258 1258 } 1259 1259 1260 + err = alloc_wbufs(c); 1261 + if (err) 1262 + goto out_cbuf; 1263 + 1260 1264 sprintf(c->bgt_name, BGT_NAME_PATTERN, c->vi.ubi_num, c->vi.vol_id); 1261 1265 if (!c->ro_mount) { 1262 - err = alloc_wbufs(c); 1263 - if (err) 1264 - goto out_cbuf; 1265 - 1266 1266 /* Create background thread */ 1267 1267 c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); 1268 1268 if (IS_ERR(c->bgt)) { ··· 1631 1631 if (err) 1632 1632 goto out; 1633 1633 1634 - err = alloc_wbufs(c); 1635 - if (err) 1636 - goto out; 1637 - 1638 - ubifs_create_buds_lists(c); 1639 - 1640 1634 /* Create background thread */ 1641 1635 c->bgt = kthread_create(ubifs_bg_thread, c, "%s", c->bgt_name); 1642 1636 if (IS_ERR(c->bgt)) { ··· 1738 1744 if (err) 1739 1745 ubifs_ro_mode(c, err); 1740 1746 1741 - free_wbufs(c); 1742 1747 vfree(c->orph_buf); 1743 1748 c->orph_buf = NULL; 1744 1749 kfree(c->write_reserve_buf);