1. 06 Feb, 2011 2 commits
    • Josef Bacik's avatar
      Btrfs: exclude super blocks when we read in block groups · 3c14874a
      Josef Bacik authored
      This has been resulting in a BUT_ON(ret) after btrfs_reserve_extent in
      btrfs_cow_file_range.  The reason is we don't actually calculate the bytes_super
      for a block group until we go to cache it, which means that the space_info can
      hand out reservations for space that it doesn't actually have, and we can run
      out of data space.  This is also a problem if you are using space caching since
      we don't ever calculate bytes_super for the block groups.  So instead everytime
      we read a block group call exclude_super_stripes, which calculates the
      bytes_super for the block group so it can be left out of the space_info.  Then
      whenever caching completes we just call free_excluded_extents so that the super
      excluded extents are freed up.  Also if we are unmounting and we hit any block
      groups that haven't been cached we still need to call free_excluded_extents to
      make sure things are cleaned up properly.  Thanks,
      Reported-by: default avatarArne Jansen <sensille@gmx.net>
      Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      3c14874a
    • Josef Bacik's avatar
      Btrfs: make sure search_bitmap finds something in remove_from_bitmap · 13dbc089
      Josef Bacik authored
      When we're cleaning up the tree log we need to be able to remove free space from
      the block group.  The problem is if that free space spans bitmaps we would not
      find the space since we're looking for too many bytes.  So make sure the amount
      of bytes we search for is limited to either the number of bytes we want, or the
      number of bytes left in the bitmap.  This was tested by a user who was hitting
      the BUG() after search_bitmap.  With this patch he can now mount his fs.
      Thanks,
      Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      13dbc089
  2. 01 Feb, 2011 3 commits
  3. 31 Jan, 2011 2 commits
    • Chris Mason's avatar
      Btrfs: catch errors from btrfs_sync_log · b31eabd8
      Chris Mason authored
      btrfs_sync_log returns -EAGAIN when we need full transaction commits
      instead of small log commits, but sometimes we were dropping the return
      value.
      
      In practice, we check for this a few different ways, but this is still a
      bug that can leave off full log commits when we really need them.
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      b31eabd8
    • Josef Bacik's avatar
      Btrfs: make shrink_delalloc a little friendlier · b1953bce
      Josef Bacik authored
      Xfstests 224 will just sit there and spin for ever until eventually we give up
      flushing delalloc and exit.  On my box this took several hours.  I could not
      interrupt this process either, even though we use INTERRUPTIBLE.  So do 2 things
      
      1) Keep us from looping over and over again without reclaiming anything
      2) If we get interrupted exit the loop
      
      I tested this and the test now exits in a reasonable amount of time, and can be
      interrupted with ctrl+c.  Thanks,
      Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      b1953bce
  4. 28 Jan, 2011 12 commits
  5. 26 Jan, 2011 12 commits
  6. 17 Jan, 2011 1 commit
    • liubo's avatar
      Btrfs: forced readonly mounts on errors · acce952b
      liubo authored
      This patch comes from "Forced readonly mounts on errors" ideas.
      
      As we know, this is the first step in being more fault tolerant of disk
      corruptions instead of just using BUG() statements.
      
      The major content:
      - add a framework for generating errors that should result in filesystems
        going readonly.
      - keep FS state in disk super block.
      - make sure that all of resource will be freed and released at umount time.
      - make sure that fter FS is forced readonly on error, there will be no more
        disk change before FS is corrected. For this, we should stop write operation.
      
      After this patch is applied, the conversion from BUG() to such a framework can
      happen incrementally.
      Signed-off-by: default avatarLiu Bo <liubo2009@cn.fujitsu.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      acce952b
  7. 16 Jan, 2011 8 commits
    • Ben Hutchings's avatar
      btrfs: Require CAP_SYS_ADMIN for filesystem rebalance · 6f88a440
      Ben Hutchings authored
      Filesystem rebalancing (BTRFS_IOC_BALANCE) affects the entire
      filesystem and may run uninterruptibly for a long time.  This does not
      seem to be something that an unprivileged user should be able to do.
      Reported-by: default avatarAron Xu <happyaron.xu@gmail.com>
      Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      6f88a440
    • Josef Bacik's avatar
      Btrfs: don't warn if we get ENOSPC in btrfs_block_rsv_check · f690efb1
      Josef Bacik authored
      If we run low on space we could get a bunch of warnings out of
      btrfs_block_rsv_check, but this is mostly just called via the transaction code
      to see if we need to end the transaction, it expects to see failures, so let's
      not WARN and freak everybody out for no reason.  Thanks,
      Signed-off-by: default avatarJosef Bacik <josef@redhat.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      f690efb1
    • Tsutomu Itoh's avatar
      btrfs: Fix memory leak in btrfs_read_fs_root_no_radix() · 5e540f77
      Tsutomu Itoh authored
      In btrfs_read_fs_root_no_radix(), 'root' is not freed if
      btrfs_search_slot() returns error.
      Signed-off-by: default avatarTsutomu Itoh <t-itoh@jp.fujitsu.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      5e540f77
    • Tsutomu Itoh's avatar
      btrfs: check NULL or not · 91ca338d
      Tsutomu Itoh authored
      Should check if functions returns NULL or not.
      Signed-off-by: default avatarTsutomu Itoh <t-itoh@jp.fujitsu.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      91ca338d
    • Jesper Juhl's avatar
      btrfs: Don't pass NULL ptr to func that may deref it. · ff175d57
      Jesper Juhl authored
      Hi,
      
      In fs/btrfs/inode.c::fixup_tree_root_location() we have this code:
      
      ...
       		if (!path) {
       			err = -ENOMEM;
       			goto out;
       		}
      ...
       	out:
       		btrfs_free_path(path);
       		return err;
      
      btrfs_free_path() passes its argument on to other functions and some of
      them end up dereferencing the pointer.
      In the code above that pointer is clearly NULL, so btrfs_free_path() will
      eventually cause a NULL dereference.
      
      There are many ways to cut this cake (fix the bug). The one I chose was to
      make btrfs_free_path() deal gracefully with NULL pointers. If you
      disagree, feel free to come up with an alternative patch.
      Signed-off-by: default avatarJesper Juhl <jj@chaosbits.net>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      ff175d57
    • Dave Young's avatar
      btrfs: mount failure return value fix · 20b45077
      Dave Young authored
      I happened to pass swap partition as root partition in cmdline,
      then kernel panic and tell me about "Cannot open root device".
      It is not correct, in fact it is a fs type mismatch instead of 'no device'.
      
      Eventually I found btrfs mounting failed with -EIO, it should be -EINVAL.
      The logic in init/do_mounts.c:
              for (p = fs_names; *p; p += strlen(p)+1) {
                      int err = do_mount_root(name, p, flags, root_mount_data);
                      switch (err) {
                              case 0:
                                      goto out;
                              case -EACCES:
                                      flags |= MS_RDONLY;
                                      goto retry;
                              case -EINVAL:
                                      continue;
                      }
      		print "Cannot open root device"
      		panic
      	}
      SO fs type after btrfs will have no chance to mount
      
      Here fix the return value as -EINVAL
      Signed-off-by: default avatarDave Young <hidave.darkstar@gmail.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      20b45077
    • Jesper Juhl's avatar
      btrfs: Mem leak in btrfs_get_acl() · 42838bb2
      Jesper Juhl authored
      It seems to me that we leak the memory allocated to 'value' in
      btrfs_get_acl() if the call to posix_acl_from_xattr() fails.
      Here's a patch that attempts to correct that problem.
      Signed-off-by: default avatarJesper Juhl <jj@chaosbits.net>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      42838bb2
    • Miao Xie's avatar
      btrfs: fix wrong free space information of btrfs · 6d07bcec
      Miao Xie authored
      When we store data by raid profile in btrfs with two or more different size
      disks, df command shows there is some free space in the filesystem, but the
      user can not write any data in fact, df command shows the wrong free space
      information of btrfs.
      
       # mkfs.btrfs -d raid1 /dev/sda9 /dev/sda10
       # btrfs-show
       Label: none  uuid: a95cd49e-6e33-45b8-8741-a36153ce4b64
       	Total devices 2 FS bytes used 28.00KB
       	devid    1 size 5.01GB used 2.03GB path /dev/sda9
       	devid    2 size 10.00GB used 2.01GB path /dev/sda10
       # btrfs device scan /dev/sda9 /dev/sda10
       # mount /dev/sda9 /mnt
       # dd if=/dev/zero of=tmpfile0 bs=4K count=9999999999
         (fill the filesystem)
       # sync
       # df -TH
       Filesystem	Type	Size	Used	Avail	Use%	Mounted on
       /dev/sda9	btrfs	17G	8.6G	5.4G	62%	/mnt
       # btrfs-show
       Label: none  uuid: a95cd49e-6e33-45b8-8741-a36153ce4b64
       	Total devices 2 FS bytes used 3.99GB
       	devid    1 size 5.01GB used 5.01GB path /dev/sda9
       	devid    2 size 10.00GB used 4.99GB path /dev/sda10
      
      It is because btrfs cannot allocate chunks when one of the pairing disks has
      no space, the free space on the other disks can not be used for ever, and should
      be subtracted from the total space, but btrfs doesn't subtract this space from
      the total. It is strange to the user.
      
      This patch fixes it by calcing the free space that can be used to allocate
      chunks.
      
      Implementation:
      1. get all the devices free space, and align them by stripe length.
      2. sort the devices by the free space.
      3. check the free space of the devices,
         3.1. if it is not zero, and then check the number of the devices that has
              more free space than this device,
              if the number of the devices is beyond the min stripe number, the free
              space can be used, and add into total free space.
              if the number of the devices is below the min stripe number, we can not
              use the free space, the check ends.
         3.2. if the free space is zero, check the next devices, goto 3.1
      
      This implementation is just likely fake chunk allocation.
      
      After appling this patch, df can show correct space information:
       # df -TH
       Filesystem	Type	Size	Used	Avail	Use%	Mounted on
       /dev/sda9	btrfs	17G	8.6G	0	100%	/mnt
      Signed-off-by: default avatarMiao Xie <miaox@cn.fujitsu.com>
      Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
      6d07bcec