1. 16 May, 2011 18 commits
  2. 13 May, 2011 22 commits
    • Artem Bityutskiy's avatar
      UBIFS: fix a rare memory leak in ro to rw remounting path · eaeee242
      Artem Bityutskiy authored
      When re-mounting from R/O mode to R/W mode and the LEB count in the superblock
      is not up-to date, because for the underlying UBI volume became larger, we
      re-write the superblock. We allocate RAM for these purposes, but never free it.
      So this is a memory leak, although very rare one.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      Cc: stable@kernel.org
      eaeee242
    • Artem Bityutskiy's avatar
      UBIFS: fix inode size debugging check failure · c1f1f91d
      Artem Bityutskiy authored
      This patch fixes a problem with the following symptoms:
      
      UBIFS: deferred recovery completed
      UBIFS error (pid 15676): dbg_check_synced_i_size: ui_size is 11481088, synced_i_size is 11459081, but inode is clean
      UBIFS error (pid 15676): dbg_check_synced_i_size: i_ino 128, i_mode 0x81a4, i_size 11481088
      
      It happens when additional debugging checks are enabled and we are recovering
      from a power cut. When we fixup corrupted inode size during recovery, we change
      them in-place and we change ui_size as well, but not synced_i_size, which
      causes this failure. This patch makes sure we change both fields and fixes the
      issue.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      c1f1f91d
    • Artem Bityutskiy's avatar
      UBIFS: fix debugging FS checking failure · 45cd5cdd
      Artem Bityutskiy authored
      When the debugging self-checks are enabled, we go trough whole file-system
      after mount and check/validate every single node referred to by the index.
      This is implemented by the 'dbg_check_filesystem()' function. However, this
      function fails if we mount "unclean" file-system, i.e., if we mount the
      file-system after a power cut. It fails with the following symptoms:
      
      UBIFS DBG (pid 8171): ubifs_recover_size: ino 937 size 3309925 -> 3317760
      UBIFS: recovery deferred
      UBIFS error (pid 8171): check_leaf: data node at LEB 1000:0 is not within inode size 3309925
      
      The reason of failure is that recovery fixed up the inode size in memory, but
      not on the flash so far. So the value on the flash is incorrect so far,
      and would be corrected when we re-mount R/W. But 'check_leaf()' ignores
      this fact and tries to validate the size of the on-flash inode, which is
      incorrect, so it fails.
      
      This patch teaches the checking code to look at the VFS inode cache first,
      and if there is the inode in question, use that inode instead of the inode
      on the flash media. This fixes the issue.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      45cd5cdd
    • Artem Bityutskiy's avatar
      UBIFS: remove an unneeded check · 69f8a75a
      Artem Bityutskiy authored
      In 'ubifs_recover_size()' we have an "if (!e->inode && c->ro_mount)" statement.
      But if 'c->ro_mount' is true, then '!e->inode' must always be true as well. So
      we can remove the unnecessary '!e->inode' test and put an
      'ubifs_assert(!e->inode)' instead.
      
      This patch also removes an extra trailing white-space in a debugging print,
      as well as adds few empty lines to 'ubifs_recover_size()' to make it a bit more
      readable.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      69f8a75a
    • Artem Bityutskiy's avatar
      UBIFS: fix debugging message · 4c954520
      Artem Bityutskiy authored
      When recovering the inode size, one of the debugging messages was printed
      incorrecly, this patches fixes it.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      4c954520
    • Artem Bityutskiy's avatar
      UBIFS: refactor ubifs_rcvry_gc_commit · fe79c05f
      Artem Bityutskiy authored
      This commits refactors and cleans up 'ubifs_rcvry_gc_commit()' which was quite
      untidy, also removes the commentary which was not 100% correct.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      fe79c05f
    • Artem Bityutskiy's avatar
      UBIFS: split ubifs_rcvry_gc_commit · 44744213
      Artem Bityutskiy authored
      Split the 'ubifs_rcvry_gc_commit()' function and introduce a 'grab_empty_leb()'
      heler. This cleans 'ubifs_rcvry_gc_commit()' a little and makes it a bit less
      of spagetti.
      
      Also, add a commentary which explains why it is crucial to first search for an
      empty LEB and then run commit.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      44744213
    • Artem Bityutskiy's avatar
      UBIFS: dump the stack on errors in failure mode too · ec068142
      Artem Bityutskiy authored
      When UBIFS is in the failure mode (used for power cut emulation testing) we for
      some reasons do not dump the stack in many places, e.g., in assertions.
      Probably at early days we had too many of them and disabled this to make the
      development easier, but then never enabled. Nowadays I sometimes observe
      assertion failures during power cut testing, but the useful stackdump is not
      printed, which is bad. This patch makes UBIFS always print the stackdump when
      debugging is enabled.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      ec068142
    • Artem Bityutskiy's avatar
      UBIFS: print useful debugging messages when cannot recover gc_lnum · 6d5904e0
      Artem Bityutskiy authored
      If we fail to recover the gc_lnum we just return an error and it then
      it is difficult to figure out why this happened. This patch adds useful
      debugging information which should make it easier to debug the failure.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      6d5904e0
    • Artem Bityutskiy's avatar
      UBIFS: remove dead GC LEB recovery piece of code · bcdca3e1
      Artem Bityutskiy authored
      This patch removes a piece of code in 'ubifs_rcvry_gc_commit()' which is never
      executed. We call 'ubifs_find_dirty_leb()' function with min_space =
      wbuf->offs, so if it returns us an LEB, it is guaranteed to have at lease
      'wbuf->offs' bytes of free+dirty space. So we can remove the subsequent code
      which deals with "returned LEB has less than 'wbuf->offs' bytes of free+dirty
      space". This simplifies 'ubifs_rcvry_gc_commit()' a little.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      bcdca3e1
    • Artem Bityutskiy's avatar
      UBIFS: remove duplicated code · 2405f594
      Artem Bityutskiy authored
      We have duplicated code in 'ubifs_garbage_collect()' and
      'ubifs_rcvry_gc_commit()', which is about handling the special case of free
      LEB. In both cases we just want to garbage-collect the LEB using
      'ubifs_garbage_collect_leb()'.
      
      This patch teaches 'ubifs_garbage_collect_leb()' to handle free LEB's so that
      the caller does not have to do this and the duplicated code is removed.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      2405f594
    • Artem Bityutskiy's avatar
      UBIFS: remove strange commentary · 2cd0a60c
      Artem Bityutskiy authored
      Remove the following commentary from 'ubifs_file_mmap()':
      
      /* 'generic_file_mmap()' takes care of NOMMU case */
      
      I do not understand what it means, and I could not find anything relater to
      NOMMU in 'generic_file_mmap()'.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      2cd0a60c
    • Artem Bityutskiy's avatar
      UBIFS: do not change debugfs file position · 341e262f
      Artem Bityutskiy authored
      This patch is a tiny improvement which removes few bytes of code.
      UBIFS debugfs files are non-seekable and the file position is ignored,
      so do not increase it in the write handler.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      341e262f
    • Artem Bityutskiy's avatar
      UBIFS: fix oops in lprops dump function · 1321657d
      Artem Bityutskiy authored
      The 'dbg_dump_lprop()' is trying to detect journal head LEBs when printing,
      so it looks at the write-buffers. However, if we are in R/O mode, we
      de-allocate the write-buffers, so 'dbg_dump_lprop()' oopses. This patch fixes
      the issue.
      
      Note, this patch is not critical, it is only about the debugging code path, and
      it is unlikely that anyone but UBIFS developers would ever hit this issue.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      1321657d
    • Artem Bityutskiy's avatar
      UBIFS: use ro_mount instead of MS_RDONLY · 3b2f9a01
      Artem Bityutskiy authored
      We have our own flags indicating R/O mode, and c->ro_mode is equivalent
      to MS_RDONLY. Let's be consistent and use UBIFS flags everywhere.
      This patch is just a minor cleanup.
      
      Additionally, add a comment that we are surprised with VFS behavior -
      as a reminder to look at this some day.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      3b2f9a01
    • Artem Bityutskiy's avatar
      UBIFS: use EROFS when emulating failures · 1a29af8b
      Artem Bityutskiy authored
      When the debugging failure emulation is enabled and UBIFS decides to
      emulate an I/O error, it uses EIO error code. In which case UBIFS
      switches into R/O mode later on. The for the user-space is that when
      a failure is emulated, the file-system sometimes returns EIO and
      sometimes EROFS. This makes it more difficult to implement user-space
      tests for the failure mode. Let's be consistent and return EROFS in
      all the cases.
      
      This patch is an improvement for the debugging code and does not affect
      the functionality at all.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      1a29af8b
    • Sedat Dilek's avatar
      UBIFS: make xattr operations names consistent · 14ffd5d0
      Sedat Dilek authored
      This is just a tiny clean-up patch. The variable name for empty address
      space operations is "empty_aops". Let's use consistent names for empty
      inode and file operations: "empty_iops" and "empty_fops", instead of
      inconsistent "none_inode_operations" and "none_file_operations".
      
      Artem: re-write the commit message.
      Signed-off-by: default avatarSedat Dilek <sedat.dilek@gmail.com>
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      14ffd5d0
    • Artem Bityutskiy's avatar
      UBIFS: introduce lsave debugging · cdd8ad6e
      Artem Bityutskiy authored
      Try to improve UBIFS testing coverage by randomly picking LEBs to
      store in lsave, rather than picking them optimally. Create a debugging
      version of 'populate_lsave()' for these purposes and enable it when
      general debugging self-checks are enabled.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      cdd8ad6e
    • Artem Bityutskiy's avatar
      UBIFS: make force in-the-gaps to be a general self-check · bc3f07f0
      Artem Bityutskiy authored
      UBIFS can force itself to use the 'in-the-gaps' commit method - the last resort
      method which is normally invoced very very rarely. Currently this "force
      int-the-gaps" debugging feature is a separate test mode. But it is a bit saner
      to make it to be the "general" self-test check instead.
      
      This patch is just a clean-up which should make the debugging code look a bit
      nicer and easier to use - we have way too many debugging options.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      bc3f07f0
    • Artem Bityutskiy's avatar
      UBIFS: improve space checking debugging feature · f1bd66af
      Artem Bityutskiy authored
      This patch improves the 'dbg_check_space_info()' function which checks
      whether the amount of space before re-mounting and after re-mounting
      is the same (remounting from R/O to R/W modes and vice-versa).
      
      The problem is that 'dbg_check_space_info()' does not save the budgeting
      information before re-mounting, so when an error is reported, we do not
      know why the amount of free space changed.
      
      This patches makes the following changes:
      
      1. Teaches 'dbg_dump_budg()' function to accept a 'struct ubifs_budg_info'
         argument and print out the this argument. This way we may ask it to
         print any saved budgeting info, no only the current one.
      2. Accordingly changes all the callers of 'dbg_dump_budg()' to comply with
         the changed interface.
      3. Introduce a 'saved_bi' (saved budgeting info) field to
         'struct ubifs_debug_info' and save the budgeting info before re-mounting
         there.
      4. Change 'dbg_check_space_info()' and make it print both old and new
         budgeting information.
      5. Additionally, save 'c->igx_gc_cnt' and print it if and error happens. This
         value contributes to the amount of free space, so we have to print it.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      f1bd66af
    • Artem Bityutskiy's avatar
      UBIFS: rearrange the budget dump · 8c3067e4
      Artem Bityutskiy authored
      Re-arrange the budget dump and make sure we first dump all
      the 'struct ubifs_budg_info' fields, and then the other information.
      Additionally, print the 'uncommitted_idx' variable.
      
      This change is required for to the following dumping function
      enhancement where it will be possible to dump saved
      'struct ubifs_budg_info' objects, not only the current one.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      8c3067e4
    • Artem Bityutskiy's avatar
      UBIFS: simplify dbg_dump_budg calling conventions · 8ff83089
      Artem Bityutskiy authored
      The current 'dbg_dump_budg()' calling convention is that the
      'c->space_lock' spinlock is held. However, none of the callers
      actually use it from contects which have 'c->space_lock' locked,
      so all callers have to explicitely lock and unlock the spinlock.
      This is not very sensible convention. This patch changes it and
      makes 'dbg_dump_budg()' lock the spinlock instead of imposing this
      to the callers. This simplifies the code a little.
      Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      8ff83089