03 Jul, 2009

3 commits


16 Jun, 2009

1 commit


11 Jun, 2009

7 commits

  • During tree log replay, we read in the tree log roots,
    process them and then free them. A recent change
    takes an extra reference on the root node of the tree
    when the root is read in, and stores that reference
    in root->commit_root.

    This reference was not being freed, leaving us with
    one buffer pinned in ram for each subvol with
    a tree log root after a crash.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • This happens during subvol creation.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • It was printing nodatacsum, which was not the correct option name.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • lookup_inline_extent_backref only checks for duplicate backref for data
    extents. It assumes backrefs for tree block never conflict.

    This patch makes lookup_inline_extent_backref check for duplicate backrefs
    for both data and tree block, so that we can detect potential bug earlier.
    This is a safety check, strictly speaking it is not required.

    Signed-off-by: Yan Zheng
    Signed-off-by: Chris Mason

    Yan Zheng
     
  • This patch fixes a bug which may result race condition
    between btrfs_start_workers() and worker_loop().

    btrfs_start_workers() executed in a parent thread writes
    on workers->worker and worker_loop() in a child thread
    reads workers->worker. However, there is no synchronization
    enforcing the order of two operations.

    This patch makes btrfs_start_workers() fill workers->worker
    before it starts a child thread with worker_loop()

    Signed-off-by: Chris Mason

    Shin Hong
     
  • write_dev_supers is called in sequence. First is it called with wait == 0,
    which starts IO on all of the super blocks for a given device. Then it is
    called with wait == 1 to make sure they all reach the disk.

    It doesn't currently pin the buffers between the two calls, and it also
    assumes the buffers won't go away between the two calls, leading to
    an oops if the VM manages to free the buffers in the middle of the sync.

    This fixes that assumption and updates the code to return an error if things
    are not up to date when the wait == 1 run is done.

    Signed-off-by: Hisashi Hifumi
    Signed-off-by: Chris Mason

    Hisashi Hifumi
     
  • On multi-device filesystems, btrfs writes supers to all of the devices
    before considering a sync complete. There wasn't any additional
    locking between super writeout and the device list management code
    because device management was done inside a transaction and
    super writeout only happened with no transation writers running.

    With the btrfs fsync log and other async transaction updates, this
    has been racey for some time. This adds a mutex to protect
    the device list. The existing volume mutex could not be reused due to
    transaction lock ordering requirements.

    Signed-off-by: Chris Mason

    Chris Mason
     

10 Jun, 2009

