01 Aug, 2013

1 commit


27 Jul, 2013

2 commits


25 Jul, 2013

1 commit

  • When we made all inode updates transactional, we no longer needed
    the log recovery detection for inodes being newer on disk than the
    transaction being replayed - it was redundant as replay of the log
    would always result in the latest version of the inode would be on
    disk. It was redundant, but left in place because it wasn't
    considered to be a problem.

    However, with the new "don't read inodes on create" optimisation,
    flushiter has come back to bite us. Essentially, the optimisation
    made always initialises flushiter to zero in the create transaction,
    and so if we then crash and run recovery and the inode already on
    disk has a non-zero flushiter it will skip recovery of that inode.
    As a result, log recovery does the wrong thing and we end up with a
    corrupt filesystem.

    Because we have to support old kernel to new kernel upgrades, we
    can't just get rid of the flushiter support in log recovery as we
    might be upgrading from a kernel that doesn't have fully transactional
    inode updates. Unfortunately, for v4 superblocks there is no way to
    guarantee that log recovery knows about this fact.

    We cannot add a new inode format flag to say it's a "special inode
    create" because it won't be understood by older kernels and so
    recovery could do the wrong thing on downgrade. We cannot specially
    detect the combination of zero mode/non-zero flushiter on disk to
    non-zero mode, zero flushiter in the log item during recovery
    because wrapping of the flushiter can result in false detection.

    Hence that makes this "don't use flushiter" optimisation limited to
    a disk format that guarantees that we don't need it. And that means
    the only fix here is to limit the "no read IO on create"
    optimisation to version 5 superblocks....

    Reported-by: Markus Trippelsdorf
    Signed-off-by: Dave Chinner
    Reviewed-by: Mark Tinguely
    Signed-off-by: Ben Myers

    (cherry picked from commit e60896d8f2b81412421953e14d3feb14177edb56)

    Dave Chinner
     

24 Jul, 2013

3 commits

  • Pull fuse bugfixes from Miklos Szeredi:
    "These are bugfixes and a cleanup to the "readdirplus" feature"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse:
    fuse: readdirplus: cleanup
    fuse: readdirplus: change attributes once
    fuse: readdirplus: fix instantiate
    fuse: readdirplus: sanity checks
    fuse: readdirplus: fix dentry leak

    Linus Torvalds
     
  • The calculation of the attribute length was 4 bytes off.

    Signed-off-by: Trond Myklebust
    Tested-by: Andre Heider
    Reported-and-tested-by: Henrik Rydberg
    Signed-off-by: Linus Torvalds

    Trond Myklebust
     
  • The following call chain:
    ------------------------------------------------------------
    nfs4_get_vfs_file
    - nfsd_open
    - dentry_open
    - do_dentry_open
    - __get_file_write_access
    - get_write_access
    - return atomic_inc_unless_negative(&inode->i_writecount) ? 0 : -ETXTBSY;
    ------------------------------------------------------------

    can result in the following state:
    ------------------------------------------------------------
    struct nfs4_file {
    ...
    fi_fds = {0xffff880c1fa65c80, 0xffffffffffffffe6, 0x0},
    fi_access = {{
    counter = 0x1
    }, {
    counter = 0x0
    }},
    ...
    ------------------------------------------------------------

    1) First time around, in nfs4_get_vfs_file() fp->fi_fds[O_WRONLY] is
    NULL, hence nfsd_open() is called where we get status set to an error
    and fp->fi_fds[O_WRONLY] to -ETXTBSY. Thus we do not reach
    nfs4_file_get_access() and fi_access[O_WRONLY] is not incremented.

    2) Second time around, in nfs4_get_vfs_file() fp->fi_fds[O_WRONLY] is
    NOT NULL (-ETXTBSY), so nfsd_open() is NOT called, but
    nfs4_file_get_access() IS called and fi_access[O_WRONLY] is incremented.
    Thus we leave a landmine in the form of the nfs4_file data structure in
    an incorrect state.

    3) Eventually, when __nfs4_file_put_access() is called it finds
    fi_access[O_WRONLY] being non-zero, it decrements it and calls
    nfs4_file_put_fd() which tries to fput -ETXTBSY.
    ------------------------------------------------------------
    ...
    [exception RIP: fput+0x9]
    RIP: ffffffff81177fa9 RSP: ffff88062e365c90 RFLAGS: 00010282
    RAX: ffff880c2b3d99cc RBX: ffff880c2b3d9978 RCX: 0000000000000002
    RDX: dead000000100101 RSI: 0000000000000001 RDI: ffffffffffffffe6
    RBP: ffff88062e365c90 R8: ffff88041fe797d8 R9: ffff88062e365d58
    R10: 0000000000000008 R11: 0000000000000000 R12: 0000000000000001
    R13: 0000000000000007 R14: 0000000000000000 R15: 0000000000000000
    ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018
    #9 [ffff88062e365c98] __nfs4_file_put_access at ffffffffa0562334 [nfsd]
    #10 [ffff88062e365cc8] nfs4_file_put_access at ffffffffa05623ab [nfsd]
    #11 [ffff88062e365ce8] free_generic_stateid at ffffffffa056634d [nfsd]
    #12 [ffff88062e365d18] release_open_stateid at ffffffffa0566e4b [nfsd]
    #13 [ffff88062e365d38] nfsd4_close at ffffffffa0567401 [nfsd]
    #14 [ffff88062e365d88] nfsd4_proc_compound at ffffffffa0557f28 [nfsd]
    #15 [ffff88062e365dd8] nfsd_dispatch at ffffffffa054543e [nfsd]
    #16 [ffff88062e365e18] svc_process_common at ffffffffa04ba5a4 [sunrpc]
    #17 [ffff88062e365e98] svc_process at ffffffffa04babe0 [sunrpc]
    #18 [ffff88062e365eb8] nfsd at ffffffffa0545b62 [nfsd]
    #19 [ffff88062e365ee8] kthread at ffffffff81090886
    #20 [ffff88062e365f48] kernel_thread at ffffffff8100c14a
    ------------------------------------------------------------

    Cc: stable@vger.kernel.org
    Signed-off-by: Harshula Jayasuriya
    Signed-off-by: J. Bruce Fields

    Harshula Jayasuriya
     

