05 Jun, 2016

1 commit

  • Pull Ceph fixes from Sage Weil:
    "We have a few follow-up fixes for the libceph refactor from Ilya, and
    then some cephfs + fscache fixes from Zheng.

    The first two FS-Cache patches are acked by David Howells and deemed
    trivial enough to go through our tree. The rest fix some issues with
    the ceph fscache handling (disable cache for inodes opened for write,
    and simplify the revalidation logic accordingly, dropping the
    now-unnecessary work queue)"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client:
    ceph: use i_version to check validity of fscache
    ceph: improve fscache revalidation
    ceph: disable fscache when inode is opened for write
    ceph: avoid unnecessary fscache invalidation/revlidation
    ceph: call __fscache_uncache_page() if readpages fails
    FS-Cache: make check_consistency callback return int
    FS-Cache: wake write waiter after invalidating writes
    libceph: use %s instead of %pE in dout()s
    libceph: put request only if it's done in handle_reply()
    libceph: change ceph_osdmap_flag() to take osdc

    Linus Torvalds
     

01 Jun, 2016

6 commits

  • Pull networking fixes from David Miller:

    1) Fix negative error code usage in ATM layer, from Stefan Hajnoczi.

    2) If CONFIG_SYSCTL is disabled, the default TTL is not initialized
    properly. From Ezequiel Garcia.

    3) Missing spinlock init in mvneta driver, from Gregory CLEMENT.

    4) Missing unlocks in hwmb error paths, also from Gregory CLEMENT.

    5) Fix deadlock on team->lock when propagating features, from Ivan
    Vecera.

    6) Work around buffer offset hw bug in alx chips, from Feng Tang.

    7) Fix double listing of SCTP entries in sctp_diag dumps, from Xin
    Long.

    8) Various statistics bug fixes in mlx4 from Eric Dumazet.

    9) Fix some randconfig build errors wrt fou ipv6 from Arnd Bergmann.

    10) All of l2tp was namespace aware, but the ipv6 support code was not
    doing so. From Shmulik Ladkani.

    11) Handle on-stack hrtimers properly in pktgen, from Guenter Roeck.

    12) Propagate MAC changes properly through VLAN devices, from Mike
    Manning.

    13) Fix memory leak in bnx2x_init_one(), from Vitaly Kuznetsov.

    * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (62 commits)
    sfc: Track RPS flow IDs per channel instead of per function
    usbnet: smsc95xx: fix link detection for disabled autonegotiation
    virtio_net: fix virtnet_open and virtnet_probe competing for try_fill_recv
    bnx2x: avoid leaking memory on bnx2x_init_one() failures
    fou: fix IPv6 Kconfig options
    openvswitch: update checksum in {push,pop}_mpls
    sctp: sctp_diag should dump sctp socket type
    net: fec: update dirty_tx even if no skb
    vlan: Propagate MAC address to VLANs
    atm: iphase: off by one in rx_pkt()
    atm: firestream: add more reserved strings
    vxlan: Accept user specified MTU value when create new vxlan link
    net: pktgen: Call destroy_hrtimer_on_stack()
    timer: Export destroy_hrtimer_on_stack()
    net: l2tp: Make l2tp_ip6 namespace aware
    Documentation: ip-sysctl.txt: clarify secure_redirects
    sfc: use flow dissector helpers for aRFS
    ieee802154: fix logic error in ieee802154_llsec_parse_dev_addr
    net: nps_enet: Disable interrupts before napi reschedule
    net/lapb: tuse %*ph to dump buffers
    ...

    Linus Torvalds
     
  • The Kconfig options I added to work around broken compilation ended
    up screwing up things more, as I used the wrong symbol to control
    compilation of the file, resulting in IPv6 fou support to never be built
    into the kernel.

    Changing CONFIG_NET_FOU_IPV6_TUNNELS to CONFIG_IPV6_FOU fixes that
    problem, I had renamed the symbol in one location but not the other,
    and as the file is never being used by other kernel code, this did not
    lead to a build failure that I would have caught.

    After that fix, another issue with the same patch becomes obvious, as we
    'select INET6_TUNNEL', which is related to IPV6_TUNNEL, but not the same,
    and this can still cause the original build failure when IPV6_TUNNEL is
    not built-in but IPV6_FOU is. The fix is equally trivial, we just need
    to select the right symbol.

    I have successfully build 350 randconfig kernels with this patch
    and verified that the driver is now being built.

    Signed-off-by: Arnd Bergmann
    Reported-by: Valentin Rothberg
    Fixes: fabb13db448e ("fou: add Kconfig options for IPv6 support")
    Signed-off-by: David S. Miller

    Arnd Bergmann
     
  • In the case of CHECKSUM_COMPLETE the skb checksum should be updated in
    {push,pop}_mpls() as they the type in the ethernet header.

    As suggested by Pravin Shelar.

    Cc: Pravin Shelar
    Fixes: 25cd9ba0abc0 ("openvswitch: Add basic MPLS support to kernel")
    Signed-off-by: Simon Horman
    Acked-by: Pravin B Shelar
    Signed-off-by: David S. Miller

    Simon Horman
     
  • Now we cannot distinguish that one sk is a udp or sctp style when
    we use ss to dump sctp_info. it's necessary to dump it as well.

    For sctp_diag, ss support is not officially available, thus there
    are no official users of this yet, so we can add this field in the
    middle of sctp_info without breaking user API.

    v1->v2:
    - move 'sctpi_s_type' field to the end of struct sctp_info, so
    that it won't cause incompatibility with applications already
    built.
    - add __reserved3 in sctp_info to make sure sctp_info is 8-byte
    alignment.

    Signed-off-by: Xin Long
    Acked-by: Marcelo Ricardo Leitner
    Acked-by: Neil Horman
    Signed-off-by: David S. Miller

    Xin Long
     
  • The MAC address of the physical interface is only copied to the VLAN
    when it is first created, resulting in an inconsistency after MAC
    address changes of only newly created VLANs having an up-to-date MAC.

    The VLANs should continue inheriting the MAC address of the physical
    interface until the VLAN MAC address is explicitly set to any value.
    This allows IPv6 EUI64 addresses for the VLAN to reflect any changes
    to the MAC of the physical interface and thus for DAD to behave as
    expected.

    Signed-off-by: Mike Manning
    Signed-off-by: David S. Miller

    Mike Manning
     
  • If CONFIG_DEBUG_OBJECTS_TIMERS=y, hrtimer_init_on_stack() requires
    a matching call to destroy_hrtimer_on_stack() to clean up timer
    debug objects.

    Signed-off-by: Guenter Roeck
    Signed-off-by: David S. Miller

    Guenter Roeck
     