21 commits

  • ... otherwise generic_permission() will allow *anything* for all
    files you don't own and that have some group permissions.

    Signed-off-by: Al Viro
    Signed-off-by: Chris Mason

    Al Viro
     
  • In btrfs, fdatasync and fsync are identical, but
    fdatasync should skip committing transaction when
    inode->i_state is set just I_DIRTY_SYNC and this indicates
    only atime or/and mtime updates.
    Following patch improves fdatasync throughput.

    --file-block-size=4K --file-total-size=16G --file-test-mode=rndwr
    --file-fsync-mode=fdatasync run

    Results:
    -2.6.30-rc8
    Test execution summary:
    total time: 1980.6540s
    total number of events: 10001
    total time taken by event execution: 1192.9804
    per-request statistics:
    min: 0.0000s
    avg: 0.1193s
    max: 15.3720s
    approx. 95 percentile: 0.7257s

    Threads fairness:
    events (avg/stddev): 625.0625/151.32
    execution time (avg/stddev): 74.5613/9.46

    -2.6.30-rc8-patched
    Test execution summary:
    total time: 1695.9118s
    total number of events: 10000
    total time taken by event execution: 871.3214
    per-request statistics:
    min: 0.0000s
    avg: 0.0871s
    max: 10.4644s
    approx. 95 percentile: 0.4787s

    Threads fairness:
    events (avg/stddev): 625.0000/131.86
    execution time (avg/stddev): 54.4576/8.98

    Signed-off-by: Hisashi Hifumi
    Signed-off-by: Chris Mason

    Hisashi Hifumi
     
  • There's no need to preserve this abstraction; it used to let us use
    hardware crc32c support directly, but libcrc32c is already doing that for us
    through the crypto API -- so we're already using the Intel crc32c
    acceleration where appropriate.

    Signed-off-by: David Woodhouse
    Signed-off-by: Chris Mason

    David Woodhouse
     
  • Add support for the standard attributes set via chattr and read via
    lsattr. Currently we store the attributes in the flags value in
    the btrfs inode, but I wonder whether we should split it into two so
    that we don't have to keep converting between the two formats.

    Remove the btrfs_clear_flag/btrfs_set_flag/btrfs_test_flag macros
    as they were confusing the existing code and got in the way of the
    new additions.

    Also add the FS_IOC_GETVERSION ioctl for getting i_generation as it's
    trivial.

    Signed-off-by: Christoph Hellwig
    Signed-off-by: Chris Mason

    Christoph Hellwig
     
  • During mount, btrfs will check the queue nonrot flag
    for all the devices found in the FS. If they are all
    non-rotating, SSD mode is enabled by default.

    If the FS was mounted with -o nossd, the non-rotating
    flag is ignored.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • Some SSDs perform best when reusing block numbers often, while
    others perform much better when clustering strictly allocates
    big chunks of unused space.

    The default mount -o ssd will find rough groupings of blocks
    where there are a bunch of free blocks that might have some
    allocated blocks mixed in.

    mount -o ssd_spread will make sure there are no allocated blocks
    mixed in. It should perform better on lower end SSDs.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • In SSD mode for data, and all the time for metadata the allocator
    will try to find a cluster of nearby blocks for allocations. This
    commit adds extra checks to make sure that each free block in the
    cluster is close to the last one.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • This allows you to turn off the ssd mode via remount.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • The btrfs IO submission threads try to service a bunch of devices with a small
    number of threads. They do a congestion check to try and avoid waiting
    on requests for a busy device.

    The checks make sure we've sent a few requests down to a given device just so
    that we aren't bouncing between busy devices without actually sending down
    any IO. The counter used to decide if we can switch to the next device
    is somewhat overloaded. It is also being used to decide if we've done
    a good batch of requests between the WRITE_SYNC or regular priority lists.
    It may get reset to zero often, leaving us hammering on a busy device
    instead of moving on to another disk.

    This commit adds a new counter for the number of bios sent while
    servicing a device. It doesn't get reset or fiddled with. On
    multi-device filesystems, this fixes IO stalls in streaming
    write workloads.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • Btrfs uses dedicated threads to submit bios when checksumming is on,
    which allows us to make sure the threads dedicated to checksumming don't get
    stuck waiting for requests. For each btrfs device, there are
    two lists of bios. One list is for WRITE_SYNC bios and the other
    is for regular priority bios.

    The IO submission threads used to process all of the WRITE_SYNC bios first and
    then switch to the regular bios. This commit makes sure we don't completely
    starve the regular bios by rotating between the two lists.

    WRITE_SYNC bios are still favored 2:1 over the regular bios, and this tries
    to run in batches to avoid seeking. Benchmarking shows this eliminates
    stalls during streaming buffered writes on both multi-device and
    single device filesystems.

    If the regular bios starve, the system can end up with a large amount of ram
    pinned down in writeback pages. If we are a little more fair between the two
    classes, we're able to keep throughput up and make progress on the bulk of
    our dirty ram.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • Once a metadata block has been written, it must be recowed, so the
    btrfs dirty balancing call has a check to make sure a fair amount of metadata
    was actually dirty before it started writing it back to disk.

    A previous commit had changed the dirty tracking for metadata without
    updating the btrfs dirty balancing checks. This commit switches it
    to use the correct counter.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • The block allocator in SSD mode will try to find groups of free blocks
    that are close together. This commit makes it loop less on a given
    group size before bumping it.

    The end result is that we are less likely to fill small holes in the
    available free space, but we don't waste as much CPU building the
    large cluster used by ssd mode.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • With the new back reference code, the cost of a balance has gone down
    in terms of the number of back reference updates done. This commit
    makes us more aggressively balance leaves and nodes as they become
    less full.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • When the delayed reference code was added, some checks were added
    to avoid extra balancing while the delayed references were being flushed.
    This made for less efficient btrees, but it reduced the chances of
    loops where no forward progress was made because the balances made
    more delayed ref updates.

    With the new dead root removal code and the mixed back references,
    the extent allocation tree is no longer using precise back refs, and
    the delayed reference updates don't carry the risk of looping forever
    anymore. So, the balance avoidance is no longer required.

    Signed-off-by: Chris Mason

    Chris Mason
     
  • This commit introduces a new kind of back reference for btrfs metadata.
    Once a filesystem has been mounted with this commit, IT WILL NO LONGER
    BE MOUNTABLE BY OLDER KERNELS.

    When a tree block in subvolume tree is cow'd, the reference counts of all
    extents it points to are increased by one. At transaction commit time,
    the old root of the subvolume is recorded in a "dead root" data structure,
    and the btree it points to is later walked, dropping reference counts
    and freeing any blocks where the reference count goes to 0.

    The increments done during cow and decrements done after commit cancel out,
    and the walk is a very expensive way to go about freeing the blocks that
    are no longer referenced by the new btree root. This commit reduces the
    transaction overhead by avoiding the need for dead root records.

    When a non-shared tree block is cow'd, we free the old block at once, and the
    new block inherits old block's references. When a tree block with reference
    count > 1 is cow'd, we increase the reference counts of all extents
    the new block points to by one, and decrease the old block's reference count by
    one.

    This dead tree avoidance code removes the need to modify the reference
    counts of lower level extents when a non-shared tree block is cow'd.
    But we still need to update back ref for all pointers in the block.
    This is because the location of the block is recorded in the back ref
    item.

    We can solve this by introducing a new type of back ref. The new
    back ref provides information about pointer's key, level and in which
    tree the pointer lives. This information allow us to find the pointer
    by searching the tree. The shortcoming of the new back ref is that it
    only works for pointers in tree blocks referenced by their owner trees.

    This is mostly a problem for snapshots, where resolving one of these
    fuzzy back references would be O(number_of_snapshots) and quite slow.
    The solution used here is to use the fuzzy back references in the common
    case where a given tree block is only referenced by one root,
    and use the full back references when multiple roots have a reference
    on a given block.

    This commit adds per subvolume red-black tree to keep trace of cached
    inodes. The red-black tree helps the balancing code to find cached
    inodes whose inode numbers within a given range.

    This commit improves the balancing code by introducing several data
    structures to keep the state of balancing. The most important one
    is the back ref cache. It caches how the upper level tree blocks are
    referenced. This greatly reduce the overhead of checking back ref.

    The improved balancing code scales significantly better with a large
    number of snapshots.

    This is a very large commit and was written in a number of
    pieces. But, they depend heavily on the disk format change and were
    squashed together to make sure git bisect didn't end up in a
    bad state wrt space balancing or the format change.

    Signed-off-by: Yan Zheng
    Signed-off-by: Chris Mason

    Yan Zheng
     
  • There are some 'start = state->end + 1;' like code in set_extent_bit
    and clear_extent_bit. They overflow when end == (u64)-1.

    Signed-off-by: Yan Zheng
    Signed-off-by: Chris Mason

    Yan Zheng
     
  • Linus Torvalds
     
  • There's a bug in the mxser kernel module that still appears in the
    2.6.29.4 kernel.

    mxser_get_ISA_conf takes a ioaddress as its first argument, by passing the
    not of the ioaddr, you're effectively passing 0 which means it won't be
    able to talk to an ISA card. I have tested this, and removing the !
    fixes the problem.

    Cc: "Peter Botha"
    Signed-off-by: Jiri Slaby
    Acked-by: Alan Cox
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Peter Botha
     
  • In commit code, we scan buffers attached to a transaction. During this
    scan, we sometimes have to drop j_list_lock and then we recheck whether
    the journal buffer head didn't get freed by journal_try_to_free_buffers().
    But checking for buffer_jbd(bh) isn't enough because a new journal head
    could get attached to our buffer head. So add a check whether the journal
    head remained the same and whether it's still at the same transaction and
    list.

    This is a nasty bug and can cause problems like memory corruption (use after
    free) or trigger various assertions in JBD code (observed).

    Signed-off-by: Jan Kara
    Cc:
    Cc:
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Jan Kara
     
  • The recent ->lookup() deadlock correction required the directory inode
    mutex to be dropped while waiting for expire completion. We were
    concerned about side effects from this change and one has been identified.

    I saw several error messages.

    They cause autofs to become quite confused and don't really point to the
    actual problem.

    Things like:

    handle_packet_missing_direct:1376: can't find map entry for (43,1827932)

    which is usually totally fatal (although in this case it wouldn't be
    except that I treat is as such because it normally is).

    do_mount_direct: direct trigger not valid or already mounted
    /test/nested/g3c/s1/ss1

    which is recoverable, however if this problem is at play it can cause
    autofs to become quite confused as to the dependencies in the mount tree
    because mount triggers end up mounted multiple times. It's hard to
    accurately check for this over mounting case and automount shouldn't need
    to if the kernel module is doing its job.

    There was one other message, similar in consequence of this last one but I
    can't locate a log example just now.

    When checking if a mount has already completed prior to adding a new mount
    request to the wait queue we check if the dentry is hashed and, if so, if
    it is a mount point. But, if a mount successfully completed while we
    slept on the wait queue mutex the dentry must exist for the mount to have
    completed so the test is not really needed.

    Mounts can also be done on top of a global root dentry, so for the above
    case, where a mount request completes and the wait queue entry has already
    been removed, the hashed test returning false can cause an incorrect
    callback to the daemon. Also, d_mountpoint() is not sufficient to check
    if a mount has completed for the multi-mount case when we don't have a
    real mount at the base of the tree.

    Signed-off-by: Ian Kent
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Ian Kent
     
  • The massive nommu update (8feae131) resulted in these warnings:
    ipc/shm.c: In function `sys_shmdt':
    ipc/shm.c:974: warning: unused variable `size'
    ipc/shm.c:972: warning: unused variable `next'

    Signed-off-by: Mike Frysinger
    Cc: David Howells
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Mike Frysinger
     

09 Jun, 2009

8 commits

  • * git://git.kernel.org/pub/scm/linux/kernel/git/rusty/linux-2.6-for-linus:
    kvm: fix kvm reboot crash when MAXSMP is used
    cpumask: alloc zeroed cpumask for static cpumask_var_ts
    cpumask: introduce zalloc_cpumask_var

    Linus Torvalds
     
  • * 'for-linus' of git://git.kernel.dk/linux-2.6-block:
    bsg: setting rq->bio to NULL

    Linus Torvalds
     
  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6:
    cls_cgroup: Fix oops when user send improperly 'tc filter add' request
    r8169: fix crash when large packets are received

    Linus Torvalds
     
  • * 'for-linus' of git://neil.brown.name/md:
    md/raid5: fix bug in reshape code when chunk_size decreases.
    md/raid5 - avoid deadlocks in get_active_stripe during reshape
    md/raid5: use conf->raid_disks in preference to mddev->raid_disk

    Linus Torvalds
     
  • Due to commit 1cd96c242a829d52f7a5ae98f554ca9775429685 ("block: WARN
    in __blk_put_request() for potential bio leak"), BSG SMP requests get
    the false warnings:

    WARNING: at block/blk-core.c:1068 __blk_put_request+0x52/0xc0()

    This sets rq->bio to NULL to avoid that false warnings.

    Signed-off-by: FUJITA Tomonori
    Signed-off-by: Jens Axboe

    FUJITA Tomonori
     
  • one system was found there is crash during reboot then kvm/MAXSMP
    Sending all processes the KILL signal... done
    Please stand by while rebooting the system...
    [ 1721.856538] md: stopping all md devices.
    [ 1722.852139] kvm: exiting hardware virtualization
    [ 1722.854601] BUG: unable to handle kernel NULL pointer dereference at (null)
    [ 1722.872219] IP: [] hardware_disable+0x4c/0xb4
    [ 1722.877955] PGD 0
    [ 1722.880042] Oops: 0000 [#1] SMP
    [ 1722.892548] last sysfs file: /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0/host0/target0:2:0/0:2:0:0/vendor
    [ 1722.900977] CPU 9
    [ 1722.912606] Modules linked in:
    [ 1722.914226] Pid: 0, comm: swapper Not tainted 2.6.30-rc7-tip-01843-g2305324-dirty #299 ...
    [ 1722.932589] RIP: 0010:[] [] hardware_disable+0x4c/0xb4
    [ 1722.942709] RSP: 0018:ffffc900010b6ed8 EFLAGS: 00010046
    [ 1722.956121] RAX: 0000000000000000 RBX: ffffc9000e253140 RCX: 0000000000000009
    [ 1722.972202] RDX: 000000000000b020 RSI: ffffc900010c3220 RDI: ffffffffffffd790
    [ 1722.977399] RBP: ffffc900010b6f08 R08: 0000000000000000 R09: 0000000000000000
    [ 1722.995149] R10: 00000000000004b8 R11: 966912b6c78fddbd R12: 0000000000000009
    [ 1723.011551] R13: 000000000000b020 R14: 0000000000000009 R15: 0000000000000000
    [ 1723.019898] FS: 0000000000000000(0000) GS:ffffc900010b3000(0000) knlGS:0000000000000000
    [ 1723.034389] CS: 0010 DS: 0018 ES: 0018 CR0: 000000008005003b
    [ 1723.041164] CR2: 0000000000000000 CR3: 0000000001001000 CR4: 00000000000006e0
    [ 1723.056192] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    [ 1723.072546] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 1723.080562] Process swapper (pid: 0, threadinfo ffff88107e464000, task ffff88047e5a2550)
    [ 1723.096144] Stack:
    [ 1723.099071] 0000000000000046 ffffc9000e253168 966912b6c78fddbd ffffc9000e253140
    [ 1723.115471] ffff880c7d4304d0 ffffc9000e253168 ffffc900010b6f28 ffffffff81011022
    [ 1723.132428] ffffc900010b6f48 966912b6c78fddbd ffffc900010b6f48 ffffffff8100b83b
    [ 1723.141973] Call Trace:
    [ 1723.142981] [] kvm_arch_hardware_disable+0x26/0x3c
    [ 1723.158153] [] hardware_disable+0x3f/0x55
    [ 1723.172168] [] generic_smp_call_function_interrupt+0x76/0x13c
    [ 1723.178836] [] smp_call_function_interrupt+0x3a/0x5e
    [ 1723.194689] [] call_function_interrupt+0x13/0x20
    [ 1723.199750] [] ? acpi_idle_enter_c1+0xd3/0xf4
    [ 1723.217508] [] ? acpi_idle_enter_c1+0xcd/0xf4
    [ 1723.232172] [] ? acpi_idle_enter_bm+0xe7/0x2ce
    [ 1723.235141] [] ? __atomic_notifier_call_chain+0x0/0xac
    [ 1723.253381] [] ? menu_select+0x58/0xd2
    [ 1723.258179] [] ? cpuidle_idle_call+0xa4/0xf3
    [ 1723.272828] [] ? cpu_idle+0xb8/0x101
    [ 1723.277085] [] ? start_secondary+0x1bc/0x1d7
    [ 1723.293708] Code: b0 00 00 65 48 8b 04 25 28 00 00 00 48 89 45 e0 31 c0 48 8b 04 cd 30 ee 27 82 49 89 cc 49 89 d5 48 8b 04 10 48 8d b8 90 d7 ff ff 8b 87 70 28 00 00 48 8d 98 90 d7 ff ff eb 16 e8 e9 fe ff ff
    [ 1723.335524] RIP [] hardware_disable+0x4c/0xb4
    [ 1723.342076] RSP
    [ 1723.352021] CR2: 0000000000000000
    [ 1723.354348] ---[ end trace e2aec53dae150aa1 ]---

    it turns out that we need clear cpus_hardware_enabled in that case.

    Reported-and-tested-by: Yinghai Lu
    Signed-off-by: Yinghai Lu
    Signed-off-by: Rusty Russell

    Avi Kivity
     
  • These are defined as static cpumask_var_t so if MAXSMP is not used,
    they are cleared already. Avoid surprises when MAXSMP is enabled.

    Signed-off-by: Yinghai Lu
    Signed-off-by: Rusty Russell

    Yinghai Lu
     
  • So can get cpumask_var with cpumask_clear

    Signed-off-by: Yinghai Lu
    Signed-off-by: Rusty Russell

    Yinghai Lu