lkml.org 
[lkml]   [2010]   [May]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Date
    SubjectRe: [PATCH v2 3/4]: sendfile: remove flags paramter of do_splice_direct()
    On Fri, May 28, 2010 at 6:06 PM, Changli Gao <xiaosuo@gmail.com> wrote:
    > On Fri, May 28, 2010 at 5:40 PM, Miklos Szeredi <miklos@szeredi.hu> wrote:
    >> On Wed, 26 May 2010, Changli Gao wrote:
    >>> remove flags paramter of do_splice_direct().
    >>>
    >>> the flags parameter of do_splice_direct() doesn't mean non-block read of
    >>> in file,
    >>
    >> Actually, it does.  Look at the SPLICE_F_NONBLOCK usage in
    >> __generic_splice_file_read().
    >>
    >
    > Oh, I checked the code again. You're right. However, why don't we
    > check the flags of in file instead in __generic_file_splice_read()?
    >

    I am afraid that __generic_file_splice_read() should not use SPLICE_F_NONBLOCK.

    Here is the comment from the commit 42324c62704365d6a3e89138dea55909d2f26afe :

    <<EOF
    Linus introduced SPLICE_F_NONBLOCK in commit
    29e350944fdc2dfca102500790d8ad6d6ff4f69d
    (splice: add SPLICE_F_NONBLOCK flag )

    It doesn't make the splice itself necessarily nonblocking (because the
    actual file descriptors that are spliced from/to may block unless they
    have the O_NONBLOCK flag set), but it makes the splice pipe operations
    nonblocking.

    Linus intention was clear : let SPLICE_F_NONBLOCK control the splice
    pipe mode only
    EOF

    And I have greped the whole code:

    fs/splice.c: if (spd->flags & SPLICE_F_NONBLOCK) {
    fs/splice.c: if (flags & SPLICE_F_NONBLOCK) {
    fs/splice.c: if (sd->flags & SPLICE_F_NONBLOCK)
    fs/splice.c: if (flags & SPLICE_F_NONBLOCK) {
    fs/splice.c: if (flags & SPLICE_F_NONBLOCK) {
    fs/splice.c: if (flags & SPLICE_F_NONBLOCK) {
    fs/splice.c: if (!ret && ipipe->waiting_writers && (flags &
    SPLICE_F_NONBLOCK))
    fs/splice.c: * applicable one is SPLICE_F_NONBLOCK.
    include/linux/splice.h:#define SPLICE_F_NONBLOCK (0x02) /* don't block
    on the pipe splicing (but */
    kernel/relay.c: if (flags & SPLICE_F_NONBLOCK)
    kernel/trace/trace.c: if (flags & SPLICE_F_NONBLOCK)

    besides the __generic_file_splice_read(), there are two users: relay
    and trace. I believe they all misuse this flag.

    --
    Regards,
    Changli Gao(xiaosuo@gmail.com)
    --
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2010-05-29 04:01    [W:0.023 / U:0.340 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site