1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * This file is part of UBIFS.
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Copyright (C) 2006-2008 Nokia Corporation.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+
7*4882a593Smuzhiyun *
8*4882a593Smuzhiyun * Authors: Artem Bityutskiy (Битюцкий Артём)
9*4882a593Smuzhiyun * Adrian Hunter
10*4882a593Smuzhiyun */
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun * This file is a part of UBIFS journal implementation and contains various
14*4882a593Smuzhiyun * functions which manipulate the log. The log is a fixed area on the flash
15*4882a593Smuzhiyun * which does not contain any data but refers to buds. The log is a part of the
16*4882a593Smuzhiyun * journal.
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun #ifdef __UBOOT__
20*4882a593Smuzhiyun #include <linux/err.h>
21*4882a593Smuzhiyun #endif
22*4882a593Smuzhiyun #include "ubifs.h"
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun static int dbg_check_bud_bytes(struct ubifs_info *c);
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun /**
27*4882a593Smuzhiyun * ubifs_search_bud - search bud LEB.
28*4882a593Smuzhiyun * @c: UBIFS file-system description object
29*4882a593Smuzhiyun * @lnum: logical eraseblock number to search
30*4882a593Smuzhiyun *
31*4882a593Smuzhiyun * This function searches bud LEB @lnum. Returns bud description object in case
32*4882a593Smuzhiyun * of success and %NULL if there is no bud with this LEB number.
33*4882a593Smuzhiyun */
ubifs_search_bud(struct ubifs_info * c,int lnum)34*4882a593Smuzhiyun struct ubifs_bud *ubifs_search_bud(struct ubifs_info *c, int lnum)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun struct rb_node *p;
37*4882a593Smuzhiyun struct ubifs_bud *bud;
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun spin_lock(&c->buds_lock);
40*4882a593Smuzhiyun p = c->buds.rb_node;
41*4882a593Smuzhiyun while (p) {
42*4882a593Smuzhiyun bud = rb_entry(p, struct ubifs_bud, rb);
43*4882a593Smuzhiyun if (lnum < bud->lnum)
44*4882a593Smuzhiyun p = p->rb_left;
45*4882a593Smuzhiyun else if (lnum > bud->lnum)
46*4882a593Smuzhiyun p = p->rb_right;
47*4882a593Smuzhiyun else {
48*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
49*4882a593Smuzhiyun return bud;
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun }
52*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
53*4882a593Smuzhiyun return NULL;
54*4882a593Smuzhiyun }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /**
57*4882a593Smuzhiyun * ubifs_get_wbuf - get the wbuf associated with a LEB, if there is one.
58*4882a593Smuzhiyun * @c: UBIFS file-system description object
59*4882a593Smuzhiyun * @lnum: logical eraseblock number to search
60*4882a593Smuzhiyun *
61*4882a593Smuzhiyun * This functions returns the wbuf for @lnum or %NULL if there is not one.
62*4882a593Smuzhiyun */
ubifs_get_wbuf(struct ubifs_info * c,int lnum)63*4882a593Smuzhiyun struct ubifs_wbuf *ubifs_get_wbuf(struct ubifs_info *c, int lnum)
64*4882a593Smuzhiyun {
65*4882a593Smuzhiyun struct rb_node *p;
66*4882a593Smuzhiyun struct ubifs_bud *bud;
67*4882a593Smuzhiyun int jhead;
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun if (!c->jheads)
70*4882a593Smuzhiyun return NULL;
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun spin_lock(&c->buds_lock);
73*4882a593Smuzhiyun p = c->buds.rb_node;
74*4882a593Smuzhiyun while (p) {
75*4882a593Smuzhiyun bud = rb_entry(p, struct ubifs_bud, rb);
76*4882a593Smuzhiyun if (lnum < bud->lnum)
77*4882a593Smuzhiyun p = p->rb_left;
78*4882a593Smuzhiyun else if (lnum > bud->lnum)
79*4882a593Smuzhiyun p = p->rb_right;
80*4882a593Smuzhiyun else {
81*4882a593Smuzhiyun jhead = bud->jhead;
82*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
83*4882a593Smuzhiyun return &c->jheads[jhead].wbuf;
84*4882a593Smuzhiyun }
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
87*4882a593Smuzhiyun return NULL;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun * empty_log_bytes - calculate amount of empty space in the log.
92*4882a593Smuzhiyun * @c: UBIFS file-system description object
93*4882a593Smuzhiyun */
empty_log_bytes(const struct ubifs_info * c)94*4882a593Smuzhiyun static inline long long empty_log_bytes(const struct ubifs_info *c)
95*4882a593Smuzhiyun {
96*4882a593Smuzhiyun long long h, t;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun h = (long long)c->lhead_lnum * c->leb_size + c->lhead_offs;
99*4882a593Smuzhiyun t = (long long)c->ltail_lnum * c->leb_size;
100*4882a593Smuzhiyun
101*4882a593Smuzhiyun if (h > t)
102*4882a593Smuzhiyun return c->log_bytes - h + t;
103*4882a593Smuzhiyun else if (h != t)
104*4882a593Smuzhiyun return t - h;
105*4882a593Smuzhiyun else if (c->lhead_lnum != c->ltail_lnum)
106*4882a593Smuzhiyun return 0;
107*4882a593Smuzhiyun else
108*4882a593Smuzhiyun return c->log_bytes;
109*4882a593Smuzhiyun }
110*4882a593Smuzhiyun
111*4882a593Smuzhiyun /**
112*4882a593Smuzhiyun * ubifs_add_bud - add bud LEB to the tree of buds and its journal head list.
113*4882a593Smuzhiyun * @c: UBIFS file-system description object
114*4882a593Smuzhiyun * @bud: the bud to add
115*4882a593Smuzhiyun */
ubifs_add_bud(struct ubifs_info * c,struct ubifs_bud * bud)116*4882a593Smuzhiyun void ubifs_add_bud(struct ubifs_info *c, struct ubifs_bud *bud)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun struct rb_node **p, *parent = NULL;
119*4882a593Smuzhiyun struct ubifs_bud *b;
120*4882a593Smuzhiyun struct ubifs_jhead *jhead;
121*4882a593Smuzhiyun
122*4882a593Smuzhiyun spin_lock(&c->buds_lock);
123*4882a593Smuzhiyun p = &c->buds.rb_node;
124*4882a593Smuzhiyun while (*p) {
125*4882a593Smuzhiyun parent = *p;
126*4882a593Smuzhiyun b = rb_entry(parent, struct ubifs_bud, rb);
127*4882a593Smuzhiyun ubifs_assert(bud->lnum != b->lnum);
128*4882a593Smuzhiyun if (bud->lnum < b->lnum)
129*4882a593Smuzhiyun p = &(*p)->rb_left;
130*4882a593Smuzhiyun else
131*4882a593Smuzhiyun p = &(*p)->rb_right;
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun rb_link_node(&bud->rb, parent, p);
135*4882a593Smuzhiyun rb_insert_color(&bud->rb, &c->buds);
136*4882a593Smuzhiyun if (c->jheads) {
137*4882a593Smuzhiyun jhead = &c->jheads[bud->jhead];
138*4882a593Smuzhiyun list_add_tail(&bud->list, &jhead->buds_list);
139*4882a593Smuzhiyun } else
140*4882a593Smuzhiyun ubifs_assert(c->replaying && c->ro_mount);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun /*
143*4882a593Smuzhiyun * Note, although this is a new bud, we anyway account this space now,
144*4882a593Smuzhiyun * before any data has been written to it, because this is about to
145*4882a593Smuzhiyun * guarantee fixed mount time, and this bud will anyway be read and
146*4882a593Smuzhiyun * scanned.
147*4882a593Smuzhiyun */
148*4882a593Smuzhiyun c->bud_bytes += c->leb_size - bud->start;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun dbg_log("LEB %d:%d, jhead %s, bud_bytes %lld", bud->lnum,
151*4882a593Smuzhiyun bud->start, dbg_jhead(bud->jhead), c->bud_bytes);
152*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
153*4882a593Smuzhiyun }
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun /**
156*4882a593Smuzhiyun * ubifs_add_bud_to_log - add a new bud to the log.
157*4882a593Smuzhiyun * @c: UBIFS file-system description object
158*4882a593Smuzhiyun * @jhead: journal head the bud belongs to
159*4882a593Smuzhiyun * @lnum: LEB number of the bud
160*4882a593Smuzhiyun * @offs: starting offset of the bud
161*4882a593Smuzhiyun *
162*4882a593Smuzhiyun * This function writes reference node for the new bud LEB @lnum it to the log,
163*4882a593Smuzhiyun * and adds it to the buds tress. It also makes sure that log size does not
164*4882a593Smuzhiyun * exceed the 'c->max_bud_bytes' limit. Returns zero in case of success,
165*4882a593Smuzhiyun * %-EAGAIN if commit is required, and a negative error codes in case of
166*4882a593Smuzhiyun * failure.
167*4882a593Smuzhiyun */
ubifs_add_bud_to_log(struct ubifs_info * c,int jhead,int lnum,int offs)168*4882a593Smuzhiyun int ubifs_add_bud_to_log(struct ubifs_info *c, int jhead, int lnum, int offs)
169*4882a593Smuzhiyun {
170*4882a593Smuzhiyun int err;
171*4882a593Smuzhiyun struct ubifs_bud *bud;
172*4882a593Smuzhiyun struct ubifs_ref_node *ref;
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun bud = kmalloc(sizeof(struct ubifs_bud), GFP_NOFS);
175*4882a593Smuzhiyun if (!bud)
176*4882a593Smuzhiyun return -ENOMEM;
177*4882a593Smuzhiyun ref = kzalloc(c->ref_node_alsz, GFP_NOFS);
178*4882a593Smuzhiyun if (!ref) {
179*4882a593Smuzhiyun kfree(bud);
180*4882a593Smuzhiyun return -ENOMEM;
181*4882a593Smuzhiyun }
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun mutex_lock(&c->log_mutex);
184*4882a593Smuzhiyun ubifs_assert(!c->ro_media && !c->ro_mount);
185*4882a593Smuzhiyun if (c->ro_error) {
186*4882a593Smuzhiyun err = -EROFS;
187*4882a593Smuzhiyun goto out_unlock;
188*4882a593Smuzhiyun }
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun /* Make sure we have enough space in the log */
191*4882a593Smuzhiyun if (empty_log_bytes(c) - c->ref_node_alsz < c->min_log_bytes) {
192*4882a593Smuzhiyun dbg_log("not enough log space - %lld, required %d",
193*4882a593Smuzhiyun empty_log_bytes(c), c->min_log_bytes);
194*4882a593Smuzhiyun ubifs_commit_required(c);
195*4882a593Smuzhiyun err = -EAGAIN;
196*4882a593Smuzhiyun goto out_unlock;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun /*
200*4882a593Smuzhiyun * Make sure the amount of space in buds will not exceed the
201*4882a593Smuzhiyun * 'c->max_bud_bytes' limit, because we want to guarantee mount time
202*4882a593Smuzhiyun * limits.
203*4882a593Smuzhiyun *
204*4882a593Smuzhiyun * It is not necessary to hold @c->buds_lock when reading @c->bud_bytes
205*4882a593Smuzhiyun * because we are holding @c->log_mutex. All @c->bud_bytes take place
206*4882a593Smuzhiyun * when both @c->log_mutex and @c->bud_bytes are locked.
207*4882a593Smuzhiyun */
208*4882a593Smuzhiyun if (c->bud_bytes + c->leb_size - offs > c->max_bud_bytes) {
209*4882a593Smuzhiyun dbg_log("bud bytes %lld (%lld max), require commit",
210*4882a593Smuzhiyun c->bud_bytes, c->max_bud_bytes);
211*4882a593Smuzhiyun ubifs_commit_required(c);
212*4882a593Smuzhiyun err = -EAGAIN;
213*4882a593Smuzhiyun goto out_unlock;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun /*
217*4882a593Smuzhiyun * If the journal is full enough - start background commit. Note, it is
218*4882a593Smuzhiyun * OK to read 'c->cmt_state' without spinlock because integer reads
219*4882a593Smuzhiyun * are atomic in the kernel.
220*4882a593Smuzhiyun */
221*4882a593Smuzhiyun if (c->bud_bytes >= c->bg_bud_bytes &&
222*4882a593Smuzhiyun c->cmt_state == COMMIT_RESTING) {
223*4882a593Smuzhiyun dbg_log("bud bytes %lld (%lld max), initiate BG commit",
224*4882a593Smuzhiyun c->bud_bytes, c->max_bud_bytes);
225*4882a593Smuzhiyun ubifs_request_bg_commit(c);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun
228*4882a593Smuzhiyun bud->lnum = lnum;
229*4882a593Smuzhiyun bud->start = offs;
230*4882a593Smuzhiyun bud->jhead = jhead;
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun ref->ch.node_type = UBIFS_REF_NODE;
233*4882a593Smuzhiyun ref->lnum = cpu_to_le32(bud->lnum);
234*4882a593Smuzhiyun ref->offs = cpu_to_le32(bud->start);
235*4882a593Smuzhiyun ref->jhead = cpu_to_le32(jhead);
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun if (c->lhead_offs > c->leb_size - c->ref_node_alsz) {
238*4882a593Smuzhiyun c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum);
239*4882a593Smuzhiyun ubifs_assert(c->lhead_lnum != c->ltail_lnum);
240*4882a593Smuzhiyun c->lhead_offs = 0;
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
243*4882a593Smuzhiyun if (c->lhead_offs == 0) {
244*4882a593Smuzhiyun /* Must ensure next log LEB has been unmapped */
245*4882a593Smuzhiyun err = ubifs_leb_unmap(c, c->lhead_lnum);
246*4882a593Smuzhiyun if (err)
247*4882a593Smuzhiyun goto out_unlock;
248*4882a593Smuzhiyun }
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun if (bud->start == 0) {
251*4882a593Smuzhiyun /*
252*4882a593Smuzhiyun * Before writing the LEB reference which refers an empty LEB
253*4882a593Smuzhiyun * to the log, we have to make sure it is mapped, because
254*4882a593Smuzhiyun * otherwise we'd risk to refer an LEB with garbage in case of
255*4882a593Smuzhiyun * an unclean reboot, because the target LEB might have been
256*4882a593Smuzhiyun * unmapped, but not yet physically erased.
257*4882a593Smuzhiyun */
258*4882a593Smuzhiyun err = ubifs_leb_map(c, bud->lnum);
259*4882a593Smuzhiyun if (err)
260*4882a593Smuzhiyun goto out_unlock;
261*4882a593Smuzhiyun }
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun dbg_log("write ref LEB %d:%d",
264*4882a593Smuzhiyun c->lhead_lnum, c->lhead_offs);
265*4882a593Smuzhiyun err = ubifs_write_node(c, ref, UBIFS_REF_NODE_SZ, c->lhead_lnum,
266*4882a593Smuzhiyun c->lhead_offs);
267*4882a593Smuzhiyun if (err)
268*4882a593Smuzhiyun goto out_unlock;
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun c->lhead_offs += c->ref_node_alsz;
271*4882a593Smuzhiyun
272*4882a593Smuzhiyun ubifs_add_bud(c, bud);
273*4882a593Smuzhiyun
274*4882a593Smuzhiyun mutex_unlock(&c->log_mutex);
275*4882a593Smuzhiyun kfree(ref);
276*4882a593Smuzhiyun return 0;
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun out_unlock:
279*4882a593Smuzhiyun mutex_unlock(&c->log_mutex);
280*4882a593Smuzhiyun kfree(ref);
281*4882a593Smuzhiyun kfree(bud);
282*4882a593Smuzhiyun return err;
283*4882a593Smuzhiyun }
284*4882a593Smuzhiyun
285*4882a593Smuzhiyun /**
286*4882a593Smuzhiyun * remove_buds - remove used buds.
287*4882a593Smuzhiyun * @c: UBIFS file-system description object
288*4882a593Smuzhiyun *
289*4882a593Smuzhiyun * This function removes use buds from the buds tree. It does not remove the
290*4882a593Smuzhiyun * buds which are pointed to by journal heads.
291*4882a593Smuzhiyun */
remove_buds(struct ubifs_info * c)292*4882a593Smuzhiyun static void remove_buds(struct ubifs_info *c)
293*4882a593Smuzhiyun {
294*4882a593Smuzhiyun struct rb_node *p;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun ubifs_assert(list_empty(&c->old_buds));
297*4882a593Smuzhiyun c->cmt_bud_bytes = 0;
298*4882a593Smuzhiyun spin_lock(&c->buds_lock);
299*4882a593Smuzhiyun p = rb_first(&c->buds);
300*4882a593Smuzhiyun while (p) {
301*4882a593Smuzhiyun struct rb_node *p1 = p;
302*4882a593Smuzhiyun struct ubifs_bud *bud;
303*4882a593Smuzhiyun struct ubifs_wbuf *wbuf;
304*4882a593Smuzhiyun
305*4882a593Smuzhiyun p = rb_next(p);
306*4882a593Smuzhiyun bud = rb_entry(p1, struct ubifs_bud, rb);
307*4882a593Smuzhiyun wbuf = &c->jheads[bud->jhead].wbuf;
308*4882a593Smuzhiyun
309*4882a593Smuzhiyun if (wbuf->lnum == bud->lnum) {
310*4882a593Smuzhiyun /*
311*4882a593Smuzhiyun * Do not remove buds which are pointed to by journal
312*4882a593Smuzhiyun * heads (non-closed buds).
313*4882a593Smuzhiyun */
314*4882a593Smuzhiyun c->cmt_bud_bytes += wbuf->offs - bud->start;
315*4882a593Smuzhiyun dbg_log("preserve %d:%d, jhead %s, bud bytes %d, cmt_bud_bytes %lld",
316*4882a593Smuzhiyun bud->lnum, bud->start, dbg_jhead(bud->jhead),
317*4882a593Smuzhiyun wbuf->offs - bud->start, c->cmt_bud_bytes);
318*4882a593Smuzhiyun bud->start = wbuf->offs;
319*4882a593Smuzhiyun } else {
320*4882a593Smuzhiyun c->cmt_bud_bytes += c->leb_size - bud->start;
321*4882a593Smuzhiyun dbg_log("remove %d:%d, jhead %s, bud bytes %d, cmt_bud_bytes %lld",
322*4882a593Smuzhiyun bud->lnum, bud->start, dbg_jhead(bud->jhead),
323*4882a593Smuzhiyun c->leb_size - bud->start, c->cmt_bud_bytes);
324*4882a593Smuzhiyun rb_erase(p1, &c->buds);
325*4882a593Smuzhiyun /*
326*4882a593Smuzhiyun * If the commit does not finish, the recovery will need
327*4882a593Smuzhiyun * to replay the journal, in which case the old buds
328*4882a593Smuzhiyun * must be unchanged. Do not release them until post
329*4882a593Smuzhiyun * commit i.e. do not allow them to be garbage
330*4882a593Smuzhiyun * collected.
331*4882a593Smuzhiyun */
332*4882a593Smuzhiyun list_move(&bud->list, &c->old_buds);
333*4882a593Smuzhiyun }
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
336*4882a593Smuzhiyun }
337*4882a593Smuzhiyun
338*4882a593Smuzhiyun /**
339*4882a593Smuzhiyun * ubifs_log_start_commit - start commit.
340*4882a593Smuzhiyun * @c: UBIFS file-system description object
341*4882a593Smuzhiyun * @ltail_lnum: return new log tail LEB number
342*4882a593Smuzhiyun *
343*4882a593Smuzhiyun * The commit operation starts with writing "commit start" node to the log and
344*4882a593Smuzhiyun * reference nodes for all journal heads which will define new journal after
345*4882a593Smuzhiyun * the commit has been finished. The commit start and reference nodes are
346*4882a593Smuzhiyun * written in one go to the nearest empty log LEB (hence, when commit is
347*4882a593Smuzhiyun * finished UBIFS may safely unmap all the previous log LEBs). This function
348*4882a593Smuzhiyun * returns zero in case of success and a negative error code in case of
349*4882a593Smuzhiyun * failure.
350*4882a593Smuzhiyun */
ubifs_log_start_commit(struct ubifs_info * c,int * ltail_lnum)351*4882a593Smuzhiyun int ubifs_log_start_commit(struct ubifs_info *c, int *ltail_lnum)
352*4882a593Smuzhiyun {
353*4882a593Smuzhiyun void *buf;
354*4882a593Smuzhiyun struct ubifs_cs_node *cs;
355*4882a593Smuzhiyun struct ubifs_ref_node *ref;
356*4882a593Smuzhiyun int err, i, max_len, len;
357*4882a593Smuzhiyun
358*4882a593Smuzhiyun err = dbg_check_bud_bytes(c);
359*4882a593Smuzhiyun if (err)
360*4882a593Smuzhiyun return err;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun max_len = UBIFS_CS_NODE_SZ + c->jhead_cnt * UBIFS_REF_NODE_SZ;
363*4882a593Smuzhiyun max_len = ALIGN(max_len, c->min_io_size);
364*4882a593Smuzhiyun buf = cs = kmalloc(max_len, GFP_NOFS);
365*4882a593Smuzhiyun if (!buf)
366*4882a593Smuzhiyun return -ENOMEM;
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun cs->ch.node_type = UBIFS_CS_NODE;
369*4882a593Smuzhiyun cs->cmt_no = cpu_to_le64(c->cmt_no);
370*4882a593Smuzhiyun ubifs_prepare_node(c, cs, UBIFS_CS_NODE_SZ, 0);
371*4882a593Smuzhiyun
372*4882a593Smuzhiyun /*
373*4882a593Smuzhiyun * Note, we do not lock 'c->log_mutex' because this is the commit start
374*4882a593Smuzhiyun * phase and we are exclusively using the log. And we do not lock
375*4882a593Smuzhiyun * write-buffer because nobody can write to the file-system at this
376*4882a593Smuzhiyun * phase.
377*4882a593Smuzhiyun */
378*4882a593Smuzhiyun
379*4882a593Smuzhiyun len = UBIFS_CS_NODE_SZ;
380*4882a593Smuzhiyun for (i = 0; i < c->jhead_cnt; i++) {
381*4882a593Smuzhiyun int lnum = c->jheads[i].wbuf.lnum;
382*4882a593Smuzhiyun int offs = c->jheads[i].wbuf.offs;
383*4882a593Smuzhiyun
384*4882a593Smuzhiyun if (lnum == -1 || offs == c->leb_size)
385*4882a593Smuzhiyun continue;
386*4882a593Smuzhiyun
387*4882a593Smuzhiyun dbg_log("add ref to LEB %d:%d for jhead %s",
388*4882a593Smuzhiyun lnum, offs, dbg_jhead(i));
389*4882a593Smuzhiyun ref = buf + len;
390*4882a593Smuzhiyun ref->ch.node_type = UBIFS_REF_NODE;
391*4882a593Smuzhiyun ref->lnum = cpu_to_le32(lnum);
392*4882a593Smuzhiyun ref->offs = cpu_to_le32(offs);
393*4882a593Smuzhiyun ref->jhead = cpu_to_le32(i);
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun ubifs_prepare_node(c, ref, UBIFS_REF_NODE_SZ, 0);
396*4882a593Smuzhiyun len += UBIFS_REF_NODE_SZ;
397*4882a593Smuzhiyun }
398*4882a593Smuzhiyun
399*4882a593Smuzhiyun ubifs_pad(c, buf + len, ALIGN(len, c->min_io_size) - len);
400*4882a593Smuzhiyun
401*4882a593Smuzhiyun /* Switch to the next log LEB */
402*4882a593Smuzhiyun if (c->lhead_offs) {
403*4882a593Smuzhiyun c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum);
404*4882a593Smuzhiyun ubifs_assert(c->lhead_lnum != c->ltail_lnum);
405*4882a593Smuzhiyun c->lhead_offs = 0;
406*4882a593Smuzhiyun }
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun /* Must ensure next LEB has been unmapped */
409*4882a593Smuzhiyun err = ubifs_leb_unmap(c, c->lhead_lnum);
410*4882a593Smuzhiyun if (err)
411*4882a593Smuzhiyun goto out;
412*4882a593Smuzhiyun
413*4882a593Smuzhiyun len = ALIGN(len, c->min_io_size);
414*4882a593Smuzhiyun dbg_log("writing commit start at LEB %d:0, len %d", c->lhead_lnum, len);
415*4882a593Smuzhiyun err = ubifs_leb_write(c, c->lhead_lnum, cs, 0, len);
416*4882a593Smuzhiyun if (err)
417*4882a593Smuzhiyun goto out;
418*4882a593Smuzhiyun
419*4882a593Smuzhiyun *ltail_lnum = c->lhead_lnum;
420*4882a593Smuzhiyun
421*4882a593Smuzhiyun c->lhead_offs += len;
422*4882a593Smuzhiyun if (c->lhead_offs == c->leb_size) {
423*4882a593Smuzhiyun c->lhead_lnum = ubifs_next_log_lnum(c, c->lhead_lnum);
424*4882a593Smuzhiyun c->lhead_offs = 0;
425*4882a593Smuzhiyun }
426*4882a593Smuzhiyun
427*4882a593Smuzhiyun remove_buds(c);
428*4882a593Smuzhiyun
429*4882a593Smuzhiyun /*
430*4882a593Smuzhiyun * We have started the commit and now users may use the rest of the log
431*4882a593Smuzhiyun * for new writes.
432*4882a593Smuzhiyun */
433*4882a593Smuzhiyun c->min_log_bytes = 0;
434*4882a593Smuzhiyun
435*4882a593Smuzhiyun out:
436*4882a593Smuzhiyun kfree(buf);
437*4882a593Smuzhiyun return err;
438*4882a593Smuzhiyun }
439*4882a593Smuzhiyun
440*4882a593Smuzhiyun /**
441*4882a593Smuzhiyun * ubifs_log_end_commit - end commit.
442*4882a593Smuzhiyun * @c: UBIFS file-system description object
443*4882a593Smuzhiyun * @ltail_lnum: new log tail LEB number
444*4882a593Smuzhiyun *
445*4882a593Smuzhiyun * This function is called on when the commit operation was finished. It
446*4882a593Smuzhiyun * moves log tail to new position and updates the master node so that it stores
447*4882a593Smuzhiyun * the new log tail LEB number. Returns zero in case of success and a negative
448*4882a593Smuzhiyun * error code in case of failure.
449*4882a593Smuzhiyun */
ubifs_log_end_commit(struct ubifs_info * c,int ltail_lnum)450*4882a593Smuzhiyun int ubifs_log_end_commit(struct ubifs_info *c, int ltail_lnum)
451*4882a593Smuzhiyun {
452*4882a593Smuzhiyun int err;
453*4882a593Smuzhiyun
454*4882a593Smuzhiyun /*
455*4882a593Smuzhiyun * At this phase we have to lock 'c->log_mutex' because UBIFS allows FS
456*4882a593Smuzhiyun * writes during commit. Its only short "commit" start phase when
457*4882a593Smuzhiyun * writers are blocked.
458*4882a593Smuzhiyun */
459*4882a593Smuzhiyun mutex_lock(&c->log_mutex);
460*4882a593Smuzhiyun
461*4882a593Smuzhiyun dbg_log("old tail was LEB %d:0, new tail is LEB %d:0",
462*4882a593Smuzhiyun c->ltail_lnum, ltail_lnum);
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun c->ltail_lnum = ltail_lnum;
465*4882a593Smuzhiyun /*
466*4882a593Smuzhiyun * The commit is finished and from now on it must be guaranteed that
467*4882a593Smuzhiyun * there is always enough space for the next commit.
468*4882a593Smuzhiyun */
469*4882a593Smuzhiyun c->min_log_bytes = c->leb_size;
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun spin_lock(&c->buds_lock);
472*4882a593Smuzhiyun c->bud_bytes -= c->cmt_bud_bytes;
473*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun err = dbg_check_bud_bytes(c);
476*4882a593Smuzhiyun if (err)
477*4882a593Smuzhiyun goto out;
478*4882a593Smuzhiyun
479*4882a593Smuzhiyun err = ubifs_write_master(c);
480*4882a593Smuzhiyun
481*4882a593Smuzhiyun out:
482*4882a593Smuzhiyun mutex_unlock(&c->log_mutex);
483*4882a593Smuzhiyun return err;
484*4882a593Smuzhiyun }
485*4882a593Smuzhiyun
486*4882a593Smuzhiyun /**
487*4882a593Smuzhiyun * ubifs_log_post_commit - things to do after commit is completed.
488*4882a593Smuzhiyun * @c: UBIFS file-system description object
489*4882a593Smuzhiyun * @old_ltail_lnum: old log tail LEB number
490*4882a593Smuzhiyun *
491*4882a593Smuzhiyun * Release buds only after commit is completed, because they must be unchanged
492*4882a593Smuzhiyun * if recovery is needed.
493*4882a593Smuzhiyun *
494*4882a593Smuzhiyun * Unmap log LEBs only after commit is completed, because they may be needed for
495*4882a593Smuzhiyun * recovery.
496*4882a593Smuzhiyun *
497*4882a593Smuzhiyun * This function returns %0 on success and a negative error code on failure.
498*4882a593Smuzhiyun */
ubifs_log_post_commit(struct ubifs_info * c,int old_ltail_lnum)499*4882a593Smuzhiyun int ubifs_log_post_commit(struct ubifs_info *c, int old_ltail_lnum)
500*4882a593Smuzhiyun {
501*4882a593Smuzhiyun int lnum, err = 0;
502*4882a593Smuzhiyun
503*4882a593Smuzhiyun while (!list_empty(&c->old_buds)) {
504*4882a593Smuzhiyun struct ubifs_bud *bud;
505*4882a593Smuzhiyun
506*4882a593Smuzhiyun bud = list_entry(c->old_buds.next, struct ubifs_bud, list);
507*4882a593Smuzhiyun err = ubifs_return_leb(c, bud->lnum);
508*4882a593Smuzhiyun if (err)
509*4882a593Smuzhiyun return err;
510*4882a593Smuzhiyun list_del(&bud->list);
511*4882a593Smuzhiyun kfree(bud);
512*4882a593Smuzhiyun }
513*4882a593Smuzhiyun mutex_lock(&c->log_mutex);
514*4882a593Smuzhiyun for (lnum = old_ltail_lnum; lnum != c->ltail_lnum;
515*4882a593Smuzhiyun lnum = ubifs_next_log_lnum(c, lnum)) {
516*4882a593Smuzhiyun dbg_log("unmap log LEB %d", lnum);
517*4882a593Smuzhiyun err = ubifs_leb_unmap(c, lnum);
518*4882a593Smuzhiyun if (err)
519*4882a593Smuzhiyun goto out;
520*4882a593Smuzhiyun }
521*4882a593Smuzhiyun out:
522*4882a593Smuzhiyun mutex_unlock(&c->log_mutex);
523*4882a593Smuzhiyun return err;
524*4882a593Smuzhiyun }
525*4882a593Smuzhiyun
526*4882a593Smuzhiyun /**
527*4882a593Smuzhiyun * struct done_ref - references that have been done.
528*4882a593Smuzhiyun * @rb: rb-tree node
529*4882a593Smuzhiyun * @lnum: LEB number
530*4882a593Smuzhiyun */
531*4882a593Smuzhiyun struct done_ref {
532*4882a593Smuzhiyun struct rb_node rb;
533*4882a593Smuzhiyun int lnum;
534*4882a593Smuzhiyun };
535*4882a593Smuzhiyun
536*4882a593Smuzhiyun /**
537*4882a593Smuzhiyun * done_already - determine if a reference has been done already.
538*4882a593Smuzhiyun * @done_tree: rb-tree to store references that have been done
539*4882a593Smuzhiyun * @lnum: LEB number of reference
540*4882a593Smuzhiyun *
541*4882a593Smuzhiyun * This function returns %1 if the reference has been done, %0 if not, otherwise
542*4882a593Smuzhiyun * a negative error code is returned.
543*4882a593Smuzhiyun */
done_already(struct rb_root * done_tree,int lnum)544*4882a593Smuzhiyun static int done_already(struct rb_root *done_tree, int lnum)
545*4882a593Smuzhiyun {
546*4882a593Smuzhiyun struct rb_node **p = &done_tree->rb_node, *parent = NULL;
547*4882a593Smuzhiyun struct done_ref *dr;
548*4882a593Smuzhiyun
549*4882a593Smuzhiyun while (*p) {
550*4882a593Smuzhiyun parent = *p;
551*4882a593Smuzhiyun dr = rb_entry(parent, struct done_ref, rb);
552*4882a593Smuzhiyun if (lnum < dr->lnum)
553*4882a593Smuzhiyun p = &(*p)->rb_left;
554*4882a593Smuzhiyun else if (lnum > dr->lnum)
555*4882a593Smuzhiyun p = &(*p)->rb_right;
556*4882a593Smuzhiyun else
557*4882a593Smuzhiyun return 1;
558*4882a593Smuzhiyun }
559*4882a593Smuzhiyun
560*4882a593Smuzhiyun dr = kzalloc(sizeof(struct done_ref), GFP_NOFS);
561*4882a593Smuzhiyun if (!dr)
562*4882a593Smuzhiyun return -ENOMEM;
563*4882a593Smuzhiyun
564*4882a593Smuzhiyun dr->lnum = lnum;
565*4882a593Smuzhiyun
566*4882a593Smuzhiyun rb_link_node(&dr->rb, parent, p);
567*4882a593Smuzhiyun rb_insert_color(&dr->rb, done_tree);
568*4882a593Smuzhiyun
569*4882a593Smuzhiyun return 0;
570*4882a593Smuzhiyun }
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun /**
573*4882a593Smuzhiyun * destroy_done_tree - destroy the done tree.
574*4882a593Smuzhiyun * @done_tree: done tree to destroy
575*4882a593Smuzhiyun */
destroy_done_tree(struct rb_root * done_tree)576*4882a593Smuzhiyun static void destroy_done_tree(struct rb_root *done_tree)
577*4882a593Smuzhiyun {
578*4882a593Smuzhiyun struct done_ref *dr, *n;
579*4882a593Smuzhiyun
580*4882a593Smuzhiyun rbtree_postorder_for_each_entry_safe(dr, n, done_tree, rb)
581*4882a593Smuzhiyun kfree(dr);
582*4882a593Smuzhiyun }
583*4882a593Smuzhiyun
584*4882a593Smuzhiyun /**
585*4882a593Smuzhiyun * add_node - add a node to the consolidated log.
586*4882a593Smuzhiyun * @c: UBIFS file-system description object
587*4882a593Smuzhiyun * @buf: buffer to which to add
588*4882a593Smuzhiyun * @lnum: LEB number to which to write is passed and returned here
589*4882a593Smuzhiyun * @offs: offset to where to write is passed and returned here
590*4882a593Smuzhiyun * @node: node to add
591*4882a593Smuzhiyun *
592*4882a593Smuzhiyun * This function returns %0 on success and a negative error code on failure.
593*4882a593Smuzhiyun */
add_node(struct ubifs_info * c,void * buf,int * lnum,int * offs,void * node)594*4882a593Smuzhiyun static int add_node(struct ubifs_info *c, void *buf, int *lnum, int *offs,
595*4882a593Smuzhiyun void *node)
596*4882a593Smuzhiyun {
597*4882a593Smuzhiyun struct ubifs_ch *ch = node;
598*4882a593Smuzhiyun int len = le32_to_cpu(ch->len), remains = c->leb_size - *offs;
599*4882a593Smuzhiyun
600*4882a593Smuzhiyun if (len > remains) {
601*4882a593Smuzhiyun int sz = ALIGN(*offs, c->min_io_size), err;
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun ubifs_pad(c, buf + *offs, sz - *offs);
604*4882a593Smuzhiyun err = ubifs_leb_change(c, *lnum, buf, sz);
605*4882a593Smuzhiyun if (err)
606*4882a593Smuzhiyun return err;
607*4882a593Smuzhiyun *lnum = ubifs_next_log_lnum(c, *lnum);
608*4882a593Smuzhiyun *offs = 0;
609*4882a593Smuzhiyun }
610*4882a593Smuzhiyun memcpy(buf + *offs, node, len);
611*4882a593Smuzhiyun *offs += ALIGN(len, 8);
612*4882a593Smuzhiyun return 0;
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
615*4882a593Smuzhiyun /**
616*4882a593Smuzhiyun * ubifs_consolidate_log - consolidate the log.
617*4882a593Smuzhiyun * @c: UBIFS file-system description object
618*4882a593Smuzhiyun *
619*4882a593Smuzhiyun * Repeated failed commits could cause the log to be full, but at least 1 LEB is
620*4882a593Smuzhiyun * needed for commit. This function rewrites the reference nodes in the log
621*4882a593Smuzhiyun * omitting duplicates, and failed CS nodes, and leaving no gaps.
622*4882a593Smuzhiyun *
623*4882a593Smuzhiyun * This function returns %0 on success and a negative error code on failure.
624*4882a593Smuzhiyun */
ubifs_consolidate_log(struct ubifs_info * c)625*4882a593Smuzhiyun int ubifs_consolidate_log(struct ubifs_info *c)
626*4882a593Smuzhiyun {
627*4882a593Smuzhiyun struct ubifs_scan_leb *sleb;
628*4882a593Smuzhiyun struct ubifs_scan_node *snod;
629*4882a593Smuzhiyun struct rb_root done_tree = RB_ROOT;
630*4882a593Smuzhiyun int lnum, err, first = 1, write_lnum, offs = 0;
631*4882a593Smuzhiyun void *buf;
632*4882a593Smuzhiyun
633*4882a593Smuzhiyun dbg_rcvry("log tail LEB %d, log head LEB %d", c->ltail_lnum,
634*4882a593Smuzhiyun c->lhead_lnum);
635*4882a593Smuzhiyun buf = vmalloc(c->leb_size);
636*4882a593Smuzhiyun if (!buf)
637*4882a593Smuzhiyun return -ENOMEM;
638*4882a593Smuzhiyun lnum = c->ltail_lnum;
639*4882a593Smuzhiyun write_lnum = lnum;
640*4882a593Smuzhiyun while (1) {
641*4882a593Smuzhiyun sleb = ubifs_scan(c, lnum, 0, c->sbuf, 0);
642*4882a593Smuzhiyun if (IS_ERR(sleb)) {
643*4882a593Smuzhiyun err = PTR_ERR(sleb);
644*4882a593Smuzhiyun goto out_free;
645*4882a593Smuzhiyun }
646*4882a593Smuzhiyun list_for_each_entry(snod, &sleb->nodes, list) {
647*4882a593Smuzhiyun switch (snod->type) {
648*4882a593Smuzhiyun case UBIFS_REF_NODE: {
649*4882a593Smuzhiyun struct ubifs_ref_node *ref = snod->node;
650*4882a593Smuzhiyun int ref_lnum = le32_to_cpu(ref->lnum);
651*4882a593Smuzhiyun
652*4882a593Smuzhiyun err = done_already(&done_tree, ref_lnum);
653*4882a593Smuzhiyun if (err < 0)
654*4882a593Smuzhiyun goto out_scan;
655*4882a593Smuzhiyun if (err != 1) {
656*4882a593Smuzhiyun err = add_node(c, buf, &write_lnum,
657*4882a593Smuzhiyun &offs, snod->node);
658*4882a593Smuzhiyun if (err)
659*4882a593Smuzhiyun goto out_scan;
660*4882a593Smuzhiyun }
661*4882a593Smuzhiyun break;
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun case UBIFS_CS_NODE:
664*4882a593Smuzhiyun if (!first)
665*4882a593Smuzhiyun break;
666*4882a593Smuzhiyun err = add_node(c, buf, &write_lnum, &offs,
667*4882a593Smuzhiyun snod->node);
668*4882a593Smuzhiyun if (err)
669*4882a593Smuzhiyun goto out_scan;
670*4882a593Smuzhiyun first = 0;
671*4882a593Smuzhiyun break;
672*4882a593Smuzhiyun }
673*4882a593Smuzhiyun }
674*4882a593Smuzhiyun ubifs_scan_destroy(sleb);
675*4882a593Smuzhiyun if (lnum == c->lhead_lnum)
676*4882a593Smuzhiyun break;
677*4882a593Smuzhiyun lnum = ubifs_next_log_lnum(c, lnum);
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun if (offs) {
680*4882a593Smuzhiyun int sz = ALIGN(offs, c->min_io_size);
681*4882a593Smuzhiyun
682*4882a593Smuzhiyun ubifs_pad(c, buf + offs, sz - offs);
683*4882a593Smuzhiyun err = ubifs_leb_change(c, write_lnum, buf, sz);
684*4882a593Smuzhiyun if (err)
685*4882a593Smuzhiyun goto out_free;
686*4882a593Smuzhiyun offs = ALIGN(offs, c->min_io_size);
687*4882a593Smuzhiyun }
688*4882a593Smuzhiyun destroy_done_tree(&done_tree);
689*4882a593Smuzhiyun vfree(buf);
690*4882a593Smuzhiyun if (write_lnum == c->lhead_lnum) {
691*4882a593Smuzhiyun ubifs_err(c, "log is too full");
692*4882a593Smuzhiyun return -EINVAL;
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun /* Unmap remaining LEBs */
695*4882a593Smuzhiyun lnum = write_lnum;
696*4882a593Smuzhiyun do {
697*4882a593Smuzhiyun lnum = ubifs_next_log_lnum(c, lnum);
698*4882a593Smuzhiyun err = ubifs_leb_unmap(c, lnum);
699*4882a593Smuzhiyun if (err)
700*4882a593Smuzhiyun return err;
701*4882a593Smuzhiyun } while (lnum != c->lhead_lnum);
702*4882a593Smuzhiyun c->lhead_lnum = write_lnum;
703*4882a593Smuzhiyun c->lhead_offs = offs;
704*4882a593Smuzhiyun dbg_rcvry("new log head at %d:%d", c->lhead_lnum, c->lhead_offs);
705*4882a593Smuzhiyun return 0;
706*4882a593Smuzhiyun
707*4882a593Smuzhiyun out_scan:
708*4882a593Smuzhiyun ubifs_scan_destroy(sleb);
709*4882a593Smuzhiyun out_free:
710*4882a593Smuzhiyun destroy_done_tree(&done_tree);
711*4882a593Smuzhiyun vfree(buf);
712*4882a593Smuzhiyun return err;
713*4882a593Smuzhiyun }
714*4882a593Smuzhiyun
715*4882a593Smuzhiyun /**
716*4882a593Smuzhiyun * dbg_check_bud_bytes - make sure bud bytes calculation are all right.
717*4882a593Smuzhiyun * @c: UBIFS file-system description object
718*4882a593Smuzhiyun *
719*4882a593Smuzhiyun * This function makes sure the amount of flash space used by closed buds
720*4882a593Smuzhiyun * ('c->bud_bytes' is correct). Returns zero in case of success and %-EINVAL in
721*4882a593Smuzhiyun * case of failure.
722*4882a593Smuzhiyun */
dbg_check_bud_bytes(struct ubifs_info * c)723*4882a593Smuzhiyun static int dbg_check_bud_bytes(struct ubifs_info *c)
724*4882a593Smuzhiyun {
725*4882a593Smuzhiyun int i, err = 0;
726*4882a593Smuzhiyun struct ubifs_bud *bud;
727*4882a593Smuzhiyun long long bud_bytes = 0;
728*4882a593Smuzhiyun
729*4882a593Smuzhiyun if (!dbg_is_chk_gen(c))
730*4882a593Smuzhiyun return 0;
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun spin_lock(&c->buds_lock);
733*4882a593Smuzhiyun for (i = 0; i < c->jhead_cnt; i++)
734*4882a593Smuzhiyun list_for_each_entry(bud, &c->jheads[i].buds_list, list)
735*4882a593Smuzhiyun bud_bytes += c->leb_size - bud->start;
736*4882a593Smuzhiyun
737*4882a593Smuzhiyun if (c->bud_bytes != bud_bytes) {
738*4882a593Smuzhiyun ubifs_err(c, "bad bud_bytes %lld, calculated %lld",
739*4882a593Smuzhiyun c->bud_bytes, bud_bytes);
740*4882a593Smuzhiyun err = -EINVAL;
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun spin_unlock(&c->buds_lock);
743*4882a593Smuzhiyun
744*4882a593Smuzhiyun return err;
745*4882a593Smuzhiyun }
746