31 May, 2016

3 commits

  • Commit d30291b985d1 ("libceph: variable-sized ceph_object_id") changed
    dout()s in what is now encode_request() and ceph_object_locator_to_pg()
    to use %pE, mostly to document that, although all rbd and cephfs object
    names are NULL-terminated strings, ceph_object_id will handle any RADOS
    object name, including the one containing NULs, just fine.

    However, it turns out that vbin_printf() can't handle anything but ints
    and %s - all %p suffixes are ignored. The buffer %p** points to isn't
    recorded, resulting in trash in the messages if the buffer had been
    reused by the time bstr_printf() got to it.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • handle_reply() may be called twice on the same request: on ack and then
    on commit. This occurs on btrfs-formatted OSDs or if cephfs sync write
    path is triggered - CEPH_OSD_FLAG_ACK | CEPH_OSD_FLAG_ONDISK.

    handle_reply() handles this with the help of done_request().

    Fixes: 5aea3dcd5021 ("libceph: a major OSD client update")
    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • For the benefit of every single caller, take osdc instead of map.
    Also, now that osdc->osdmap can't ever be NULL, drop the check.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     

30 May, 2016

4 commits

  • l2tp_ip6 tunnel and session lookups were still using init_net, although
    the l2tp core infrastructure already supports lookups keyed by 'net'.

    As a result, l2tp_ip6_recv discarded packets for tunnels/sessions
    created in namespaces other than the init_net.

    Fix, by using dev_net(skb->dev) or sock_net(sk) where appropriate.

    Signed-off-by: Shmulik Ladkani
    Signed-off-by: David S. Miller

    Shmulik Ladkani
     
  • Fix a logic error to avoid potential null pointer dereference.

    Signed-off-by: Baozeng Ding
    Reviewed-by: Stefan Schmidt
    Signed-off-by: David S. Miller

    Baozeng Ding
     
  • Use %*ph specifier to dump small buffers in hex format instead doing this
    byte-by-byte.

    Signed-off-by: Andy Shevchenko
    Signed-off-by: David S. Miller

    Andy Shevchenko
     
  • A previous patch added the fou6.ko module, but that failed to link
    in a couple of configurations:

    net/built-in.o: In function `ip6_tnl_encap_add_fou_ops':
    net/ipv6/fou6.c:88: undefined reference to `ip6_tnl_encap_add_ops'
    net/ipv6/fou6.c:94: undefined reference to `ip6_tnl_encap_add_ops'
    net/ipv6/fou6.c:97: undefined reference to `ip6_tnl_encap_del_ops'
    net/built-in.o: In function `ip6_tnl_encap_del_fou_ops':
    net/ipv6/fou6.c:106: undefined reference to `ip6_tnl_encap_del_ops'
    net/ipv6/fou6.c:107: undefined reference to `ip6_tnl_encap_del_ops'

    If CONFIG_IPV6=m, ip6_tnl_encap_add_ops/ip6_tnl_encap_del_ops
    are in a module, but fou6.c can still be built-in, and that
    obviously fails to link.

    Also, if CONFIG_IPV6=y, but CONFIG_IPV6_TUNNEL=m or
    CONFIG_IPV6_TUNNEL=n, the same problem happens for a different
    reason.

    This adds two new silent Kconfig symbols to work around both
    problems:

    - CONFIG_IPV6_FOU is now always set to 'm' if either CONFIG_NET_FOU=m
    or CONFIG_IPV6=m
    - CONFIG_IPV6_FOU_TUNNEL is set implicitly when IPV6_FOU is enabled
    and NET_FOU_IP_TUNNELS is also turned out, and it will ensure
    that CONFIG_IPV6_TUNNEL is also available.

    The options could be made user-visible as well, to give additional
    room for configuration, but it seems easier not to bother users
    with more choice here.

    Signed-off-by: Arnd Bergmann
    Fixes: aa3463d65e7b ("fou: Add encap ops for IPv6 tunnels")
    Signed-off-by: David S. Miller

    Arnd Bergmann
     

28 May, 2016

1 commit

  • Most users of IS_ERR_VALUE() in the kernel are wrong, as they
    pass an 'int' into a function that takes an 'unsigned long'
    argument. This happens to work because the type is sign-extended
    on 64-bit architectures before it gets converted into an
    unsigned type.

    However, anything that passes an 'unsigned short' or 'unsigned int'
    argument into IS_ERR_VALUE() is guaranteed to be broken, as are
    8-bit integers and types that are wider than 'unsigned long'.

    Andrzej Hajda has already fixed a lot of the worst abusers that
    were causing actual bugs, but it would be nice to prevent any
    users that are not passing 'unsigned long' arguments.

    This patch changes all users of IS_ERR_VALUE() that I could find
    on 32-bit ARM randconfig builds and x86 allmodconfig. For the
    moment, this doesn't change the definition of IS_ERR_VALUE()
    because there are probably still architecture specific users
    elsewhere.

    Almost all the warnings I got are for files that are better off
    using 'if (err)' or 'if (err < 0)'.
    The only legitimate user I could find that we get a warning for
    is the (32-bit only) freescale fman driver, so I did not remove
    the IS_ERR_VALUE() there but changed the type to 'unsigned long'.
    For 9pfs, I just worked around one user whose calling conventions
    are so obscure that I did not dare change the behavior.

    I was using this definition for testing:

    #define IS_ERR_VALUE(x) ((unsigned long*)NULL == (typeof (x)*)NULL && \
    unlikely((unsigned long long)(x) >= (unsigned long long)(typeof(x))-MAX_ERRNO))

    which ends up making all 16-bit or wider types work correctly with
    the most plausible interpretation of what IS_ERR_VALUE() was supposed
    to return according to its users, but also causes a compile-time
    warning for any users that do not pass an 'unsigned long' argument.

    I suggested this approach earlier this year, but back then we ended
    up deciding to just fix the users that are obviously broken. After
    the initial warning that caused me to get involved in the discussion
    (fs/gfs2/dir.c) showed up again in the mainline kernel, Linus
    asked me to send the whole thing again.

    [ Updated the 9p parts as per Al Viro - Linus ]

    Signed-off-by: Arnd Bergmann
    Cc: Andrzej Hajda
    Cc: Andrew Morton
    Link: https://lkml.org/lkml/2016/1/7/363
    Link: https://lkml.org/lkml/2016/5/27/486
    Acked-by: Srinivas Kandagatla # For nvmem part
    Signed-off-by: Linus Torvalds

    Arnd Bergmann
     

27 May, 2016

2 commits

  • Pull Ceph updates from Sage Weil:
    "This changeset has a few main parts:

    - Ilya has finished a huge refactoring effort to sync up the
    client-side logic in libceph with the user-space client code, which
    has evolved significantly over the last couple years, with lots of
    additional behaviors (e.g., how requests are handled when cluster
    is full and transitions from full to non-full).

    This structure of the code is more closely aligned with userspace
    now such that it will be much easier to maintain going forward when
    behavior changes take place. There are some locking improvements
    bundled in as well.

    - Zheng adds multi-filesystem support (multiple namespaces within the
    same Ceph cluster)

    - Zheng has changed the readdir offsets and directory enumeration so
    that dentry offsets are hash-based and therefore stable across
    directory fragmentation events on the MDS.

    - Zheng has a smorgasbord of bug fixes across fs/ceph"

    * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (71 commits)
    ceph: fix wake_up_session_cb()
    ceph: don't use truncate_pagecache() to invalidate read cache
    ceph: SetPageError() for writeback pages if writepages fails
    ceph: handle interrupted ceph_writepage()
    ceph: make ceph_update_writeable_page() uninterruptible
    libceph: make ceph_osdc_wait_request() uninterruptible
    ceph: handle -EAGAIN returned by ceph_update_writeable_page()
    ceph: make fault/page_mkwrite return VM_FAULT_OOM for -ENOMEM
    ceph: block non-fatal signals for fault/page_mkwrite
    ceph: make logical calculation functions return bool
    ceph: tolerate bad i_size for symlink inode
    ceph: improve fragtree change detection
    ceph: keep leaf frag when updating fragtree
    ceph: fix dir_auth check in ceph_fill_dirfrag()
    ceph: don't assume frag tree splits in mds reply are sorted
    ceph: fix inode reference leak
    ceph: using hash value to compose dentry offset
    ceph: don't forbid marking directory complete after forward seek
    ceph: record 'offset' for each entry of readdir result
    ceph: define 'end/complete' in readdir reply as bit flags
    ...

    Linus Torvalds
     
  • Pull NFS client updates from Anna Schumaker:
    "Highlights include:

    Features:
    - Add support for the NFS v4.2 COPY operation
    - Add support for NFS/RDMA over IPv6

    Bugfixes and cleanups:
    - Avoid race that crashes nfs_init_commit()
    - Fix oops in callback path
    - Fix LOCK/OPEN race when unlinking an open file
    - Choose correct stateids when using delegations in setattr, read and
    write
    - Don't send empty SETATTR after OPEN_CREATE
    - xprtrdma: Prevent server from writing a reply into memory client
    has released
    - xprtrdma: Support using Read list and Reply chunk in one RPC call"

    * tag 'nfs-for-4.7-1' of git://git.linux-nfs.org/projects/anna/linux-nfs: (61 commits)
    pnfs: pnfs_update_layout needs to consider if strict iomode checking is on
    nfs/flexfiles: Use the layout segment for reading unless it a IOMODE_RW and reading is disabled
    nfs/flexfiles: Helper function to detect FF_FLAGS_NO_READ_IO
    nfs: avoid race that crashes nfs_init_commit
    NFS: checking for NULL instead of IS_ERR() in nfs_commit_file()
    pnfs: make pnfs_layout_process more robust
    pnfs: rework LAYOUTGET retry handling
    pnfs: lift retry logic from send_layoutget to pnfs_update_layout
    pnfs: fix bad error handling in send_layoutget
    flexfiles: add kerneldoc header to nfs4_ff_layout_prepare_ds
    flexfiles: remove pointless setting of NFS_LAYOUT_RETURN_REQUESTED
    pnfs: only tear down lsegs that precede seqid in LAYOUTRETURN args
    pnfs: keep track of the return sequence number in pnfs_layout_hdr
    pnfs: record sequence in pnfs_layout_segment when it's created
    pnfs: don't merge new ff lsegs with ones that have LAYOUTRETURN bit set
    pNFS/flexfiles: When initing reads or writes, we might have to retry connecting to DSes
    pNFS/flexfiles: When checking for available DSes, conditionally check for MDS io
    pNFS/flexfile: Fix erroneous fall back to read/write through the MDS
    NFS: Reclaim writes via writepage are opportunistic
    NFSv4: Use the right stateid for delegations in setattr, read and write
    ...

    Linus Torvalds
     

26 May, 2016

23 commits

  • We have this situation: that EP hash table, contains only the EPs
    that are listening, while the transports one, has the opposite.
    We have to traverse both to dump all.

    But when we traverse the transports one we will also get EPs that are
    in the EP hash if they are listening. In this case, the EP is dumped
    twice.

    We will fix it by checking if the endpoint that is in the endpoint
    hash table contains any ep->asoc in there, as it means we will also
    find it via transport hash, and thus we can/should skip it, depending
    on the filters used, like 'ss -l'.

    Still, we should NOT skip it if the user is listing only listening
    endpoints, because then we are not traversing the transport hash.
    so we have to check idiag_states there also.

    Signed-off-by: Xin Long
    Acked-by: Marcelo Ricardo Leitner
    Signed-off-by: David S. Miller

    Xin Long
     
  • Ceph_osdc_wait_request() is used when cephfs issues sync IO. In most
    cases, the sync IO should be uninterruptible. The fix is use killale
    wait function in ceph_osdc_wait_request().

    Signed-off-by: Yan, Zheng

    Yan, Zheng
     
  • This patch makes serverl logical caculation functions return bool to
    improve readability due to these particular functions only using 0/1
    as their return value.

    No functional change.

    Signed-off-by: Zhang Zhuoyu

    Zhang Zhuoyu
     
  • Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • ... with a wrapper around maybe_request_map() - no need for two
    osdmap-specific functions.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • There is now about a dozen CEPH_OSDMAP_* flags. This is a debugging
    interface, so just dump in hex instead of spelling each flag out.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • This adds the "map check" infrastructure for sending osdmap version
    checks on CALC_TARGET_POOL_DNE and completing in-flight requests with
    -ENOENT if the target pool doesn't exist or has just been deleted.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • For map check, we are going to need to send CEPH_MSG_MON_GET_VERSION
    messages asynchronously and get a callback on completion. Refactor MON
    client to allow firing off generic requests asynchronously and add an
    async variant of ceph_monc_get_version(). ceph_monc_do_statfs() is
    switched over and remains sync.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • Implement ceph_osdc_watch_check() to be able to check on status of
    watch. Note that the time it takes for a watch/notify event to get
    delivered through the notify_wq is taken into account.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • Implement ceph_osdc_notify() for sending notifies.

    Due to the fact that the current messenger can't do read-in into
    pagelists (it can only do write-out from them), I had to go with a page
    vector for a NOTIFY_COMPLETE payload, for now.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • This adds support and switches rbd to a new, more reliable version of
    watch/notify protocol. As with the OSD client update, this is mostly
    about getting the right structures linked into the right places so that
    reconnects are properly sent when needed. watch/notify v2 also
    requires sending regular pings to the OSDs - send_linger_ping().

    A major change from the old watch/notify implementation is the
    introduction of ceph_osd_linger_request - linger requests no longer
    piggy back on ceph_osd_request. ceph_osd_event has been merged into
    ceph_osd_linger_request.

    All the details are now hidden within libceph, the interface consists
    of a simple pair of watch/unwatch functions and ceph_osdc_notify_ack().
    ceph_osdc_watch() does return ceph_osd_linger_request, but only to keep
    the lifetime management simple.

    ceph_osdc_notify_ack() accepts an optional data payload, which is
    relayed back to the notifier.

    Portions of this patch are loosely based on work by Douglas Fuller
    and Mike Christie .

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • The unwatch timeout is currently implemented in rbd. With
    watch/unwatch code moving into libceph, we are going to need
    a ceph_osdc_wait_request() variant with a timeout.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • These are going to be used by request_reinit() code.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • This is a major sync up, up to ~Jewel. The highlights are:

    - per-session request trees (vs a global per-client tree)
    - per-session locking (vs a global per-client rwlock)
    - homeless OSD session
    - no ad-hoc global per-client lists
    - support for pool quotas
    - foundation for watch/notify v2 support
    - foundation for map check (pool deletion detection) support

    The switchover is incomplete: lingering requests can be setup and
    teared down but aren't ever reestablished. This functionality is
    restored with the introduction of the new lingering infrastructure
    (ceph_osd_linger_request, linger_work, etc) in a later commit.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • OSD client is getting moved from the big per-client lock to a set of
    per-session locks. The big rwlock would only be held for read most of
    the time, so a global osdc->osd_lru needs additional protection.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • create_osd() is called way too deep in the stack to be able to error
    out in a sane way; a failing create_osd() just messes everything up.
    The current req_notarget list solution is broken - the list is never
    traversed as it's not entirely clear when to do it, I guess.

    If we were to start traversing it at regular intervals and retrying
    each request, we wouldn't be far off from what __GFP_NOFAIL is doing,
    so allocate OSD sessions with __GFP_NOFAIL, at least until we come up
    with a better fix.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • These are going to be used by homeless OSD sessions code.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • Separate osdmap handling from decoding and iterating over a bag of maps
    in a fresh MOSDMap message. This sets up the scene for the updated OSD
    client.

    Of particular importance here is the addition of pi->was_full, which
    can be used to answer "did this pool go full -> not-full in this map?".
    This is the key bit for supporting pool quotas.

    We won't be able to downgrade map_sem for much longer, so drop
    downgrade_write().

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • This leads to a simpler osdmap handling code, particularly when dealing
    with pi->was_full, which is introduced in a later commit.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • Both homeless OSD sessions and watch/notify v2, introduced in later
    commits, require periodic ticks which don't depend on ->num_requests.
    Schedule the initial tick from ceph_osdc_init() and reschedule from
    handle_timeout() unconditionally.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • ceph_osdc_stop() isn't called if ceph_osdc_init() fails, so we end up
    with handle_osds_timeout() running on invalid memory if any one of the
    allocations fails. Call schedule_delayed_work() after everything is
    setup, just before returning.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • If you specify ACK | ONDISK and set ->r_unsafe_callback, both
    ->r_callback and ->r_unsafe_callback(true) are called on ack. This is
    very confusing. Redo this so that only one of them is called:

    ->r_unsafe_callback(true), on ack
    ->r_unsafe_callback(false), on commit

    or

    ->r_callback, on ack|commit

    Decode everything in decode_MOSDOpReply() to reduce clutter.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov
     
  • finish_read(), its only user, uses it to get to hdr.data_len, which is
    what ->r_result is set to on success. This gains us the ability to
    safely call callbacks from contexts other than reply, e.g. map check.

    Signed-off-by: Ilya Dryomov

    Ilya Dryomov