1. 14 Dec, 2009 3 commits
    • Jan Kara's avatar
      udf: Avoid IO in udf_clear_inode · 2c948b3f
      Jan Kara authored
      
      It is not very good to do IO in udf_clear_inode. First, VFS does not really
      expect inode to become dirty there and thus we have to write it ourselves,
      second, memory reclaim gets blocked waiting for IO when it does not really
      expect it, third, the IO pattern (e.g. on umount) resulting from writes in
      udf_clear_inode is bad and it slows down writing a lot.
      
      The reason why UDF needed to do IO in udf_clear_inode is that UDF standard
      mandates extent length to exactly match inode size. But when we allocate
      extents to a file or directory, we don't really know what exactly the final
      file size will be and thus temporarily set it to block boundary and later
      truncate it to exact length in udf_clear_inode. Now, this is changed to
      truncate to final file size in udf_release_file for regular files. For
      directories and symlinks, we do the truncation at the moment when learn
      what the final file size will be.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      2c948b3f
    • Jan Kara's avatar
      udf: Try harder when looking for VAT inode · e971b0b9
      Jan Kara authored
      
      Some disks do not contain VAT inode in the last recorded block as required
      by the standard but a few blocks earlier (or the number of recorded blocks
      is wrong). So look for the VAT inode a bit before the end of the media.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      e971b0b9
    • Jan Kara's avatar
      udf: Fix compilation with UDFFS_DEBUG enabled · 1fefd086
      Jan Kara authored
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      1fefd086
  2. 14 Sep, 2009 4 commits
    • Jan Kara's avatar
      udf: Fix possible corruption when close races with write · cbc8cc33
      Jan Kara authored
      
      When we close a file, we remove preallocated blocks from it. But this
      truncation was not protected by i_mutex and thus it could have raced with a
      write through a different fd and cause crashes or even filesystem corruption.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      cbc8cc33
    • Jan Kara's avatar
      udf: Perform preallocation only for regular files · 81056dd0
      Jan Kara authored
      
      So far we preallocated blocks also for directories but that brings a
      problem, when to get rid of preallocated blocks we don't need. So far
      we removed them in udf_clear_inode() which has a disadvantage that
      1) blocks are unavailable long after writing to a directory finished
         and thus one can get out of space unnecessarily early
      2) releasing blocks from udf_clear_inode is problematic because VFS
         does not expect us to redirty inode there and it also slows down
         memory reclaim.
      
      So preallocate blocks only for regular files where we can drop preallocation
      in udf_release_file.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      81056dd0
    • Jan Kara's avatar
      udf: Remove wrong assignment in udf_symlink · 7c6e3d1a
      Jan Kara authored
      
      Recomputation of the pointer was wrong (it should have been just increment).
      Luckily, we never use the computed value. Remove it.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      7c6e3d1a
    • Jan Kara's avatar
      udf: Remove dead code · 5891d9dd
      Jan Kara authored
      
      Remove code that gets never used.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      5891d9dd
  3. 30 Jul, 2009 1 commit
  4. 24 Jun, 2009 1 commit
  5. 18 Jun, 2009 1 commit
  6. 11 Jun, 2009 3 commits
  7. 22 May, 2009 1 commit
  8. 02 Apr, 2009 16 commits
  9. 25 Mar, 2009 1 commit
  10. 22 Jan, 2009 1 commit
  11. 27 Nov, 2008 1 commit
    • Jan Kara's avatar
      udf: Fix BUG_ON() in destroy_inode() · 52b19ac9
      Jan Kara authored
      
      udf_clear_inode() can leave behind buffers on mapping's i_private list (when
      we truncated preallocation). Call invalidate_inode_buffers() so that the list
      is properly cleaned-up before we return from udf_clear_inode(). This is ugly
      and suggest that we should cleanup preallocation earlier than in clear_inode()
      but currently there's no such call available since drop_inode() is called under
      inode lock and thus is unusable for disk operations.
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      52b19ac9
  12. 13 Nov, 2008 1 commit
  13. 23 Oct, 2008 2 commits
  14. 13 Oct, 2008 1 commit
  15. 08 Sep, 2008 1 commit
  16. 19 Aug, 2008 2 commits
    • Jan Kara's avatar
      udf: Fix error paths in udf_new_inode() · 97e1cfb0
      Jan Kara authored
      
      I case we failed to allocate memory for inode when creating it, we did not
      properly free block already allocated for this inode. Move memory allocation
      before the block allocation which fixes this issue (thanks for the idea go to
      Ingo Oeser <ioe-lkml@rameria.de>). Also remove a few superfluous
      initializations already done in udf_alloc_inode().
      Reviewed-by: default avatarIngo Oeser <ioe-lkml@rameria.de>
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      97e1cfb0
    • Jan Kara's avatar
      udf: Fix lock inversion between iprune_mutex and alloc_mutex (v2) · db0badc5
      Jan Kara authored
      
      A memory allocation inside alloc_mutex must not recurse back into the
      filesystem itself because that leads to lock inversion between iprune_mutex and
      alloc_mutex (and thus to deadlocks - see traces below). alloc_mutex is actually
      needed only to update allocation statistics in the superblock so we can drop it
      before we start allocating memory for the inode.
      
      tar           D ffff81015b9c8c90     0  6614   6612
       ffff8100d5a21a20 0000000000000086 0000000000000000 00000000ffff0000
       ffff81015b9c8c90 ffff81015b8f0cd0 ffff81015b9c8ee0 0000000000000000
       0000000000000003 0000000000000000 0000000000000000 0000000000000000
      Call Trace:
       [<ffffffff803c1d8a>] __mutex_lock_slowpath+0x64/0x9b
       [<ffffffff803c1bef>] mutex_lock+0xa/0xb
       [<ffffffff8027f8c2>] shrink_icache_memory+0x38/0x200
       [<ffffffff80257742>] shrink_slab+0xe3/0x15b
       [<ffffffff802579db>] try_to_free_pages+0x221/0x30d
       [<ffffffff8025657e>] isolate_pages_global+0x0/0x31
       [<ffffffff8025324b>] __alloc_pages_internal+0x252/0x3ab
       [<ffffffff8026b08b>] cache_alloc_refill+0x22e/0x47b
       [<ffffffff8026ae37>] kmem_cache_alloc+0x3b/0x61
       [<ffffffff8026b15b>] cache_alloc_refill+0x2fe/0x47b
       [<ffffffff8026b34e>] __kmalloc+0x76/0x9c
       [<ffffffffa00751f2>] :udf:udf_new_inode+0x202/0x2e2
       [<ffffffffa007ae5e>] :udf:udf_create+0x2f/0x16d
       [<ffffffffa0078f27>] :udf:udf_lookup+0xa6/0xad
      ...
      kswapd0       D ffff81015b9d9270     0   125      2
       ffff81015b903c28 0000000000000046 ffffffff8028cbb0 00000000fffffffb
       ffff81015b9d9270 ffff81015b8f0cd0 ffff81015b9d94c0 000000000271b490
       ffffe2000271b458 ffffe2000271b420 ffffe20002728dc8 ffffe20002728d90
      Call Trace:
       [<ffffffff8028cbb0>] __set_page_dirty+0xeb/0xf5
       [<ffffffff8025403a>] get_dirty_limits+0x1d/0x22f
       [<ffffffff803c1d8a>] __mutex_lock_slowpath+0x64/0x9b
       [<ffffffff803c1bef>] mutex_lock+0xa/0xb
       [<ffffffffa0073f58>] :udf:udf_bitmap_free_blocks+0x47/0x1eb
       [<ffffffffa007df31>] :udf:udf_discard_prealloc+0xc6/0x172
       [<ffffffffa007875a>] :udf:udf_clear_inode+0x1e/0x48
       [<ffffffff8027f121>] clear_inode+0x6d/0xc4
       [<ffffffff8027f7f2>] dispose_list+0x56/0xee
       [<ffffffff8027fa5a>] shrink_icache_memory+0x1d0/0x200
       [<ffffffff80257742>] shrink_slab+0xe3/0x15b
       [<ffffffff80257e93>] kswapd+0x346/0x447
      ...
      Reported-by: default avatarTibor Tajti <tibor.tajti@gmail.com>
      Reviewed-by: default avatarIngo Oeser <ioe-lkml@rameria.de>
      Signed-off-by: default avatarJan Kara <jack@suse.cz>
      db0badc5