1. 04 4月, 2009 7 次提交
  2. 31 3月, 2009 1 次提交
  3. 30 3月, 2009 1 次提交
  4. 28 3月, 2009 3 次提交
  5. 19 3月, 2009 28 次提交
    • C
      SUNRPC: Clean up static inline functions in svc_xprt.h · 2795e53b
      Chuck Lever 提交于
      Clean up:  Enable the use of const arguments in higher level svc_ APIs
      by adding const to the arguments of the helper functions in svc_xprt.h
      Signed-off-by: NChuck Lever <chuck.lever@oracle.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      2795e53b
    • S
      Inconsistent setattr behaviour · 0953e620
      Sachin S. Prabhu 提交于
      There is an inconsistency seen in the behaviour of nfs compared to other local
      filesystems on linux when changing owner or group of a directory. If the
      directory has SUID/SGID flags set, on changing owner or group on the directory,
      the flags are stripped off on nfs. These flags are maintained on other
      filesystems such as ext3.
      
      To reproduce on a nfs share or local filesystem, run the following commands
      mkdir test; chmod +s+g test; chown user1 test; ls -ld test
      
      On the nfs share, the flags are stripped and the output seen is
      drwxr-xr-x 2 user1 root 4096 Feb 23  2009 test
      
      On other local filesystems(ex: ext3), the flags are not stripped and the output
      seen is
      drwsr-sr-x 2 user1 root 4096 Feb 23 13:57 test
      
      chown_common() called from sys_chown() will only strip the flags if the inode is
      not a directory.
      static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
      {
      ..
              if (!S_ISDIR(inode->i_mode))
                      newattrs.ia_valid |=
                              ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
      ..
      }
      
      See: http://www.opengroup.org/onlinepubs/7990989775/xsh/chown.html
      
      "If the path argument refers to a regular file, the set-user-ID (S_ISUID) and
      set-group-ID (S_ISGID) bits of the file mode are cleared upon successful return
      from chown(), unless the call is made by a process with appropriate privileges,
      in which case it is implementation-dependent whether these bits are altered. If
      chown() is successfully invoked on a file that is not a regular file, these
      bits may be cleared. These bits are defined in <sys/stat.h>."
      
      The behaviour as it stands does not appear to violate POSIX.  However the
      actions performed are inconsistent when comparing ext3 and nfs.
      Signed-off-by: NSachin Prabhu <sprabhu@redhat.com>
      Acked-by: NJeff Layton <jlayton@redhat.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      0953e620
    • O
      svcrpc: take advantage of tcp autotuning · 47a14ef1
      Olga Kornievskaia 提交于
      Allow the NFSv4 server to make use of TCP autotuning behaviour, which
      was previously disabled by setting the sk_userlocks variable.
      
      Set the receive buffers to be big enough to receive the whole RPC
      request, and set this for the listening socket, not the accept socket.
      
      Remove the code that readjusts the receive/send buffer sizes for the
      accepted socket. Previously this code was used to influence the TCP
      window management behaviour, which is no longer needed when autotuning
      is enabled.
      
      This can improve IO bandwidth on networks with high bandwidth-delay
      products, where a large tcp window is required.  It also simplifies
      performance tuning, since getting adequate tcp buffers previously
      required increasing the number of nfsd threads.
      Signed-off-by: NOlga Kornievskaia <aglo@citi.umich.edu>
      Cc: Jim Rees <rees@umich.edu>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      47a14ef1
    • J
      nfsd4: don't check ip address in setclientid · 026722c2
      J. Bruce Fields 提交于
      The spec allows clients to change ip address, so we shouldn't be
      requiring that setclientid always come from the same address.  For
      example, a client could reboot and get a new dhcpd address, but still
      present the same clientid to the server.  In that case the server should
      revoke the client's previous state and allow it to continue, instead of
      (as it currently does) returning a CLID_INUSE error.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      026722c2
    • G
      knfsd: add file to export stats about nfsd pools · 03cf6c9f
      Greg Banks 提交于
      Add /proc/fs/nfsd/pool_stats to export to userspace various
      statistics about the operation of rpc server thread pools.
      
      This patch is based on a forward-ported version of
      knfsd-add-pool-thread-stats which has been shipping in the SGI
      "Enhanced NFS" product since 2006 and which was previously
      posted:
      
      http://article.gmane.org/gmane.linux.nfs/10375
      
      It has also been updated thus:
      
       * moved EXPORT_SYMBOL() to near the function it exports
       * made the new struct struct seq_operations const
       * used SEQ_START_TOKEN instead of ((void *)1)
       * merged fix from SGI PV 990526 "sunrpc: use dprintk instead of
         printk in svc_pool_stats_*()" by Harshula Jayasuriya.
       * merged fix from SGI PV 964001 "Crash reading pool_stats before
         nfsds are started".
      Signed-off-by: NGreg Banks <gnb@sgi.com>
      Signed-off-by: NHarshula Jayasuriya <harshula@sgi.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      03cf6c9f
    • G
      knfsd: avoid overloading the CPU scheduler with enormous load averages · 59a252ff
      Greg Banks 提交于
      Avoid overloading the CPU scheduler with enormous load averages
      when handling high call-rate NFS loads.  When the knfsd bottom half
      is made aware of an incoming call by the socket layer, it tries to
      choose an nfsd thread and wake it up.  As long as there are idle
      threads, one will be woken up.
      
      If there are lot of nfsd threads (a sensible configuration when
      the server is disk-bound or is running an HSM), there will be many
      more nfsd threads than CPUs to run them.  Under a high call-rate
      low service-time workload, the result is that almost every nfsd is
      runnable, but only a handful are actually able to run.  This situation
      causes two significant problems:
      
      1. The CPU scheduler takes over 10% of each CPU, which is robbing
         the nfsd threads of valuable CPU time.
      
      2. At a high enough load, the nfsd threads starve userspace threads
         of CPU time, to the point where daemons like portmap and rpc.mountd
         do not schedule for tens of seconds at a time.  Clients attempting
         to mount an NFS filesystem timeout at the very first step (opening
         a TCP connection to portmap) because portmap cannot wake up from
         select() and call accept() in time.
      
      Disclaimer: these effects were observed on a SLES9 kernel, modern
      kernels' schedulers may behave more gracefully.
      
      The solution is simple: keep in each svc_pool a counter of the number
      of threads which have been woken but have not yet run, and do not wake
      any more if that count reaches an arbitrary small threshold.
      
      Testing was on a 4 CPU 4 NIC Altix using 4 IRIX clients, each with 16
      synthetic client threads simulating an rsync (i.e. recursive directory
      listing) workload reading from an i386 RH9 install image (161480
      regular files in 10841 directories) on the server.  That tree is small
      enough to fill in the server's RAM so no disk traffic was involved.
      This setup gives a sustained call rate in excess of 60000 calls/sec
      before being CPU-bound on the server.  The server was running 128 nfsds.
      
      Profiling showed schedule() taking 6.7% of every CPU, and __wake_up()
      taking 5.2%.  This patch drops those contributions to 3.0% and 2.2%.
      Load average was over 120 before the patch, and 20.9 after.
      
      This patch is a forward-ported version of knfsd-avoid-nfsd-overload
      which has been shipping in the SGI "Enhanced NFS" product since 2006.
      It has been posted before:
      
      http://article.gmane.org/gmane.linux.nfs/10374Signed-off-by: NGreg Banks <gnb@sgi.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      59a252ff
    • G
      knfsd: remove the nfsd thread busy histogram · 8bbfa9f3
      Greg Banks 提交于
      Stop gathering the data that feeds the 'th' line in /proc/net/rpc/nfsd
      because the questionable data provided is not worth the scalability
      impact of calculating it.  Instead, always report zeroes.  The current
      approach suffers from three major issues:
      
      1. update_thread_usage() increments buckets by call service
         time or call arrival time...in jiffies.  On lightly loaded
         machines, call service times are usually < 1 jiffy; on
         heavily loaded machines call arrival times will be << 1 jiffy.
         So a large portion of the updates to the buckets are rounded
         down to zero, and the histogram is undercounting.
      
      2. As seen previously on the nfs mailing list, the format in which
         the histogram is presented is cryptic, difficult to explain,
         and difficult to use.
      
      3. Updating the histogram requires taking a global spinlock and
         dirtying the global variables nfsd_last_call, nfsd_busy, and
         nfsdstats *twice* on every RPC call, which is a significant
         scaling limitation.
      
      Testing on a 4 CPU 4 NIC Altix using 4 IRIX clients each doing
      1K streaming reads at full line rate, shows the stats update code
      (inlined into nfsd()) takes about 1.7% of each CPU.  This patch drops
      the contribution from nfsd() into the profile noise.
      
      This patch is a forward-ported version of knfsd-remove-nfsd-threadstats
      which has been shipping in the SGI "Enhanced NFS" product since 2006.
      In that time, exactly one customer has noticed that the threadstats
      were missing.  It has been previously posted:
      
      http://article.gmane.org/gmane.linux.nfs/10376
      
      and more recently requested to be posted again.
      Signed-off-by: NGreg Banks <gnb@sgi.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      8bbfa9f3
    • J
      nfsd4: remove redundant check from nfsd4_open · 5cb031b0
      J. Bruce Fields 提交于
      Note that we already checked for this invalid case at the top of this
      function.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      5cb031b0
    • J
      nfsd4: don't do lookup within readdir in recovery code · 05f4f678
      J. Bruce Fields 提交于
      The main nfsd code was recently modified to no longer do lookups from
      withing the readdir callback, to avoid locking problems on certain
      filesystems.
      
      This (rather hacky, and overdue for replacement) NFSv4 recovery code has
      the same problem.  Fix it to build up a list of names (instead of
      dentries) and do the lookups afterwards.
      
      Reported symptoms were a deadlock in the xfs code (called from
      nfsd4_recdir_load), with /var/lib/nfs on xfs.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      Reported-by: NDavid Warren <warren@atmos.washington.edu>
      05f4f678
    • J
      nfsd4: support putpubfh operation · a1c8c4d1
      J. Bruce Fields 提交于
      Currently putpubfh returns NFSERR_OPNOTSUPP, which isn't actually
      allowed for v4.  The right error is probably NFSERR_NOTSUPP.
      
      But let's just implement it; though rarely seen, it can be used by
      Solaris (with a special mount option), is mandated by the rfc, and is
      trivial for us to support.
      
      Thanks to Yang Hongyang for pointing out the original problem, and to
      Mike Eisler, Tom Talpey, Trond Myklebust, and Dave Noveck for further
      argument....
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      a1c8c4d1
    • D
      Short write in nfsd becomes a full write to the client · 31dec253
      David Shaw 提交于
      If a filesystem being written to via NFS returns a short write count
      (as opposed to an error) to nfsd, nfsd treats that as a success for
      the entire write, rather than the short count that actually succeeded.
      
      For example, given a 8192 byte write, if the underlying filesystem
      only writes 4096 bytes, nfsd will ack back to the nfs client that all
      8192 bytes were written.  The nfs client does have retry logic for
      short writes, but this is never called as the client is told the
      complete write succeeded.
      
      There are probably other ways it could happen, but in my case it
      happened with a fuse (filesystem in userspace) filesystem which can
      rather easily have a partial write.
      
      Here is a patch to properly return the short write count to the
      client.
      Signed-off-by: NDavid Shaw <dshaw@jabberwocky.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      31dec253
    • B
      NFSD: return nfsv4 error code nfserr_notsupp rather than nfsv[23]'s nfserr_opnotsupp · 1e685ec2
      Benny Halevy 提交于
      Thanks for Bill Baker at sun.com for catching this
      at Connectathon 2009.
      
      This bug was introduced in 2.6.27
      Signed-off-by: NBenny Halevy <bhalevy@panasas.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      1e685ec2
    • J
      a601caed
    • J
      nfsd4: fix do_probe_callback errors · 418cd20a
      J. Bruce Fields 提交于
      The errors returned aren't used.  Just return 0 and make them available
      to a dprintk().  Also, consistently use -ERRNO errors instead of nfs
      errors.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      Reviewed-by: NBenny Halevy <bhalevy@panasas.com>
      418cd20a
    • J
      nfsd4: remove use of mutex for file_hashtable · 8b671b80
      J. Bruce Fields 提交于
      As part of reducing the scope of the client_mutex, and in order to
      remove the need for mutexes from the callback code (so that callbacks
      can be done as asynchronous rpc calls), move manipulations of the
      file_hashtable under the recall_lock.
      
      Update the relevant comments while we're here.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      Cc: Alexandros Batsakis <batsakis@netapp.com>
      Reviewed-by: NBenny Halevy <bhalevy@panasas.com>
      8b671b80
    • J
      nfsd4: put_nfs4_client does not require state lock · d7fdcfe0
      J. Bruce Fields 提交于
      Since free_client() is guaranteed to only be called once, and to only
      touch the client structure itself (not any common data structures), it
      has no need for the state lock.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      Cc: Alexandros Batsakis <batsakis@netapp.com>
      d7fdcfe0
    • J
      nfsd4: rename io_during_grace_disallowed · 18f82731
      J. Bruce Fields 提交于
      Use a slightly clearer, more concise name.  Also removed unused
      argument.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      18f82731
    • J
      nfsd4: remove unused CHECK_FH flag · 6150ef0d
      J. Bruce Fields 提交于
      All users now pass this, so it's meaningless.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      6150ef0d
    • J
      nfsd4: fail when delegreturn gets a non-delegation stateid · 7e0f7cf5
      J. Bruce Fields 提交于
      Previous cleanup reveals an obvious (though harmless) bug: when
      delegreturn gets a stateid that isn't for a delegation, it should return
      an error rather than doing nothing.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      7e0f7cf5
    • J
      nfsd4: separate delegreturn case from preprocess_stateid_op · 203a8c8e
      J. Bruce Fields 提交于
      Delegreturn is enough a special case for preprocess_stateid_op to
      warrant just open-coding it in delegreturn.
      
      There should be no change in behavior here; we're just reshuffling code.
      
      Thanks to Yang Hongyang for catching a critical typo.
      Reviewed-by: NYang Hongyang <yanghy@cn.fujitsu.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      203a8c8e
    • J
      nfsd4: add a helper function to decide if stateid is delegation · 3e633079
      J. Bruce Fields 提交于
      Make this check self-documenting.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      3e633079
    • J
      nfsd4: remove some dprintk's · 819a8f53
      J. Bruce Fields 提交于
      I can't recall ever seeing these printk's used to debug a problem.  I'll
      happily put them back if we see a case where they'd be useful.  (Though
      if we do that the find_XXX() errors would probably be better
      reported in find_XXX() functions themselves.)
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      819a8f53
    • J
      nfsd4: remove unneeded local variable · fd03b099
      J. Bruce Fields 提交于
      We no longer need stidp.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      fd03b099
    • J
      nfsd4: remove redundant "if" in nfs4_preprocess_stateid_op · dc9bf700
      J. Bruce Fields 提交于
      Note that we exit this first big "if" with stp == NULL if and only if we
      took the first branch; therefore, the second "if" is redundant, and we
      can just combine the two, simplifying the logic.
      Reviewed-by: NYang Hongyang <yanghy@cn.fujitsu.com>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      dc9bf700
    • J
      nfsd4: move check_stateid_generation check · 0c2a498f
      J. Bruce Fields 提交于
      No change in behavior.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      0c2a498f
    • J
      nfsd4: trivial preprocess_stateid_op cleanup · a4455be0
      J. Bruce Fields 提交于
      Remove a couple redundant comments, adjust style; no change in behavior.
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      a4455be0
    • H
      nfs: replace uses of __constant_{endian} · 77f18f5e
      Harvey Harrison 提交于
      The base versions handle constant folding now, none of these headers
      are exported to userspace, so the __ prefixed versions are not
      necessary.
      Signed-off-by: NHarvey Harrison <harvey.harrison@gmail.com>
      Reviewed-by: NNeilBrown <neilb@suse.de>
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      77f18f5e
    • W
      nfsd(v2/v3): fix the failure of creation from HPUX client · 4ac35c2f
      wengang wang 提交于
      sometimes HPUX nfs client sends a create request to linux nfs server(v2/v3).
      the dump of the request is like:
          obj_attributes
              mode: value follows
                  set_it: value follows (1)
                  mode: 00
              uid: no value
                  set_it: no value (0)
              gid: value follows
                  set_it: value follows (1)
                  gid: 8030
              size: value follows
                  set_it: value follows (1)
                  size: 0
              atime: don't change
                  set_it: don't change (0)
              mtime: don't change
                  set_it: don't change (0)
      
      note that mode is 00(havs no rwx privilege even for the owner) and it requires
      to set size to 0.
      
      as current nfsd(v2/v3) implementation, the server does mainly 2 steps:
      1) creates the file in mode specified by calling vfs_create().
      2) sets attributes for the file by calling nfsd_setattr().
      
      at step 2), it finally calls file system specific setattr() function which may
      fail when checking permission because changing size needs WRITE privilege but
      it has none since mode is 000.
      
      for this case, a new file created, we may simply ignore the request of
      setting size to 0, so that WRITE privilege is not needed and the open
      succeeds.
      Signed-off-by: NWengang Wang <wen.gang.wang@oracle.com>
      --
       vfs.c |   19 +++++++++++++++++++
       1 file changed, 19 insertions(+)
      Signed-off-by: NJ. Bruce Fields <bfields@citi.umich.edu>
      4ac35c2f