1. 19 May, 2002 14 commits
    • Andrew Morton's avatar
      [PATCH] i_dirty_buffers locking fix · 43152186
      Andrew Morton authored
      This fixes a race between try_to_free_buffers' call to
      __remove_inode_queue() and other users of b_inode_buffers
      (fsync_inode_buffers and mark_buffer_dirty_inode()).  They are
      presently taking different locks.
      
      The patch relocates and redefines and clarifies(?) the role of
      inode.i_dirty_buffers.
      
      The 2.4 definition of i_dirty_buffers is "a list of random buffers
      which is protected by a kernel-wide lock".  This definition needs to be
      narrowed in the 2.5 context.  It is now
      
      "a list of buffers from a different mapping, protected by a lock within
      that mapping".  This list of buffers is specifically for fsync().
      
      As this is a "data plane" operation, all the structures have been moved
      out of the inode and into the address_space.  So address_space now has:
      
      list_head private_list;
      
           A list, available to the address_space for any purpose.  If
           that address_space chooses to use the helper functions
           mark_buffer_dirty_inode and sync_mapping_buffers() then this list
           will contain buffer_heads, attached via
           buffer_head.b_assoc_buffers.
      
           If the address_space does not call those helper functions
           then the list is free for other usage.  The only requirement is
           that the list be list_empty() at destroy_inode() time.
      
           At least, this is the objective.  At present,
           generic_file_write() will call generic_osync_inode(), which
           expects that list to contain buffer_heads.  So private_list isn't
           useful for anything else yet.
      
      spinlock_t private_lock;
      
           A spinlock, available to the address_space.
      
           If the address_space is using try_to_free_buffers(),
           mark_inode_dirty_buffers() and fsync_inode_buffers() then this
           lock is used to protect the private_list of *other* mappings which
           have listed buffers from *this* mapping onto themselves.
      
           That is: for buffer_heads, mapping_A->private_lock does not
           protect mapping_A->private_list!  It protects the b_assoc_buffers
           list from buffers which are backed by mapping_A and it protects
           mapping_B->private_list, mapping_C->private_list, ...
      
           So what we have here is a cross-mapping association.  S_ISREG
           mappings maintain a list of buffers from the blockdev's
           address_space which they need to know about for a successful
           fsync().  The locking follows the buffers: the lock in in the
           blockdev's mapping, not in the S_ISREG file's mapping.
      
           For address_spaces which use try_to_free_buffers,
           private_lock is also (and quite unrelatedly) used for protection
           of the buffer ring at page->private.  Exclusion between
           try_to_free_buffers(), __get_hash_table() and
           __set_page_dirty_buffers().  This is in fact its major use.
      
      address_space *assoc_mapping
      
          Sigh.  This is the address of the mapping which backs the
          buffers which are attached to private_list.  It's here so that
          generic_osync_inode() can locate the lock which protects this
          mapping's private_list.  Will probably go away.
      
      
      A consequence of all the above is that:
      
          a) All the buffers at a mapping_A's ->private_list must come
             from the same mapping, mapping_B.  There is no requirement that
             mapping_B be a blockdev mapping, but that's how it's used.
      
             There is a BUG() check in mark_buffer_dirty_inode() for this.
      
          b) blockdev mappings never have any buffers on ->private_list.
             It just never happens, and doesn't make a lot of sense.
      
      reiserfs is using b_inode_buffers for attaching dependent buffers to its
      journal and that caused a few problems.  Fixed in reiserfs_releasepage.patch
      43152186
    • Andrew Morton's avatar
      [PATCH] check for dirtying of non-uptodate buffers · 6b9f3b41
      Andrew Morton authored
      - Add a debug check to catch people who are marking non-uptodate
        buffers as dirty.
      
        This is either a source of data corruption, or sloppy programming.
      
      - Fix sloppy programming in ext3 ;)
      6b9f3b41
    • Andrew Morton's avatar
      [PATCH] reduce lock contention in do_pagecache_readahead · cd016d80
      Andrew Morton authored
      Anton Blanchard has a workload (the SDET benchmark) which is showing some
      moderate lock contention in do_pagecache_readahead().
      
      Seems that SDET has many threads performing seeky reads against a
      cached file.  The average number of pagecache probes in a single
      do_pagecache_readahead() is six, which seems reasonable.
      
      The patch (from Anton) flips the locking around to optimise for the
      fast case (page was present).  So the kernel takes the lock less often,
      and does more work once it has been acquired.
      cd016d80
    • Arnaldo Carvalho de Melo's avatar
      - sound/{core,pci}/*.c · f5737b71
      Arnaldo Carvalho de Melo authored
      	- fix copy_{to,from}_user error handling (thanks to Rusty for pointing this out)
      f5737b71
    • Linus Torvalds's avatar
      Merge http://linux-isdn.bkbits.net/linux-2.5.make · a252cfb4
      Linus Torvalds authored
      into home.transmeta.com:/home/torvalds/v2.5/linux
      a252cfb4
    • Kai Germaschewski's avatar
      kbuild: Use $(CURDIR) · 8f3ee280
      Kai Germaschewski authored
      Not a big change, but make provides the current directory,
      so why not use it ;-)
      8f3ee280
    • Kai Germaschewski's avatar
      kbuild: Suppress printing of '$(MAKE) -C command' line · 8202c057
      Kai Germaschewski authored
      Don't print the actual command to call make in a subdir, make will
      print 'Entering directory <foo>' anyway, so we don't lose that
      information.
      8202c057
    • Kai Germaschewski's avatar
      Small fix for net/irda/Makefile · 56de0f3c
      Kai Germaschewski authored
      This Makefile would add irlan/irlan.o to $(obj-m) when selected as
      modular, which is wrong. The module will get compiled just fine after
      descending into that subdirectory anyway (whereas in the current
      directory we have no idea how to build it).
      56de0f3c
    • Kai Germaschewski's avatar
      kbuild: Fix object-specific CFLAGS_foo.o · 18a8b891
      Kai Germaschewski authored
      Make CFLAGS_foo.o work also when generating preprocessed (.i) and
      assembler (.s) files.
        
      Same for AFLAGS_foo.o.
      18a8b891
    • Kai Germaschewski's avatar
      Merge http://linux-isdn.bkbits.net/linux-2.5.make · d852a144
      Kai Germaschewski authored
      into tp1.ruhr-uni-bochum.de:/home/kai/kernel/v2.5/linux-2.5.make
      d852a144
    • Linus Torvalds's avatar
      Merge http://kernel-acme.bkbits.net:8080/usb-copy_tofrom_user-2.5 · e1b37299
      Linus Torvalds authored
      into home.transmeta.com:/home/torvalds/v2.5/linux
      e1b37299
    • Linus Torvalds's avatar
      Merge http://kernel-acme.bkbits.net:8080/isdn-copy_tofrom_user-2.5 · 96f1f1d5
      Linus Torvalds authored
      into home.transmeta.com:/home/torvalds/v2.5/linux
      96f1f1d5
    • Arnaldo Carvalho de Melo's avatar
      drivers/usr/*.c · a465121e
      Arnaldo Carvalho de Melo authored
      	- fix copy_{to,from}_user error handling (thanks to Rusty for pointing this out)
      a465121e
    • Arnaldo Carvalho de Melo's avatar
      drivers/isdn/*.c · 7ccde684
      Arnaldo Carvalho de Melo authored
      	- fix copy_{to,from}_user error handling (thanks to Rusty for pointing this out)
      7ccde684
  2. 18 May, 2002 3 commits
  3. 19 May, 2002 1 commit
  4. 18 May, 2002 21 commits
  5. 17 May, 2002 1 commit