| From ba29e721eb2df6df8f33c1f248388bb037a47914 Mon Sep 17 00:00:00 2001 |
| From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| Date: Wed, 16 Jul 2014 15:22:29 +0300 |
| Subject: UBIFS: fix free log space calculation |
| |
| From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| |
| commit ba29e721eb2df6df8f33c1f248388bb037a47914 upstream. |
| |
| Hu (hujianyang <hujianyang@huawei.com>) discovered an issue in the |
| 'empty_log_bytes()' function, which calculates how many bytes are left in the |
| log: |
| |
| " |
| If 'c->lhead_lnum + 1 == c->ltail_lnum' and 'c->lhead_offs == c->leb_size', 'h' |
| would equalent to 't' and 'empty_log_bytes()' would return 'c->log_bytes' |
| instead of 0. |
| " |
| |
| At this point it is not clear what would be the consequences of this, and |
| whether this may lead to any problems, but this patch addresses the issue just |
| in case. |
| |
| Tested-by: hujianyang <hujianyang@huawei.com> |
| Reported-by: hujianyang <hujianyang@huawei.com> |
| Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/ubifs/log.c | 8 ++++++-- |
| 1 file changed, 6 insertions(+), 2 deletions(-) |
| |
| --- a/fs/ubifs/log.c |
| +++ b/fs/ubifs/log.c |
| @@ -106,10 +106,14 @@ static inline long long empty_log_bytes( |
| h = (long long)c->lhead_lnum * c->leb_size + c->lhead_offs; |
| t = (long long)c->ltail_lnum * c->leb_size; |
| |
| - if (h >= t) |
| + if (h > t) |
| return c->log_bytes - h + t; |
| - else |
| + else if (h != t) |
| return t - h; |
| + else if (c->lhead_lnum != c->ltail_lnum) |
| + return 0; |
| + else |
| + return c->log_bytes; |
| } |
| |
| /** |