1. 16 5月, 2011 3 次提交
  2. 14 5月, 2011 26 次提交
    • A
      UBIFS: fix a rare memory leak in ro to rw remounting path · eaeee242
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      Cc: stable@kernel.org
      eaeee242
    • A
      UBIFS: fix inode size debugging check failure · c1f1f91d
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      c1f1f91d
    • A
      UBIFS: fix debugging FS checking failure · 45cd5cdd
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      45cd5cdd
    • A
      UBIFS: remove an unneeded check · 69f8a75a
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      69f8a75a
    • A
      UBIFS: fix debugging message · 4c954520
      Artem Bityutskiy 提交于
      When recovering the inode size, one of the debugging messages was printed
      incorrecly, this patches fixes it.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      4c954520
    • A
      UBIFS: refactor ubifs_rcvry_gc_commit · fe79c05f
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      fe79c05f
    • A
      UBIFS: split ubifs_rcvry_gc_commit · 44744213
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      44744213
    • A
      UBIFS: dump the stack on errors in failure mode too · ec068142
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      ec068142
    • A
      UBIFS: print useful debugging messages when cannot recover gc_lnum · 6d5904e0
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      6d5904e0
    • A
      UBIFS: remove dead GC LEB recovery piece of code · bcdca3e1
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      bcdca3e1
    • A
      UBIFS: remove duplicated code · 2405f594
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      2405f594
    • A
      UBIFS: remove strange commentary · 2cd0a60c
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      2cd0a60c
    • A
      UBIFS: do not change debugfs file position · 341e262f
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      341e262f
    • A
      UBIFS: fix oops in lprops dump function · 1321657d
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      1321657d
    • A
      UBIFS: use ro_mount instead of MS_RDONLY · 3b2f9a01
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      3b2f9a01
    • A
      UBIFS: use EROFS when emulating failures · 1a29af8b
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      1a29af8b
    • S
      UBIFS: make xattr operations names consistent · 14ffd5d0
      Sedat Dilek 提交于
      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: NSedat Dilek <sedat.dilek@gmail.com>
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      14ffd5d0
    • A
      UBIFS: introduce lsave debugging · cdd8ad6e
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      cdd8ad6e
    • A
      UBIFS: make force in-the-gaps to be a general self-check · bc3f07f0
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      bc3f07f0
    • A
      UBIFS: improve space checking debugging feature · f1bd66af
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      f1bd66af
    • A
      UBIFS: rearrange the budget dump · 8c3067e4
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      8c3067e4
    • A
      UBIFS: simplify dbg_dump_budg calling conventions · 8ff83089
      Artem Bityutskiy 提交于
      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: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      8ff83089
    • A
      UBIFS: introduce a separate structure for budgeting info · b137545c
      Artem Bityutskiy 提交于
      This patch separates out all the budgeting-related information
      from 'struct ubifs_info' to 'struct ubifs_budg_info'. This way the
      code looks a bit cleaner. However, the main driver for this is
      that we want to save budgeting information and print it later,
      so a separate data structure for this is helpful.
      
      This patch is a preparation for the further debugging output
      improvements.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      b137545c
    • A
      UBIFS: use __packed instead of __attribute__((packed)) · cc64f774
      Artem Bityutskiy 提交于
      There was an attempt to standartize various "__attribute__" and
      other macros in order to have potentially portable and more
      consistent code, see commit 82ddcb04.
      
      Note, that commit refers Rober Love's blog post, but the URL
      is broken, the valid URL is:
      http://blog.rlove.org/2005/10/with-little-help-from-your-compiler.html
      
      Moreover, nowadays checkpatch.pl warns about using
      __attribute__((packed)):
      
      "WARNING: __packed is preferred over __attribute__((packed))"
      
      It is not a big deal for UBIFS to use __packed, so let's do it.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      cc64f774
    • A
      UBIFS: fix minor stylistic issues · c4361570
      Artem Bityutskiy 提交于
      Fix several minor stylistic issues:
      * lines longer than 80 characters
      * space before closing parenthesis ')'
      * spaces in the indentations
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      c4361570
    • A
      UBIFS: make debugfs files non-seekable · 1bbfc848
      Artem Bityutskiy 提交于
      Turn the debufs files UBIFS maintains into non-seekable. Indeed, none
      of them is supposed to be seek'ed.
      
      Do this by making the '.lseek()' handler to be 'no_llseek()' and by
      using 'nonseekable_open()' in the '.open()' operation.
      
      This does mean an API break but this debugging API is only used by a couple
      of test scripts which do not rely in the 'llseek()' operation.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      1bbfc848
  3. 03 5月, 2011 2 次提交
    • A
      UBIFS: seek journal heads to the latest bud in replay · 52c6e6f9
      Artem Bityutskiy 提交于
      This is the second fix of the following symptom:
      
      UBIFS error (pid 34456): could not find an empty LEB
      
      which sometimes happens after power cuts when we mount the file-system - UBIFS
      refuses it with the above error message which comes from the
      'ubifs_rcvry_gc_commit()' function. I can reproduce this using the integck test
      with the UBIFS power cut emulation enabled.
      
      Analysis of the problem.
      
      Currently UBIFS replay seeks the journal heads to the last _replayed_ bud.
      But the buds are replayed out-of-order, so the replay basically seeks journal
      heads to the "random" bud belonging to this head, and not to the _last_ one.
      
      The result of this is that the GC head may be seeked to a full LEB with no free
      space, or very little free space. And 'ubifs_rcvry_gc_commit()' tries to find a
      fully or mostly dirty LEB to match the current GC head (because we need to
      garbage-collect that dirty LEB at one go, because we do not have @c->gc_lnum).
      So 'ubifs_find_dirty_leb()' fails and we fall back to finding an empty LEB and
      also fail. As a result - recovery fails and mounting fails.
      
      This patch teaches the replay to initialize the GC heads exactly to the latest
      buds, i.e. the buds which have the largest sequence number in corresponding
      log reference nodes.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      Cc: stable@kernel.org
      52c6e6f9
    • A
      UBIFS: do not free write-buffers when in R/O mode · b50b9f40
      Artem Bityutskiy 提交于
      Currently UBIFS has a small optimization - it frees write-buffers when it is
      re-mounted from R/W mode to R/O mode. Of course, when it is mounted R/O, it
      does not allocate write-buffers as well.
      
      This optimization is nice but it leads to subtle problems and complications
      in recovery, which I can reproduce using the integck test. The symptoms are
      that after a power cut the file-system cannot be mounted if we first mount
      it R/O, and then re-mount R/W - 'ubifs_rcvry_gc_commit()' prints:
      
      UBIFS error (pid 34456): could not find an empty LEB
      
      Analysis of the  problem.
      
      When mounting R/W, the reply process sets journal heads to buds [1], but
      when mounting R/O - it does not do this, because the write-buffers are not
      allocated. So 'ubifs_rcvry_gc_commit()' works completely differently for the
      same file-system but for the following 2 cases:
      
      1. mounting R/W after a power cut and recover
      2. mounting R/O after a power cut, re-mounting R/W and run deferred recovery
      
      In the former case, we have journal heads seeked to the a bud, in the latter
      case, they are non-seeked (wbuf->lnum == -1). So in the latter case we do not
      try to recover the GC LEB by garbage-collecting to the GC head, but we just
      try to find an empty LEB, and there may be no empty LEBs, so we just fail.
      On the other hand, in the former case (mount R/W), we are able to make a GC LEB
      (@c->gc_lnum) by garbage-collecting.
      
      Thus, let's remove this small nice optimization and always allocate
      write-buffers. This should not make too big difference - we have only 3
      of them, each of max. write unit size, which is usually 2KiB. So this is
      about 6KiB of RAM for the typical case, and only when mounted R/O.
      
      [1]: Note, currently the replay process is setting (seeking) the journal heads
      to _some_ buds, not necessarily to the buds which had been the journal heads
      before the power cut happened. This will be fixed separately.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      Cc: stable@kernel.org
      b50b9f40
  4. 21 4月, 2011 2 次提交
    • A
      UBIFS: fix master node recovery · 6e0d9fd3
      Artem Bityutskiy 提交于
      This patch fixes the following symptoms:
      1. Unmount UBIFS cleanly.
      2. Start mounting UBIFS R/W and have a power cut immediately
      3. Start mounting UBIFS R/O, this succeeds
      4. Try to re-mount UBIFS R/W - this fails immediately or later on,
         because UBIFS will write the master node to the flash area
         which has been written before.
      
      The analysis of the problem:
      
      1. UBIFS is unmounted cleanly, both copies of the master node are clean.
      2. UBIFS is being mounter R/W, starts changing master node copy 1, and
         a power cut happens. The copy N1 becomes corrupted.
      3. UBIFS is being mounted R/O. It notices the copy N1 is corrupted and
         reads copy N2. Copy N2 is clean.
      4. Because of R/O mode, UBIFS cannot recover copy 1.
      5. The mount code (ubifs_mount()) sees that the master node is clean,
         so it decides that no recovery is needed.
      6. We are re-mounting R/W. UBIFS believes no recovery is needed and
         starts updating the master node, but copy N1 is still corrupted
         and was not recovered!
      
      Fix this problem by marking the master node as dirty every time we
      recover it and we are in R/O mode. This forces further recovery and
      the UBIFS cleans-up the corruptions and recovers the copy N1 when
      re-mounting R/W later.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      Cc: stable@kernel.org
      6e0d9fd3
    • A
      UBIFS: fix false assertion warning in case of I/O failures · 1a067a22
      Artem Bityutskiy 提交于
      When UBIFS switches to R/O mode because it detects I/O failures, then
      when we unmount, we still may have allocated budget, and the assertions
      which verify that we have not budget will fire. But it is expected to
      have the budget in case of I/O failures, so the assertion warnings will
      be false. Suppress them for the I/O failure case.
      Signed-off-by: NArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
      1a067a22
  5. 20 4月, 2011 1 次提交
  6. 13 4月, 2011 2 次提交
  7. 06 4月, 2011 1 次提交
    • J
      fs: export empty_aops · 7dcda1c9
      Jens Axboe 提交于
      With the ->sync_page() hook gone, we have a few users that
      add their own static address_space_operations without any
      functions defined.
      
      fs/inode.c already has an empty_aops that it uses for init
      purposes. Lets export that and use it in the places where
      an otherwise empty aops was defined.
      Signed-off-by: NJens Axboe <jaxboe@fusionio.com>
      7dcda1c9
  8. 05 4月, 2011 3 次提交