[patch rfc] towards supporting O_NONBLOCK on regular files

From: Jeff Moyer (jmoyer_at_redhat.com)
Date: 10/01/04

  • Next message: Chris Wright: "Re: [PATCH] Realtime LSM"
    Date:	Fri, 1 Oct 2004 16:57:50 -0400
    To: linux-kernel@vger.kernel.org
    
    

    This patch makes an attempt at supporting the O_NONBLOCK flag for regular
    files. It's pretty straight-forward. One limitation is that we still call
    into the readahead code, which I believe can block. However, if we don't
    do this, then an application which only uses non-blocking reads may never
    get it's data.

    Comments welcome.

    -Jeff

    --- linux-2.6.8/mm/filemap.c.orig 2004-09-30 16:33:46.881129560 -0400
    +++ linux-2.6.8/mm/filemap.c 2004-09-30 16:34:12.109294296 -0400
    @@ -720,7 +720,7 @@ void do_generic_mapping_read(struct addr
             unsigned long index, end_index, offset;
             loff_t isize;
             struct page *cached_page;
    - int error;
    + int error, nonblock = filp->f_flags & O_NONBLOCK;
             struct file_ra_state ra = *_ra;
     
             cached_page = NULL;
    @@ -755,10 +755,20 @@ find_page:
                     page = find_get_page(mapping, index);
                     if (unlikely(page == NULL)) {
                             handle_ra_miss(mapping, &ra, index);
    + if (nonblock) {
    + desc->error = -EWOULDBLOCK;
    + break;
    + }
                             goto no_cached_page;
                     }
    - if (!PageUptodate(page))
    + if (!PageUptodate(page)) {
    + if (nonblock) {
    + page_cache_release(page);
    + desc->error = -EWOULDBLOCK;
    + break;
    + }
                             goto page_not_up_to_date;
    + }
     page_ok:
     
                     /* If users can be writing to this page using arbitrary
    @@ -1004,7 +1014,7 @@ __generic_file_aio_read(struct kiocb *io
                             desc.error = 0;
                             do_generic_file_read(filp,ppos,&desc,file_read_actor);
                             retval += desc.written;
    - if (!retval) {
    + if (!retval || desc.error) {
                                     retval = desc.error;
                                     break;
                             }
    -
    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/


  • Next message: Chris Wright: "Re: [PATCH] Realtime LSM"

    Relevant Pages

    • Re: [patch rfc] towards supporting O_NONBLOCK on regular files
      ... One limitation is that we still call ... > into the readahead code, ... Does it mean that aio and friends are instantly obsolete? ... 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/ ...
      (Linux-Kernel)
    • Re: [patch rfc] towards supporting O_NONBLOCK on regular files
      ... It's pretty straight-forward. ... One limitation is that we ... > still call into the readahead code, ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: ALPS tapping disabled. WHY?
      ... because double taps don't work otherwise (hardware ... > limitation). ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: Random file I/O regressions in 2.6
      ... > readahead code using my user level simulator as well as running some ... > DSS benchmark and iozone benchmark. ... readahead state more than 2.4's. ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: Random file I/O regressions in 2.6
      ... > Looking at it the other way, without readahead code, all requests ... > satisfied through 4k i/os. ... Furthermore even if it is split to 4K block sizes, ... 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/ ...
      (Linux-Kernel)