21 Jul, 2013

6 commits

  • When we try to open a file with O_TMPFILE flag, we will trigger a bug.
    The root cause is that in ext4_orphan_add() we check ->i_nlink == 0 and
    this check always fails because we set ->i_nlink = 1 in
    inode_init_always(). We can use the following program to trigger it:

    int main(int argc, char *argv[])
    {
    int fd;

    fd = open(argv[1], O_TMPFILE, 0666);
    if (fd < 0) {
    perror("open ");
    return -1;
    }
    close(fd);
    return 0;
    }

    The oops message looks like this:

    kernel: kernel BUG at fs/ext3/namei.c:1992!
    kernel: invalid opcode: 0000 [#1] SMP
    kernel: Modules linked in: ext4 jbd2 crc16 cpufreq_ondemand ipv6 dm_mirror dm_region_hash dm_log dm_mod parport_pc parport serio_raw sg dcdbas pcspkr i2c_i801 ehci_pci ehci_hcd button acpi_cpufreq mperf e1000e ptp pps_core ttm drm_kms_helper drm hwmon i2c_algo_bit i2c_core ext3 jbd sd_mod ahci libahci libata scsi_mod uhci_hcd
    kernel: CPU: 0 PID: 2882 Comm: tst_tmpfile Not tainted 3.11.0-rc1+ #4
    kernel: Hardware name: Dell Inc. OptiPlex 780 /0V4W66, BIOS A05 08/11/2010
    kernel: task: ffff880112d30050 ti: ffff8801124d4000 task.ti: ffff8801124d4000
    kernel: RIP: 0010:[] [] ext3_orphan_add+0x6a/0x1eb [ext3]
    kernel: RSP: 0018:ffff8801124d5cc8 EFLAGS: 00010202
    kernel: RAX: 0000000000000000 RBX: ffff880111510128 RCX: ffff8801114683a0
    kernel: RDX: 0000000000000000 RSI: ffff880111510128 RDI: ffff88010fcf65a8
    kernel: RBP: ffff8801124d5d18 R08: 0080000000000000 R09: ffffffffa00d3b7f
    kernel: R10: ffff8801114683a0 R11: ffff8801032a2558 R12: 0000000000000000
    kernel: R13: ffff88010fcf6800 R14: ffff8801032a2558 R15: ffff8801115100d8
    kernel: FS: 00007f5d172b5700(0000) GS:ffff880117c00000(0000) knlGS:0000000000000000
    kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    kernel: CR2: 00007f5d16df15d0 CR3: 0000000110b1d000 CR4: 00000000000407f0
    kernel: Stack:
    kernel: 000000000000000c ffff8801048a7dc8 ffff8801114685a8 ffffffffa00b80d7
    kernel: ffff8801124d5e38 ffff8801032a2558 ffff88010ce24d68 0000000000000000
    kernel: ffff88011146b300 ffff8801124d5d44 ffff8801124d5d78 ffffffffa00db7e1
    kernel: Call Trace:
    kernel: [] ? journal_start+0x8c/0xbd [jbd]
    kernel: [] ext3_tmpfile+0xb2/0x13b [ext3]
    kernel: [] path_openat+0x11f/0x5e7
    kernel: [] ? list_del+0x11/0x30
    kernel: [] ? __dequeue_entity+0x33/0x38
    kernel: [] do_filp_open+0x3f/0x8d
    kernel: [] ? __alloc_fd+0x50/0x102
    kernel: [] do_sys_open+0x13b/0x1cd
    kernel: [] SyS_open+0x1e/0x20
    kernel: [] system_call_fastpath+0x16/0x1b
    kernel: Code: 39 c7 0f 85 67 01 00 00 0f b7 03 25 00 f0 00 00 3d 00 40 00 00 74 18 3d 00 80 00 00 74 11 3d 00 a0 00 00 74 0a 83 7b 48 00 74 04 0b eb fe 49 8b 85 50 03 00 00 4c 89 f6 48 c7 c7 c0 99 0e a0
    kernel: RIP [] ext3_orphan_add+0x6a/0x1eb [ext3]
    kernel: RSP

    Here we couldn't call clear_nlink() directly because in d_tmpfile() we
    will call inode_dec_link_count() to decrease ->i_nlink. So this commit
    tries to call d_tmpfile() before ext4_orphan_add() to fix this problem.

    Signed-off-by: Zheng Liu
    Signed-off-by: "Theodore Ts'o"
    Cc: Jan Kara
    Cc: Al Viro

    Zheng Liu
     
  • When we try to open a file with O_TMPFILE flag, we will trigger a bug.
    The root cause is that in ext4_orphan_add() we check ->i_nlink == 0 and
    this check always fails because we set ->i_nlink = 1 in
    inode_init_always(). We can use the following program to trigger it:

    int main(int argc, char *argv[])
    {
    int fd;

    fd = open(argv[1], O_TMPFILE, 0666);
    if (fd < 0) {
    perror("open ");
    return -1;
    }
    close(fd);
    return 0;
    }

    The oops message looks like this:

    kernel BUG at fs/ext4/namei.c:2572!
    invalid opcode: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
    Modules linked in: dlci bridge stp hidp cmtp kernelcapi l2tp_ppp l2tp_netlink l2tp_core sctp libcrc32c rfcomm tun fuse nfnetli
    nk can_raw ipt_ULOG can_bcm x25 scsi_transport_iscsi ipx p8023 p8022 appletalk phonet psnap vmw_vsock_vmci_transport af_key vmw_vmci rose vsock atm can netrom ax25 af_rxrpc ir
    da pppoe pppox ppp_generic slhc bluetooth nfc rfkill rds caif_socket caif crc_ccitt af_802154 llc2 llc snd_hda_codec_realtek snd_hda_intel snd_hda_codec serio_raw snd_pcm pcsp
    kr edac_core snd_page_alloc snd_timer snd soundcore r8169 mii sr_mod cdrom pata_atiixp radeon backlight drm_kms_helper ttm
    CPU: 1 PID: 1812571 Comm: trinity-child2 Not tainted 3.11.0-rc1+ #12
    Hardware name: Gigabyte Technology Co., Ltd. GA-MA78GM-S2H/GA-MA78GM-S2H, BIOS F12a 04/23/2010
    task: ffff88007dfe69a0 ti: ffff88010f7b6000 task.ti: ffff88010f7b6000
    RIP: 0010:[] [] ext4_orphan_add+0x299/0x2b0
    RSP: 0018:ffff88010f7b7cf8 EFLAGS: 00010202
    RAX: 0000000000000000 RBX: ffff8800966d3020 RCX: 0000000000000000
    RDX: 0000000000000000 RSI: ffff88007dfe70b8 RDI: 0000000000000001
    RBP: ffff88010f7b7d40 R08: ffff880126a3c4e0 R09: ffff88010f7b7ca0
    R10: 0000000000000000 R11: 0000000000000000 R12: ffff8801271fd668
    R13: ffff8800966d2f78 R14: ffff88011d7089f0 R15: ffff88007dfe69a0
    FS: 00007f70441a3740(0000) GS:ffff88012a800000(0000) knlGS:00000000f77c96c0
    CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 0000000002834000 CR3: 0000000107964000 CR4: 00000000000007e0
    DR0: 0000000000780000 DR1: 0000000000000000 DR2: 0000000000000000
    DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000600
    Stack:
    0000000000002000 00000020810b6dde 0000000000000000 ffff88011d46db00
    ffff8800966d3020 ffff88011d7089f0 ffff88009c7f4c10 ffff88010f7b7f2c
    ffff88007dfe69a0 ffff88010f7b7da8 ffffffff8125cfac ffff880100000004
    Call Trace:
    [] ext4_tmpfile+0x12c/0x180
    [] path_openat+0x238/0x700
    [] ? native_sched_clock+0x24/0x80
    [] do_filp_open+0x47/0xa0
    [] ? __alloc_fd+0xaf/0x200
    [] do_sys_open+0x124/0x210
    [] ? syscall_trace_enter+0x25/0x290
    [] SyS_open+0x1e/0x20
    [] tracesys+0xdd/0xe2
    [] ? start_thread_common.constprop.6+0x1/0xa0
    Code: 04 00 00 00 89 04 24 31 c0 e8 c4 77 04 00 e9 43 fe ff ff 66 25 00 d0 66 3d 00 80 0f 84 0e fe ff ff 83 7b 48 00 0f 84 04 fe ff ff 0b 49 8b 8c 24 50 07 00 00 e9 88 fe ff ff 0f 1f 84 00 00 00

    Here we couldn't call clear_nlink() directly because in d_tmpfile() we
    will call inode_dec_link_count() to decrease ->i_nlink. So this commit
    tries to call d_tmpfile() before ext4_orphan_add() to fix this problem.

    Reported-by: Dave Jones
    Signed-off-by: Zheng Liu
    Tested-by: Darrick J. Wong
    Tested-by: Dave Jones
    Signed-off-by: "Theodore Ts'o"
    Acked-by: Al Viro

    Zheng Liu
     
  • Pull vfs fixes from Al Viro:
    "The sget() one is a long-standing bug and will need to go into -stable
    (in fact, it had been originally caught in RHEL6), the other two are
    3.11-only"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    vfs: constify dentry parameter in d_count()
    livelock avoidance in sget()
    allow O_TMPFILE to work with O_WRONLY

    Linus Torvalds
     
  • Pull ext4 bugfixes from Ted Ts'o:
    "Fixes for 3.11-rc2, sent at 5pm, in the professoinal style. :-)"

    I'm not sure I like this new level of "professionalism".
    9-5, people, 9-5.

    * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
    ext4: call ext4_es_lru_add() after handling cache miss
    ext4: yield during large unlinks
    ext4: make the extent_status code more robust against ENOMEM failures
    ext4: simplify calculation of blocks to free on error
    ext4: fix error handling in ext4_ext_truncate()

    Linus Torvalds
     
  • Pull NFS client bugfixes from Trond Myklebust:
    - Fix a regression against NFSv4 FreeBSD servers when creating a new
    file
    - Fix another regression in rpc_client_register()

    * tag 'nfs-for-3.11-3' of git://git.linux-nfs.org/projects/trondmy/linux-nfs:
    NFSv4: Fix a regression against the FreeBSD server
    SUNRPC: Fix another issue with rpc_client_register()

    Linus Torvalds
     
  • Pull btrfs fixes from Josef Bacik:
    "I'm playing the role of Chris Mason this week while he's on vacation.
    There are a few critical fixes for btrfs here, all regressions and
    have been tested well"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/josef/btrfs-next:
    Btrfs: fix wrong write offset when replacing a device
    Btrfs: re-add root to dead root list if we stop dropping it
    Btrfs: fix lock leak when resuming snapshot deletion
    Btrfs: update drop progress before stopping snapshot dropping

    Linus Torvalds
     

20 Jul, 2013

7 commits

  • Eric Sandeen has found a nasty livelock in sget() - take a mount(2) about
    to fail. The superblock is on ->fs_supers, ->s_umount is held exclusive,
    ->s_active is 1. Along comes two more processes, trying to mount the same
    thing; sget() in each is picking that superblock, bumping ->s_count and
    trying to grab ->s_umount. ->s_active is 3 now. Original mount(2)
    finally gets to deactivate_locked_super() on failure; ->s_active is 2,
    superblock is still ->fs_supers because shutdown will *not* happen until
    ->s_active hits 0. ->s_umount is dropped and now we have two processes
    chasing each other:
    s_active = 2, A acquired ->s_umount, B blocked
    A sees that the damn thing is stillborn, does deactivate_locked_super()
    s_active = 1, A drops ->s_umount, B gets it
    A restarts the search and finds the same superblock. And bumps it ->s_active.
    s_active = 2, B holds ->s_umount, A blocked on trying to get it
    ... and we are in the earlier situation with A and B switched places.

    The root cause, of course, is that ->s_active should not grow until we'd
    got MS_BORN. Then failing ->mount() will have deactivate_locked_super()
    shut the damn thing down. Fortunately, it's easy to do - the key point
    is that grab_super() is called only for superblocks currently on ->fs_supers,
    so it can bump ->s_count and grab ->s_umount first, then check MS_BORN and
    bump ->s_active; we must never increment ->s_count for superblocks past
    ->kill_sb(), but grab_super() is never called for those.

    The bug is pretty old; we would've caught it by now, if not for accidental
    exclusion between sget() for block filesystems; the things like cgroup or
    e.g. mtd-based filesystems don't have anything of that sort, so they get
    bitten. The right way to deal with that is obviously to fix sget()...

    Signed-off-by: Al Viro

    Al Viro
     
  • Signed-off-by: Al Viro

    Al Viro
     
  • Pull s390 fixes from Martin Schwidefsky:
    "An update for the BFP jit to the latest and greatest, two patches to
    get kdump working again, the random-abort ptrace extention for
    transactional execution, the z90crypt module alias for ap and a tiny
    cleanup"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux:
    s390/zcrypt: Alias for new zcrypt device driver base module
    s390/kdump: Allow copy_oldmem_page() copy to virtual memory
    s390/kdump: Disable mmap for s390
    s390/bpf,jit: add pkt_type support
    s390/bpf,jit: address randomize and write protect jit code
    s390/bpf,jit: use generic jit dumper
    s390/bpf,jit: call module_free() from any context
    s390/qdio: remove unused variable
    s390/ptrace: PTRACE_TE_ABORT_RAND

    Linus Torvalds
     
  • Miao Xie reported the following issue:

    The filesystem was corrupted after we did a device replace.

    Steps to reproduce:
    # mkfs.btrfs -f -m single -d raid10 ..
    # mount
    # btrfs replace start -rfB 1
    # umount
    # btrfsck

    The reason for the issue is that we changed the write offset by mistake,
    introduced by commit 625f1c8dc.

    We read the data from the source device at first, and then write the
    data into the corresponding place of the new device. In order to
    implement the "-r" option, the source location is remapped using
    btrfs_map_block(). The read takes place on the mapped location, and
    the write needs to take place on the unmapped location. Currently
    the write is using the mapped location, and this commit changes it
    back by undoing the change to the write address that the aforementioned
    commit added by mistake.

    Reported-by: Miao Xie
    Cc: # 3.10+
    Signed-off-by: Stefan Behrens
    Signed-off-by: Josef Bacik

    Stefan Behrens
     
  • If we stop dropping a root for whatever reason we need to add it back to the
    dead root list so that we will re-start the dropping next transaction commit.
    The other case this happens is if we recover a drop because we will add a root
    without adding it to the fs radix tree, so we can leak it's root and commit root
    extent buffer, adding this to the dead root list makes this cleanup happen.
    Thanks,

    Cc: stable@vger.kernel.org
    Reported-by: Alex Lyakas
    Signed-off-by: Josef Bacik

    Josef Bacik
     
  • We aren't setting path->locks[level] when we resume a snapshot deletion which
    means we won't unlock the buffer when we free the path. This causes deadlocks
    if we happen to re-allocate the block before we've evicted the extent buffer
    from cache. Thanks,

    Cc: stable@vger.kernel.org
    Reported-by: Alex Lyakas
    Signed-off-by: Josef Bacik

    Josef Bacik
     
  • Alex pointed out a problem and fix that exists in the drop one snapshot at a
    time patch. If we decide we need to exit for whatever reason (umount for
    example) we will just exit the snapshot dropping without updating the drop
    progress. So the next time we go to resume we will BUG_ON() because we can't
    find the extent we left off at because we never updated it. This patch fixes
    the problem.

    Cc: stable@vger.kernel.org
    Reported-by: Alex Lyakas
    Signed-off-by: Josef Bacik

    Josef Bacik
     

19 Jul, 2013

1 commit

  • Pull driver core patches from Greg KH:
    "Here are some driver core patches for 3.11-rc2. They aren't really
    bugfixes, but a bunch of new helper macros for drivers to properly
    create attribute groups, which drivers and subsystems need to fix up a
    ton of race issues with incorrectly creating sysfs files (binary and
    normal) after userspace has been told that the device is present.

    Also here is the ability to create binary files as attribute groups,
    to solve that race condition, which was impossible to do before this,
    so that's my fault the drivers were broken.

    The majority of the .c changes is indenting and moving code around a
    bit. It affects no existing code, but allows the large backlog of 70+
    patches that I already have created to start flowing into the
    different subtrees, instead of having to live in my driver-core tree,
    causing merge nightmares in linux-next for the next few months.

    These were finalized too late for the -rc1 merge window, which is why
    they were didn't make that pull request, testing and review from
    others didn't happen until a few weeks ago, and then there's the whole
    distraction of the past few days, which prevented these from getting
    to you sooner, sorry about that.

    Oh, and there's a bugfix for the documentation build warning in here
    as well. All of these have been in linux-next this week, with no
    reported problems"

    * tag 'driver-core-3.11-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core:
    driver-core: fix new kernel-doc warning in base/platform.c
    sysfs: use file mode defines from stat.h
    sysfs: add more helper macro's for (bin_)attribute(_groups)
    driver core: add default groups to struct class
    driver core: Introduce device_create_groups
    sysfs: prevent warning when only using binary attributes
    sysfs: add support for binary attributes in groups
    driver core: device.h: add RW and RO attribute macros
    sysfs.h: add BIN_ATTR macro
    sysfs.h: add ATTRIBUTE_GROUPS() macro
    sysfs.h: add __ATTR_RW() macro

    Linus Torvalds
     

18 Jul, 2013

3 commits

  • The kdump mmap patch series (git commit 83086978c63afd7c73e1c) directly
    map the PT_LOADs to memory. On s390 this does not work because the
    copy_from_oldmem() function swaps [0,crashkernel size] with
    [crashkernel base, crashkernel base+crashkernel size]. The swap
    int copy_from_oldmem() was done in order correctly implement /dev/oldmem.

    See: http://marc.info/?l=kexec&m=136940802511603&w=2

    Signed-off-by: Michael Holzheu
    Signed-off-by: Martin Schwidefsky

    Michael Holzheu
     
  • Technically, the Linux client is allowed by the NFSv4 spec to send
    3 word bitmaps as part of an OPEN request. However, this causes the
    current FreeBSD server to return NFS4ERR_ATTRNOTSUPP errors.

    Fix the regression by making the Linux client use a 2 word bitmap unless
    doing NFSv4.2 with labeled NFS.

    Signed-off-by: Trond Myklebust

    Trond Myklebust
     
  • Pull nfsd bugfixes from Bruce Fields:
    "Just three minor bugfixes"

    * 'for-3.11' of git://linux-nfs.org/~bfields/linux:
    svcrdma: underflow issue in decode_write_list()
    nfsd4: fix minorversion support interface
    lockd: protect nlm_blocked access in nlmsvc_retry_blocked

    Linus Torvalds
     

17 Jul, 2013

7 commits


16 Jul, 2013

2 commits

  • If there are no items in the extent status tree, ext4_es_lru_add() is
    a no-op. So it is not sufficient to call ext4_es_lru_add() before we
    try to lookup an entry in the extent status tree. We also need to
    call it at the end of ext4_ext_map_blocks(), after items have been
    added to the extent status tree.

    This could lead to inodes with that have extent status trees but which
    are not in the LRU list, which means they won't get considered for
    eviction by the es_shrinker.

    Signed-off-by: "Theodore Ts'o"
    Cc: Zheng Liu
    Cc: stable@vger.kernel.org

    Theodore Ts'o
     
  • During large unlink operations on files with extents, we can use a lot
    of CPU time. This adds a cond_resched() call when starting to examine
    the next level of a multi-level extent tree. Multi-level extent trees
    are rare in the first place, and this should rarely be executed.

    Signed-off-by: "Theodore Ts'o"

    Theodore Ts'o
     

15 Jul, 2013

5 commits

  • Pull ext4 bugfixes from Ted Ts'o:
    "Various regression and bug fixes for ext4"

    * tag 'ext4_for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/ext4:
    ext4: don't allow ext4_free_blocks() to fail due to ENOMEM
    ext4: fix spelling errors and a comment in extent_status tree
    ext4: rate limit printk in buffer_io_error()
    ext4: don't show usrquota/grpquota twice in /proc/mounts
    ext4: fix warning in ext4_evict_inode()
    ext4: fix ext4_get_group_number()
    ext4: silence warning in ext4_writepages()

    Linus Torvalds
     
  • Some callers of ext4_es_remove_extent() and ext4_es_insert_extent()
    may not be completely robust against ENOMEM failures (or the
    consequences of reflecting ENOMEM back up to userspace may lead to
    xfstest or user application failure).

    To mitigate against this, when trying to insert an entry in the extent
    status tree, try to shrink the inode's extent status tree before
    returning ENOMEM. If there are entries which don't record information
    about extents under delayed allocations, freeing one of them is
    preferable to returning ENOMEM.

    Signed-off-by: "Theodore Ts'o"
    Reviewed-by: Zheng Liu

    Theodore Ts'o
     
  • In ext4_ext_map_blocks(), if we have successfully allocated the data
    blocks, but then run into trouble inserting the extent into the extent
    tree, most likely due to an ENOSPC condition, determine the arguments
    to ext4_free_blocks() in a simpler way which is easier to prove to be
    correct.

    Signed-off-by: "Theodore Ts'o"

    Theodore Ts'o
     
  • Previously ext4_ext_truncate() was ignoring potential error returns
    from ext4_es_remove_extent() and ext4_ext_remove_space(). This can
    lead to the on-diks extent tree and the extent status tree cache
    getting out of sync, which is particuarlly bad, and can lead to file
    system corruption and potential data loss.

    Signed-off-by: "Theodore Ts'o"
    Cc: stable@vger.kernel.org

    Theodore Ts'o
     
  • Pull more vfs stuff from Al Viro:
    "O_TMPFILE ABI changes, Oleg's fput() series, misc cleanups, including
    making simple_lookup() usable for filesystems with non-NULL s_d_op,
    which allows us to get rid of quite a bit of ugliness"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
    sunrpc: now we can just set ->s_d_op
    cgroup: we can use simple_lookup() now
    efivarfs: we can use simple_lookup() now
    make simple_lookup() usable for filesystems that set ->s_d_op
    configfs: don't open-code d_alloc_name()
    __rpc_lookup_create_exclusive: pass string instead of qstr
    rpc_create_*_dir: don't bother with qstr
    llist: llist_add() can use llist_add_batch()
    llist: fix/simplify llist_add() and llist_add_batch()
    fput: turn "list_head delayed_fput_list" into llist_head
    fs/file_table.c:fput(): add comment
    Safer ABI for O_TMPFILE

    Linus Torvalds
     

14 Jul, 2013

2 commits