Merge branch 'nfs-for-3.2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 25 Oct 2011 13:44:06 +0000 (15:44 +0200)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 25 Oct 2011 13:44:06 +0000 (15:44 +0200)
* 'nfs-for-3.2' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (26 commits)
  Check validity of cl_rpcclient in nfs_server_list_show
  NFS: Get rid of the nfs_rdata_mempool
  NFS: Don't rely on PageError in nfs_readpage_release_partial
  NFS: Get rid of unnecessary calls to ClearPageError() in read code
  NFS: Get rid of nfs_restart_rpc()
  NFS: Get rid of the unused nfs_write_data->flags field
  NFS: Get rid of the unused nfs_read_data->flags field
  NFSv4: Translate NFS4ERR_BADNAME into ENOENT when applied to a lookup
  NFS: Remove the unused "lookupfh()" version of nfs4_proc_lookup()
  NFS: Use the inode->i_version to cache NFSv4 change attribute information
  SUNRPC: Remove unnecessary export of rpc_sockaddr2uaddr
  SUNRPC: Fix rpc_sockaddr2uaddr
  nfs/super.c: local functions should be static
  pnfsblock: fix writeback deadlock
  pnfsblock: fix NULL pointer dereference
  pnfs: recoalesce when ld read pagelist fails
  pnfs: recoalesce when ld write pagelist fails
  pnfs: make _set_lo_fail generic
  pnfsblock: add missing rpc_put_mount and path_put
  SUNRPC/NFS: make rpc pipe upcall generic
  ...

1  2 
include/linux/sunrpc/clnt.h
net/sunrpc/auth_gss/auth_gss.c
net/sunrpc/rpc_pipe.c

@@@ -9,6 -9,7 +9,7 @@@
  #ifndef _LINUX_SUNRPC_CLNT_H
  #define _LINUX_SUNRPC_CLNT_H
  
+ #include <linux/types.h>
  #include <linux/socket.h>
  #include <linux/in.h>
  #include <linux/in6.h>
@@@ -161,7 -162,7 +162,7 @@@ const char *rpc_peeraddr2str(struct rpc
  size_t                rpc_ntop(const struct sockaddr *, char *, const size_t);
  size_t                rpc_pton(const char *, const size_t,
                         struct sockaddr *, const size_t);
- char *                rpc_sockaddr2uaddr(const struct sockaddr *);
+ char *                rpc_sockaddr2uaddr(const struct sockaddr *, gfp_t);
  size_t                rpc_uaddr2sockaddr(const char *, const size_t,
                                   struct sockaddr *, const size_t);
  
@@@ -218,13 -219,7 +219,13 @@@ static inline bool __rpc_cmp_addr6(cons
  {
        const struct sockaddr_in6 *sin1 = (const struct sockaddr_in6 *)sap1;
        const struct sockaddr_in6 *sin2 = (const struct sockaddr_in6 *)sap2;
 -      return ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr);
 +
 +      if (!ipv6_addr_equal(&sin1->sin6_addr, &sin2->sin6_addr))
 +              return false;
 +      else if (ipv6_addr_type(&sin1->sin6_addr) & IPV6_ADDR_LINKLOCAL)
 +              return sin1->sin6_scope_id == sin2->sin6_scope_id;
 +
 +      return true;
  }
  
  static inline bool __rpc_copy_addr6(struct sockaddr *dst,
@@@ -122,7 -122,7 +122,7 @@@ gss_cred_set_ctx(struct rpc_cred *cred
        if (!test_bit(RPCAUTH_CRED_NEW, &cred->cr_flags))
                return;
        gss_get_ctx(ctx);
 -      rcu_assign_pointer(gss_cred->gc_ctx, ctx);
 +      RCU_INIT_POINTER(gss_cred->gc_ctx, ctx);
        set_bit(RPCAUTH_CRED_UPTODATE, &cred->cr_flags);
        smp_mb__before_clear_bit();
        clear_bit(RPCAUTH_CRED_NEW, &cred->cr_flags);
@@@ -603,26 -603,6 +603,6 @@@ out
        return err;
  }
  
- static ssize_t
- gss_pipe_upcall(struct file *filp, struct rpc_pipe_msg *msg,
-               char __user *dst, size_t buflen)
- {
-       char *data = (char *)msg->data + msg->copied;
-       size_t mlen = min(msg->len, buflen);
-       unsigned long left;
-       left = copy_to_user(dst, data, mlen);
-       if (left == mlen) {
-               msg->errno = -EFAULT;
-               return -EFAULT;
-       }
-       mlen -= left;
-       msg->copied += mlen;
-       msg->errno = 0;
-       return mlen;
- }
  #define MSG_BUF_MAXSIZE 1024
  
  static ssize_t
@@@ -970,7 -950,7 +950,7 @@@ gss_destroy_nullcred(struct rpc_cred *c
        struct gss_auth *gss_auth = container_of(cred->cr_auth, struct gss_auth, rpc_auth);
        struct gss_cl_ctx *ctx = gss_cred->gc_ctx;
  
 -      rcu_assign_pointer(gss_cred->gc_ctx, NULL);
 +      RCU_INIT_POINTER(gss_cred->gc_ctx, NULL);
        call_rcu(&cred->cr_rcu, gss_free_cred_callback);
        if (ctx)
                gss_put_ctx(ctx);
@@@ -1590,7 -1570,7 +1570,7 @@@ static const struct rpc_credops gss_nul
  };
  
  static const struct rpc_pipe_ops gss_upcall_ops_v0 = {
-       .upcall         = gss_pipe_upcall,
+       .upcall         = rpc_pipe_generic_upcall,
        .downcall       = gss_pipe_downcall,
        .destroy_msg    = gss_pipe_destroy_msg,
        .open_pipe      = gss_pipe_open_v0,
  };
  
  static const struct rpc_pipe_ops gss_upcall_ops_v1 = {
-       .upcall         = gss_pipe_upcall,
+       .upcall         = rpc_pipe_generic_upcall,
        .downcall       = gss_pipe_downcall,
        .destroy_msg    = gss_pipe_destroy_msg,
        .open_pipe      = gss_pipe_open_v1,
diff --combined net/sunrpc/rpc_pipe.c
@@@ -77,6 -77,26 +77,26 @@@ rpc_timeout_upcall_queue(struct work_st
        rpc_purge_list(rpci, &free_list, destroy_msg, -ETIMEDOUT);
  }
  
+ ssize_t rpc_pipe_generic_upcall(struct file *filp, struct rpc_pipe_msg *msg,
+                               char __user *dst, size_t buflen)
+ {
+       char *data = (char *)msg->data + msg->copied;
+       size_t mlen = min(msg->len - msg->copied, buflen);
+       unsigned long left;
+       left = copy_to_user(dst, data, mlen);
+       if (left == mlen) {
+               msg->errno = -EFAULT;
+               return -EFAULT;
+       }
+       mlen -= left;
+       msg->copied += mlen;
+       msg->errno = 0;
+       return mlen;
+ }
+ EXPORT_SYMBOL_GPL(rpc_pipe_generic_upcall);
  /**
   * rpc_queue_upcall - queue an upcall message to userspace
   * @inode: inode of upcall pipe on which to queue given message
@@@ -1084,6 -1104,3 +1104,6 @@@ void unregister_rpc_pipefs(void
        kmem_cache_destroy(rpc_inode_cachep);
        unregister_filesystem(&rpc_pipe_fs_type);
  }
 +
 +/* Make 'mount -t rpc_pipefs ...' autoload this module. */
 +MODULE_ALIAS("rpc_pipefs");