Re: [PATCH] ext2_readdir() filp->f_pos fix

From: Jan Blunck (j.blunck_at_tu-harburg.de)
Date: 07/30/04

  • Next message: Pete Zaitcev: "drivers/block/ub.c #6"
    Date:	Fri, 30 Jul 2004 12:49:47 +0200
    To: Andrew Morton <akpm@osdl.org>
    
    
    

    Andrew Morton wrote:
    > Interesting. How did you actually notice this? Is the same problem not present
    > in 2.4?

    I noticed this problem because I'm "abusing" the f_pos in a VFS based
    implementation of something like union-mount. There are already some
    things done but I still need time until its ready for being posted
    here.
    Didn't checked that for 2.4 cause I'm only working on 2.6 at the moment.

    > If the IS_ERR(page) returns true, should we not advance f_pos to skip this
    > page?

    Ok. I changed that in the attached patch. So when there is a bad page it
    is possible that the f_pos points somewhere to the beginning of the next
    page which might be out of range of the i_size. But I think that is ok
    for a error condition.

    
    

     dir.c | 11 ++++++++---
     1 files changed, 8 insertions(+), 3 deletions(-)

    --- 1.24/fs/ext2/dir.c 2004-07-29 21:25:31 +02:00
    +++ 1.26/fs/ext2/dir.c 2004-07-30 11:54:27 +02:00
    @@ -251,7 +251,7 @@
             loff_t pos = filp->f_pos;
             struct inode *inode = filp->f_dentry->d_inode;
             struct super_block *sb = inode->i_sb;
    - unsigned offset = pos & ~PAGE_CACHE_MASK;
    + unsigned int offset = pos & ~PAGE_CACHE_MASK;
             unsigned long n = pos >> PAGE_CACHE_SHIFT;
             unsigned long npages = dir_pages(inode);
             unsigned chunk_mask = ~(ext2_chunk_size(inode)-1);
    @@ -270,8 +270,13 @@
                     ext2_dirent *de;
                     struct page *page = ext2_get_page(inode, n);
     
    - if (IS_ERR(page))
    + if (IS_ERR(page)) {
    + ext2_error(sb, __FUNCTION__,
    + "bad page in #%lu",
    + inode->i_ino);
    + filp->f_pos += PAGE_CACHE_SIZE - offset;
                             continue;
    + }
                     kaddr = page_address(page);
                     if (need_revalidate) {
                             offset = ext2_validate_entry(kaddr, offset, chunk_mask);
    @@ -303,6 +308,7 @@
                                             goto success;
                                     }
                             }
    + filp->f_pos += le16_to_cpu(de->rec_len);
                     }
                     ext2_put_page(page);
             }
    @@ -310,7 +316,6 @@
     success:
             ret = 0;
     done:
    - filp->f_pos = (n << PAGE_CACHE_SHIFT) | offset;
             filp->f_version = inode->i_version;
             return ret;
     }

    -
    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: Pete Zaitcev: "drivers/block/ub.c #6"

    Relevant Pages

    • Re: 2.6.0-test3 cannot mount root fs
      ... On Son, 10 Aug 2003, Andrew Morton wrote: ... Still no success. ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: Timer allocates too many ports
      ... | Linus' kernel I need to have this changed. ... (Andrew Morton). ... but that's up to Andrew and/or Linus. ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: [Patch] invalidate range of pages after direct IO write
      ... > Andrew Morton wrote: ... >> I'd be inclined to hold off on the macro until we actually get the ... > function pointer from the caller will turn people's stomachs. ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • Re: System state too high for too long...
      ... On Tuesday 07 June 2005 23:13, Andrew Morton wrote: ... Switched to vanilla-sources 2.6.12-rc6 just to rule out ... > (with hdparm) ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)
    • [git patches] 2.6.x libata updates
      ... Alan Cox: ... Andrew Morton: ... Jeff Garzik: ... send the line "unsubscribe linux-kernel" in ...
      (Linux-Kernel)