1. 23 5月, 2009 1 次提交
  2. 22 5月, 2009 2 次提交
  3. 19 5月, 2009 4 次提交
    • J
      cifs: fix pointer initialization and checks in cifs_follow_symlink (try #4) · 8b6427a2
      Jeff Layton 提交于
      This is the third respin of the patch posted yesterday to fix the error
      handling in cifs_follow_symlink. It also includes a fix for a bogus NULL
      pointer check in CIFSSMBQueryUnixSymLink that Jeff Moyer spotted.
      
      It's possible for CIFSSMBQueryUnixSymLink to return without setting
      target_path to a valid pointer. If that happens then the current value
      to which we're initializing this pointer could cause an oops when it's
      kfree'd.
      
      This patch is a little more comprehensive than the last patches. It
      reorganizes cifs_follow_link a bit for (hopefully) better readability.
      It should also eliminate the uneeded allocation of full_path on servers
      without unix extensions (assuming they can get to this point anyway, of
      which I'm not convinced).
      
      On a side note, I'm not sure I agree with the logic of enabling this
      query even when unix extensions are disabled on the client. It seems
      like that should disable this as well. But, changing that is outside the
      scope of this fix, so I've left it alone for now.
      Reported-by: NJeff Moyer <jmoyer@redhat.com>
      Signed-off-by: NJeff Layton <jlayton@redhat.com>
      Reviewed-by: NJeff Moyer <jmoyer@redhat.com>
      Reviewed-by: NChristoph Hellwig <hch@inraded.com>
      Signed-off-by: NSteve French <sfrench@us.ibm.com>
      8b6427a2
    • M
      splice: fix kmaps in default_file_splice_write() · b2858d7d
      Miklos Szeredi 提交于
      Unfortunately multiple kmap() within a single thread are deadlockable,
      so writing out multiple buffers with writev() isn't possible.
      
      Change the implementation so that it does a separate write() for each
      buffer.  This actually simplifies the code a lot since the
      splice_from_pipe() helper can be used.
      
      This limitation is caused by HIGHMEM pages, and so only affects a
      subset of architectures and configurations.  In the future it may be
      worth to implement default_file_splice_write() in a more efficient way
      on configs that allow it.
      Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      b2858d7d
    • T
      bio: always copy back data for copied kernel requests · 4fc981ef
      Tejun Heo 提交于
      When a read bio_copy_kern() request fails, the content of the bounce
      buffer is not copied back.  However, as request failure doesn't
      necessarily mean complete failure, the buffer state can be useful.
      This behavior is also inconsistent with the user map counterpart and
      causes the subtle difference between bounced and unbounced IO causes
      confusion.
      
      This patch makes bio_copy_kern_endio() ignore @err and always copy
      back data on request completion.
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: Boaz Harrosh <bharrosh@panasas.com>
      Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      4fc981ef
    • F
      nfs: Fix NFS v4 client handling of MAY_EXEC in nfs_permission. · 7ee2cb7f
      Frank Filz 提交于
      The problem is that permission checking is skipped if atomic open is
      possible, but when exec opens a file, it just opens it O_READONLY which
      means EXEC permission will not be checked at that time.
      
      This problem is observed by the following sequence (executed as root):
      
        mount -t nfs4 server:/ /mnt4
        echo "ls" >/mnt4/foo
        chmod 744 /mnt4/foo
        su guest -c "mnt4/foo"
      Signed-off-by: NFrank Filz <ffilzlnx@us.ibm.com>
      Signed-off-by: NTrond Myklebust <Trond.Myklebust@netapp.com>
      Cc: stable@kernel.org
      Tested-by: NEugene Teo <eugeneteo@kernel.sg>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7ee2cb7f
  4. 18 5月, 2009 3 次提交
  5. 15 5月, 2009 9 次提交
  6. 14 5月, 2009 2 次提交
  7. 13 5月, 2009 7 次提交
  8. 14 5月, 2009 1 次提交
  9. 12 5月, 2009 3 次提交
  10. 11 5月, 2009 6 次提交
    • M
      splice: implement default splice_write method · 0b0a47f5
      Miklos Szeredi 提交于
      If f_op->splice_write() is not implemented, fall back to a plain write.
      Use vfs_writev() to write from the pipe buffers.
      
      This will allow splice on all filesystems and file types.  This
      includes "direct_io" files in fuse which bypass the page cache.
      Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      0b0a47f5
    • M
      splice: implement default splice_read method · 6818173b
      Miklos Szeredi 提交于
      If f_op->splice_read() is not implemented, fall back to a plain read.
      Use vfs_readv() to read into previously allocated pages.
      
      This will allow splice and functions using splice, such as the loop
      device, to work on all filesystems.  This includes "direct_io" files
      in fuse which bypass the page cache.
      Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      6818173b
    • M
      splice: implement pipe to pipe splicing · 7c77f0b3
      Miklos Szeredi 提交于
      Allow splice(2) to work when both the input and the output is a pipe.
      
      Based on the impementation of the tee(2) syscall, but instead of
      duplicating the buffer references move the buffers from the input pipe
      to the output pipe.
      
      Moving the whole buffer only succeeds if the full length of the buffer
      is spliced.  Otherwise duplicate the buffer, just like tee(2), set the
      length of the output buffer and advance the offset on the input
      buffer.
      
      Since splice is operating on two pipes, special care needs to be taken
      with locking to prevent AN ABBA deadlock.  Again this is done
      similarly to the tee(2) syscall, first preparing the input and output
      pipes so there's data to consume and space for that data, and then
      doing the move operation while holding both locks.
      
      If other processes are doing I/O on the same pipes parallel to the
      splice, then by the time both inodes are locked there might be no
      buffers left to move, or no space to move them to.  In this case retry
      the whole operation, including the preparation phase.  This could lead
      to starvation, but I'm not sure if that's serious enough to worry
      about.
      Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      7c77f0b3
    • T
      block: add rq->resid_len · c3a4d78c
      Tejun Heo 提交于
      rq->data_len served two purposes - the length of data buffer on issue
      and the residual count on completion.  This duality creates some
      headaches.
      
      First of all, block layer and low level drivers can't really determine
      what rq->data_len contains while a request is executing.  It could be
      the total request length or it coulde be anything else one of the
      lower layers is using to keep track of residual count.  This
      complicates things because blk_rq_bytes() and thus
      [__]blk_end_request_all() relies on rq->data_len for PC commands.
      Drivers which want to report residual count should first cache the
      total request length, update rq->data_len and then complete the
      request with the cached data length.
      
      Secondly, it makes requests default to reporting full residual count,
      ie. reporting that no data transfer occurred.  The residual count is
      an exception not the norm; however, the driver should clear
      rq->data_len to zero to signify the normal cases while leaving it
      alone means no data transfer occurred at all.  This reverse default
      behavior complicates code unnecessarily and renders block PC on some
      drivers (ide-tape/floppy) unuseable.
      
      This patch adds rq->resid_len which is used only for residual count.
      
      While at it, remove now unnecessasry blk_rq_bytes() caching in
      ide_pc_intr() as rq->data_len is not changed anymore.
      
      Boaz	: spotted missing conversion in osd
      Sergei	: spotted too early conversion to blk_rq_bytes() in ide-tape
      
      [ Impact: cleanup residual count handling, report 0 resid by default ]
      Signed-off-by: NTejun Heo <tj@kernel.org>
      Cc: James Bottomley <James.Bottomley@HansenPartnership.com>
      Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
      Cc: Borislav Petkov <petkovbb@googlemail.com>
      Cc: Sergei Shtylyov <sshtylyov@ru.mvista.com>
      Cc: Mike Miller <mike.miller@hp.com>
      Cc: Eric Moore <Eric.Moore@lsi.com>
      Cc: Alan Stern <stern@rowland.harvard.edu>
      Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
      Cc: Doug Gilbert <dgilbert@interlog.com>
      Cc: Mike Miller <mike.miller@hp.com>
      Cc: Eric Moore <Eric.Moore@lsi.com>
      Cc: Darrick J. Wong <djwong@us.ibm.com>
      Cc: Pete Zaitcev <zaitcev@redhat.com>
      Cc: Boaz Harrosh <bharrosh@panasas.com>
      Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
      c3a4d78c
    • R
      nilfs2: fix lock order reversal in nilfs_clean_segments ioctl · 4f6b8288
      Ryusuke Konishi 提交于
      This is a companion patch to ("nilfs2: fix possible circular locking
      for get information ioctls").
      
      This corrects lock order reversal between mm->mmap_sem and
      nilfs->ns_segctor_sem in nilfs_clean_segments() which was detected by
      lockdep check:
      
       =======================================================
       [ INFO: possible circular locking dependency detected ]
       2.6.30-rc3-nilfs-00003-g360bdc1 #7
       -------------------------------------------------------
       mmap/5294 is trying to acquire lock:
        (&nilfs->ns_segctor_sem){++++.+}, at: [<d0d0e846>] nilfs_transaction_begin+0xb6/0x10c [nilfs2]
      
       but task is already holding lock:
        (&mm->mmap_sem){++++++}, at: [<c043700a>] do_page_fault+0x1d8/0x30a
      
       which lock already depends on the new lock.
      
       the existing dependency chain (in reverse order) is:
      
       -> #1 (&mm->mmap_sem){++++++}:
              [<c01470a5>] __lock_acquire+0x1066/0x13b0
              [<c01474a9>] lock_acquire+0xba/0xdd
              [<c01836bc>] might_fault+0x68/0x88
              [<c023c61d>] copy_from_user+0x2a/0x111
              [<d0d120d0>] nilfs_ioctl_prepare_clean_segments+0x1d/0xf1 [nilfs2]
              [<d0d0e2aa>] nilfs_clean_segments+0x6d/0x1b9 [nilfs2]
              [<d0d11f68>] nilfs_ioctl+0x2ad/0x318 [nilfs2]
              [<c01a3be7>] vfs_ioctl+0x22/0x69
              [<c01a408e>] do_vfs_ioctl+0x460/0x499
              [<c01a4107>] sys_ioctl+0x40/0x5a
              [<c01031a4>] sysenter_do_call+0x12/0x38
              [<ffffffff>] 0xffffffff
      
       -> #0 (&nilfs->ns_segctor_sem){++++.+}:
              [<c0146e0b>] __lock_acquire+0xdcc/0x13b0
              [<c01474a9>] lock_acquire+0xba/0xdd
              [<c0433f1d>] down_read+0x2a/0x3e
              [<d0d0e846>] nilfs_transaction_begin+0xb6/0x10c [nilfs2]
              [<d0cfe0e5>] nilfs_page_mkwrite+0xe7/0x154 [nilfs2]
              [<c0183b0b>] __do_fault+0x165/0x376
              [<c01855cd>] handle_mm_fault+0x287/0x5d1
              [<c043712d>] do_page_fault+0x2fb/0x30a
              [<c0435462>] error_code+0x72/0x78
              [<ffffffff>] 0xffffffff
      
      where nilfs_clean_segments() holds:
      
        nilfs->ns_segctor_sem -> copy_from_user()
                                   --> page fault -> mm->mmap_sem
      
      And, page fault path may hold:
      
        page fault -> mm->mmap_sem
               --> nilfs_page_mkwrite() -> nilfs->ns_segctor_sem
      
      Even though nilfs_clean_segments() does not perform write access on
      given user pages, it may cause deadlock because nilfs->ns_segctor_sem
      is shared per device and mm->mmap_sem can be shared with other tasks.
      
      To avoid this problem, this patch moves all calls of copy_from_user()
      outside the nilfs->ns_segctor_sem lock in the ioctl.
      Signed-off-by: NRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
      4f6b8288
    • R
      nilfs2: fix possible circular locking for get information ioctls · 47eb6b9c
      Ryusuke Konishi 提交于
      This is one of two patches which are to correct possible circular
      locking between mm->mmap_sem and nilfs->ns_segctor_sem.
      
      The problem was detected by lockdep check as follows:
      
       =======================================================
       [ INFO: possible circular locking dependency detected ]
       2.6.30-rc3-nilfs-00002-g3552613 #6
       -------------------------------------------------------
       mmap/5418 is trying to acquire lock:
       (&nilfs->ns_segctor_sem){++++.+}, at: [<d0d0e852>] nilfs_transaction_begin+0xb6/0x10c [nilfs2]
      
       but task is already holding lock:
       (&mm->mmap_sem){++++++}, at: [<c043700a>] do_page_fault+0x1d8/0x30a
      
       which lock already depends on the new lock.
      
       the existing dependency chain (in reverse order) is:
      
       -> #1 (&mm->mmap_sem){++++++}:
       [<c01470a5>] __lock_acquire+0x1066/0x13b0
       [<c01474a9>] lock_acquire+0xba/0xdd
       [<c01836bc>] might_fault+0x68/0x88
       [<c023c730>] copy_to_user+0x2c/0xfc
       [<d0d11b4f>] nilfs_ioctl_wrap_copy+0x103/0x160 [nilfs2]
       [<d0d11fa9>] nilfs_ioctl+0x30a/0x3b0 [nilfs2]
       [<c01a3be7>] vfs_ioctl+0x22/0x69
       [<c01a408e>] do_vfs_ioctl+0x460/0x499
       [<c01a4107>] sys_ioctl+0x40/0x5a
       [<c01031a4>] sysenter_do_call+0x12/0x38
       [<ffffffff>] 0xffffffff
      
       -> #0 (&nilfs->ns_segctor_sem){++++.+}:
       [<c0146e0b>] __lock_acquire+0xdcc/0x13b0
       [<c01474a9>] lock_acquire+0xba/0xdd
       [<c0433f1d>] down_read+0x2a/0x3e
       [<d0d0e852>] nilfs_transaction_begin+0xb6/0x10c [nilfs2]
       [<d0cfe0e5>] nilfs_page_mkwrite+0xe7/0x154 [nilfs2]
       [<c0183b0b>] __do_fault+0x165/0x376
       [<c01855cd>] handle_mm_fault+0x287/0x5d1
       [<c043712d>] do_page_fault+0x2fb/0x30a
       [<c0435462>] error_code+0x72/0x78
       [<ffffffff>] 0xffffffff
      
       other info that might help us debug this:
      
       1 lock held by mmap/5418:
       #0:  (&mm->mmap_sem){++++++}, at: [<c043700a>] do_page_fault+0x1d8/0x30a
      
       stack backtrace:
       Pid: 5418, comm: mmap Not tainted 2.6.30-rc3-nilfs-00002-g3552613 #6
       Call Trace:
       [<c0432145>] ? printk+0xf/0x12
       [<c0145c48>] print_circular_bug_tail+0xaa/0xb5
       [<c0146e0b>] __lock_acquire+0xdcc/0x13b0
       [<d0d10149>] ? nilfs_sufile_get_stat+0x1e/0x105 [nilfs2]
       [<c013b59a>] ? up_read+0x16/0x2c
       [<d0d10225>] ? nilfs_sufile_get_stat+0xfa/0x105 [nilfs2]
       [<c01474a9>] lock_acquire+0xba/0xdd
       [<d0d0e852>] ? nilfs_transaction_begin+0xb6/0x10c [nilfs2]
       [<c0433f1d>] down_read+0x2a/0x3e
       [<d0d0e852>] ? nilfs_transaction_begin+0xb6/0x10c [nilfs2]
       [<d0d0e852>] nilfs_transaction_begin+0xb6/0x10c [nilfs2]
       [<d0cfe0e5>] nilfs_page_mkwrite+0xe7/0x154 [nilfs2]
       [<c0183b0b>] __do_fault+0x165/0x376
       [<c01855cd>] handle_mm_fault+0x287/0x5d1
       [<c043700a>] ? do_page_fault+0x1d8/0x30a
       [<c013b54f>] ? down_read_trylock+0x39/0x43
       [<c043712d>] do_page_fault+0x2fb/0x30a
       [<c0436e32>] ? do_page_fault+0x0/0x30a
       [<c0435462>] error_code+0x72/0x78
       [<c0436e32>] ? do_page_fault+0x0/0x30a
      
      This makes the lock granularity of nilfs->ns_segctor_sem finer than
      that of the mmap semaphore for ioctl commands except
      nilfs_clean_segments().
      
      The successive patch ("nilfs2: fix lock order reversal in
      nilfs_clean_segments ioctl") is required to fully resolve the problem.
      Signed-off-by: NRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
      47eb6b9c
  11. 10 5月, 2009 1 次提交
  12. 09 5月, 2009 1 次提交
    • A
      Fix races around the access to ->s_options · 2a32cebd
      Al Viro 提交于
      Put generic_show_options read access to s_options under rcu_read_lock,
      split save_mount_options() into "we are setting it the first time"
      (uses in foo_fill_super()) and "we are relacing and freeing the old one",
      synchronize_rcu() before kfree() in the latter.
      Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
      2a32cebd