diff options
| author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-02-01 12:02:49 -0500 |
|---|---|---|
| committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-03-08 03:12:49 -0500 |
| commit | 3c89f396dc78671cfbc1eb20ef1d5be6a9a02780 (patch) | |
| tree | 6ed2ba3d484f8b92eed00b619128a79ecd094f4d | |
| parent | ca2ec61d157f23ec24aaa200f8016ea0a8aeb617 (diff) | |
UBIFS: introduce write-buffer size field
Currently we assume write-buffer size is always min_io_size. But
this is about to change and write-buffers may be of variable size.
Namely, they will be of max_write_size at the beginning, but will
get smaller when we are approaching the end of LEB.
This is a preparation patch which introduces 'size' field in
the write-buffer structure which carries the current write-buffer
size.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
| -rw-r--r-- | fs/ubifs/io.c | 28 | ||||
| -rw-r--r-- | fs/ubifs/ubifs.h | 2 |
2 files changed, 21 insertions, 9 deletions
diff --git a/fs/ubifs/io.c b/fs/ubifs/io.c index d1fe56203a1d..7c2a014b59f9 100644 --- a/fs/ubifs/io.c +++ b/fs/ubifs/io.c | |||
| @@ -361,7 +361,10 @@ int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf) | |||
| 361 | dbg_io("LEB %d:%d, %d bytes, jhead %s", | 361 | dbg_io("LEB %d:%d, %d bytes, jhead %s", |
| 362 | wbuf->lnum, wbuf->offs, wbuf->used, dbg_jhead(wbuf->jhead)); | 362 | wbuf->lnum, wbuf->offs, wbuf->used, dbg_jhead(wbuf->jhead)); |
| 363 | ubifs_assert(!(wbuf->avail & 7)); | 363 | ubifs_assert(!(wbuf->avail & 7)); |
| 364 | ubifs_assert(wbuf->offs + c->min_io_size <= c->leb_size); | 364 | ubifs_assert(wbuf->offs + wbuf->size <= c->leb_size); |
| 365 | ubifs_assert(wbuf->size >= c->min_io_size); | ||
| 366 | ubifs_assert(wbuf->size <= c->max_write_size); | ||
| 367 | ubifs_assert(wbuf->size % c->min_io_size == 0); | ||
| 365 | ubifs_assert(!c->ro_media && !c->ro_mount); | 368 | ubifs_assert(!c->ro_media && !c->ro_mount); |
| 366 | 369 | ||
| 367 | if (c->ro_error) | 370 | if (c->ro_error) |
| @@ -369,10 +372,10 @@ int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf) | |||
| 369 | 372 | ||
| 370 | ubifs_pad(c, wbuf->buf + wbuf->used, wbuf->avail); | 373 | ubifs_pad(c, wbuf->buf + wbuf->used, wbuf->avail); |
| 371 | err = ubi_leb_write(c->ubi, wbuf->lnum, wbuf->buf, wbuf->offs, | 374 | err = ubi_leb_write(c->ubi, wbuf->lnum, wbuf->buf, wbuf->offs, |
| 372 | c->min_io_size, wbuf->dtype); | 375 | wbuf->size, wbuf->dtype); |
| 373 | if (err) { | 376 | if (err) { |
| 374 | ubifs_err("cannot write %d bytes to LEB %d:%d", | 377 | ubifs_err("cannot write %d bytes to LEB %d:%d", |
| 375 | c->min_io_size, wbuf->lnum, wbuf->offs); | 378 | wbuf->size, wbuf->lnum, wbuf->offs); |
| 376 | dbg_dump_stack(); | 379 | dbg_dump_stack(); |
| 377 | return err; | 380 | return err; |
| 378 | } | 381 | } |
| @@ -380,8 +383,9 @@ int ubifs_wbuf_sync_nolock(struct ubifs_wbuf *wbuf) | |||
| 380 | dirt = wbuf->avail; | 383 | dirt = wbuf->avail; |
| 381 | 384 | ||
| 382 | spin_lock(&wbuf->lock); | 385 | spin_lock(&wbuf->lock); |
| 383 | wbuf->offs += c->min_io_size; | 386 | wbuf->offs += wbuf->size; |
| 384 | wbuf->avail = c->min_io_size; | 387 | wbuf->avail = c->min_io_size; |
| 388 | wbuf->size = c->min_io_size; | ||
| 385 | wbuf->used = 0; | 389 | wbuf->used = 0; |
| 386 | wbuf->next_ino = 0; | 390 | wbuf->next_ino = 0; |
| 387 | spin_unlock(&wbuf->lock); | 391 | spin_unlock(&wbuf->lock); |
| @@ -425,6 +429,7 @@ int ubifs_wbuf_seek_nolock(struct ubifs_wbuf *wbuf, int lnum, int offs, | |||
| 425 | wbuf->lnum = lnum; | 429 | wbuf->lnum = lnum; |
| 426 | wbuf->offs = offs; | 430 | wbuf->offs = offs; |
| 427 | wbuf->avail = c->min_io_size; | 431 | wbuf->avail = c->min_io_size; |
| 432 | wbuf->size = c->min_io_size; | ||
| 428 | wbuf->used = 0; | 433 | wbuf->used = 0; |
| 429 | spin_unlock(&wbuf->lock); | 434 | spin_unlock(&wbuf->lock); |
| 430 | wbuf->dtype = dtype; | 435 | wbuf->dtype = dtype; |
| @@ -522,7 +527,10 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len) | |||
| 522 | ubifs_assert(len > 0 && wbuf->lnum >= 0 && wbuf->lnum < c->leb_cnt); | 527 | ubifs_assert(len > 0 && wbuf->lnum >= 0 && wbuf->lnum < c->leb_cnt); |
| 523 | ubifs_assert(wbuf->offs >= 0 && wbuf->offs % c->min_io_size == 0); | 528 | ubifs_assert(wbuf->offs >= 0 && wbuf->offs % c->min_io_size == 0); |
| 524 | ubifs_assert(!(wbuf->offs & 7) && wbuf->offs <= c->leb_size); | 529 | ubifs_assert(!(wbuf->offs & 7) && wbuf->offs <= c->leb_size); |
| 525 | ubifs_assert(wbuf->avail > 0 && wbuf->avail <= c->min_io_size); | 530 | ubifs_assert(wbuf->avail > 0 && wbuf->avail <= wbuf->size); |
| 531 | ubifs_assert(wbuf->size >= c->min_io_size); | ||
| 532 | ubifs_assert(wbuf->size <= c->max_write_size); | ||
| 533 | ubifs_assert(wbuf->size % c->min_io_size == 0); | ||
| 526 | ubifs_assert(mutex_is_locked(&wbuf->io_mutex)); | 534 | ubifs_assert(mutex_is_locked(&wbuf->io_mutex)); |
| 527 | ubifs_assert(!c->ro_media && !c->ro_mount); | 535 | ubifs_assert(!c->ro_media && !c->ro_mount); |
| 528 | 536 | ||
| @@ -547,7 +555,7 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len) | |||
| 547 | dbg_io("flush jhead %s wbuf to LEB %d:%d", | 555 | dbg_io("flush jhead %s wbuf to LEB %d:%d", |
| 548 | dbg_jhead(wbuf->jhead), wbuf->lnum, wbuf->offs); | 556 | dbg_jhead(wbuf->jhead), wbuf->lnum, wbuf->offs); |
| 549 | err = ubi_leb_write(c->ubi, wbuf->lnum, wbuf->buf, | 557 | err = ubi_leb_write(c->ubi, wbuf->lnum, wbuf->buf, |
| 550 | wbuf->offs, c->min_io_size, | 558 | wbuf->offs, wbuf->size, |
| 551 | wbuf->dtype); | 559 | wbuf->dtype); |
| 552 | if (err) | 560 | if (err) |
| 553 | goto out; | 561 | goto out; |
| @@ -555,6 +563,7 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len) | |||
| 555 | spin_lock(&wbuf->lock); | 563 | spin_lock(&wbuf->lock); |
| 556 | wbuf->offs += c->min_io_size; | 564 | wbuf->offs += c->min_io_size; |
| 557 | wbuf->avail = c->min_io_size; | 565 | wbuf->avail = c->min_io_size; |
| 566 | wbuf->size = c->min_io_size; | ||
| 558 | wbuf->used = 0; | 567 | wbuf->used = 0; |
| 559 | wbuf->next_ino = 0; | 568 | wbuf->next_ino = 0; |
| 560 | spin_unlock(&wbuf->lock); | 569 | spin_unlock(&wbuf->lock); |
| @@ -577,11 +586,11 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len) | |||
| 577 | dbg_jhead(wbuf->jhead), wbuf->lnum, wbuf->offs); | 586 | dbg_jhead(wbuf->jhead), wbuf->lnum, wbuf->offs); |
| 578 | memcpy(wbuf->buf + wbuf->used, buf, wbuf->avail); | 587 | memcpy(wbuf->buf + wbuf->used, buf, wbuf->avail); |
| 579 | err = ubi_leb_write(c->ubi, wbuf->lnum, wbuf->buf, wbuf->offs, | 588 | err = ubi_leb_write(c->ubi, wbuf->lnum, wbuf->buf, wbuf->offs, |
| 580 | c->min_io_size, wbuf->dtype); | 589 | wbuf->size, wbuf->dtype); |
| 581 | if (err) | 590 | if (err) |
| 582 | goto out; | 591 | goto out; |
| 583 | 592 | ||
| 584 | offs = wbuf->offs + c->min_io_size; | 593 | offs = wbuf->offs + wbuf->size; |
| 585 | len -= wbuf->avail; | 594 | len -= wbuf->avail; |
| 586 | aligned_len -= wbuf->avail; | 595 | aligned_len -= wbuf->avail; |
| 587 | written = wbuf->avail; | 596 | written = wbuf->avail; |
| @@ -618,6 +627,7 @@ int ubifs_wbuf_write_nolock(struct ubifs_wbuf *wbuf, void *buf, int len) | |||
| 618 | wbuf->offs = offs; | 627 | wbuf->offs = offs; |
| 619 | wbuf->used = aligned_len; | 628 | wbuf->used = aligned_len; |
| 620 | wbuf->avail = c->min_io_size - aligned_len; | 629 | wbuf->avail = c->min_io_size - aligned_len; |
| 630 | wbuf->size = c->min_io_size; | ||
| 621 | wbuf->next_ino = 0; | 631 | wbuf->next_ino = 0; |
| 622 | spin_unlock(&wbuf->lock); | 632 | spin_unlock(&wbuf->lock); |
| 623 | 633 | ||
| @@ -855,7 +865,7 @@ int ubifs_wbuf_init(struct ubifs_info *c, struct ubifs_wbuf *wbuf) | |||
| 855 | 865 | ||
| 856 | wbuf->used = 0; | 866 | wbuf->used = 0; |
| 857 | wbuf->lnum = wbuf->offs = -1; | 867 | wbuf->lnum = wbuf->offs = -1; |
| 858 | wbuf->avail = c->min_io_size; | 868 | wbuf->avail = wbuf->size = c->min_io_size; |
| 859 | wbuf->dtype = UBI_UNKNOWN; | 869 | wbuf->dtype = UBI_UNKNOWN; |
| 860 | wbuf->sync_callback = NULL; | 870 | wbuf->sync_callback = NULL; |
| 861 | mutex_init(&wbuf->io_mutex); | 871 | mutex_init(&wbuf->io_mutex); |
diff --git a/fs/ubifs/ubifs.h b/fs/ubifs/ubifs.h index 942c1d3cb0db..362495078489 100644 --- a/fs/ubifs/ubifs.h +++ b/fs/ubifs/ubifs.h | |||
| @@ -646,6 +646,7 @@ typedef int (*ubifs_lpt_scan_callback)(struct ubifs_info *c, | |||
| 646 | * @offs: write-buffer offset in this logical eraseblock | 646 | * @offs: write-buffer offset in this logical eraseblock |
| 647 | * @avail: number of bytes available in the write-buffer | 647 | * @avail: number of bytes available in the write-buffer |
| 648 | * @used: number of used bytes in the write-buffer | 648 | * @used: number of used bytes in the write-buffer |
| 649 | * @size: write-buffer size (in [@c->min_io_size, @c->max_write_size] range) | ||
| 649 | * @dtype: type of data stored in this LEB (%UBI_LONGTERM, %UBI_SHORTTERM, | 650 | * @dtype: type of data stored in this LEB (%UBI_LONGTERM, %UBI_SHORTTERM, |
| 650 | * %UBI_UNKNOWN) | 651 | * %UBI_UNKNOWN) |
| 651 | * @jhead: journal head the mutex belongs to (note, needed only to shut lockdep | 652 | * @jhead: journal head the mutex belongs to (note, needed only to shut lockdep |
| @@ -680,6 +681,7 @@ struct ubifs_wbuf { | |||
| 680 | int offs; | 681 | int offs; |
| 681 | int avail; | 682 | int avail; |
| 682 | int used; | 683 | int used; |
| 684 | int size; | ||
| 683 | int dtype; | 685 | int dtype; |
| 684 | int jhead; | 686 | int jhead; |
| 685 | int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad); | 687 | int (*sync_callback)(struct ubifs_info *c, int lnum, int free, int pad); |
