This patch provides the NFS backport for SLES11.  Since the RDMA
infrastructure has not been backports for this distro release, only TCP
support has been tested.  It passes Connectathon as a client and server.
    
Signed-Off-By: Jon Mason <[email protected]>
---

diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/cpumask.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/cpumask.h
new file mode 100644
index 0000000..391cc04
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/cpumask.h
@@ -0,0 +1,10 @@
+#ifndef BACKPORT_LINUX_CPUMASK_H
+#define BACKPORT_LINUX_CPUMASK_H
+
+#include_next <linux/cpumask.h>
+#include <asm/topology.h>
+
+#define cpumask_of(cpu)                (get_cpu_mask(cpu))
+#define cpumask_of_node(node) (_node_to_cpumask_ptr(node))
+
+#endif /* BACKPORT_LINUX_CPUMASK_H */
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/dcache.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/dcache.h
new file mode 100644
index 0000000..4a571af
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/dcache.h
@@ -0,0 +1,22 @@
+#ifndef BACKPORT_LINUX_DCACHE_H
+#define BACKPORT_LINUX_DCACHE_H
+
+#include_next <linux/dcache.h>
+#include <linux/err.h>
+
+extern void iput(struct inode *);
+
+static inline struct dentry *d_obtain_alias(struct inode *inode)
+{
+       struct dentry *rc;
+
+       rc = d_alloc_anon(inode);
+       if (!rc) {
+               iput(inode);
+               return ERR_PTR(-ENOMEM);
+       }
+
+       return rc;
+}
+
+#endif
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/fs.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/fs.h
new file mode 100644
index 0000000..094dda6
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/fs.h
@@ -0,0 +1,63 @@
+#ifndef BACKPORT_LINUX_FS_H
+#define BACKPORT_LINUX_FS_H
+
+#include_next <linux/fs.h>
+#include <linux/sched.h>
+#include <linux/fs_struct.h>
+
+struct lock_manager {
+       struct list_head list;
+};
+
+void locks_start_grace(struct lock_manager *);
+void locks_end_grace(struct lock_manager *);
+int locks_in_grace(void);
+
+static inline bool execute_ok(struct inode *inode)
+{
+       return (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode);
+}
+
+static inline int current_umask(void)
+{
+       return current->fs->umask;
+}
+
+static inline void free_fs_struct(struct fs_struct *fs)
+{
+       struct task_struct *tsk;
+
+       tsk = kzalloc(sizeof(struct task_struct), GFP_KERNEL);
+       if (!tsk)
+               return;
+
+       spin_lock_init(&tsk->alloc_lock);
+       tsk->fs = fs;
+
+       exit_fs(tsk);
+       kfree(tsk);
+}
+
+static inline int unshare_fs_struct(void)
+{
+       struct fs_struct *fs = current->fs;
+       struct fs_struct *new_fs = copy_fs_struct(fs);
+       int kill;
+
+       if (!new_fs)
+               return -ENOMEM;
+
+       task_lock(current);
+       write_lock(&fs->lock);
+       kill = atomic_read(&fs->count) == 1;
+       current->fs = new_fs;
+       write_unlock(&fs->lock);
+       task_unlock(current);
+
+       if (kill)
+               free_fs_struct(fs);
+
+       return 0;
+}
+
+#endif
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/fscache.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/fscache.h
new file mode 100644
index 0000000..f758384
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/fscache.h
@@ -0,0 +1,4 @@
+#ifndef BACKPORT_LINUX_FSCACHE_H
+#define BACKPORT_LINUX_FSCACHE_H
+
+#endif
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/jiffies.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/jiffies.h
new file mode 100644
index 0000000..9871948
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/jiffies.h
@@ -0,0 +1,10 @@
+#ifndef _JIFFIES_BACKPORT_H
+#define _JIFFIES_BACKPORT_H
+
+#include_next <linux/jiffies.h>
+
+#define time_in_range_open(a,b,c) \
+       (time_after_eq(a,b) && \
+        time_before(a,c))
+
+#endif /* _JIFFIES_BACKPORT_H */
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/namei.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/namei.h
new file mode 100644
index 0000000..ef46b08
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/namei.h
@@ -0,0 +1,17 @@
+#ifndef BACKPORT_LINUX_NAMEI_H
+#define BACKPORT_LINUX_NAMEI_H
+
+#include_next <linux/namei.h>
+
+#define LOOKUP_EXCL             0x0400
+
+static inline int kern_path(const char *name, unsigned int flags, struct path 
*path)
+{
+       struct nameidata nd;
+       int rc = path_lookup(name, flags, &nd);
+       if (!rc)
+               *path = nd.path;
+       return rc;
+}
+
+#endif /* BACKPORT_LINUX_NAMEI_H */
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/pagevec.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/pagevec.h
new file mode 100644
index 0000000..1fb684d
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/pagevec.h
@@ -0,0 +1,17 @@
+#ifndef BACKPORT_LINUX_PAGEVEC_H
+#define BACKPORT_LINUX_PAGEVEC_H
+
+#include_next <linux/pagevec.h>
+
+static inline void __pagevec_lru_add_file(struct pagevec *pvec)
+{
+       __pagevec_lru_add(pvec);
+}
+
+static inline void pagevec_lru_add_file(struct pagevec *pvec)
+{
+       if (pagevec_count(pvec))
+               __pagevec_lru_add_file(pvec);
+}
+
+#endif
diff --git a/kernel_addons/backport/2.6.27_sles11/include/linux/types.h 
b/kernel_addons/backport/2.6.27_sles11/include/linux/types.h
new file mode 100644
index 0000000..b1a6937
--- /dev/null
+++ b/kernel_addons/backport/2.6.27_sles11/include/linux/types.h
@@ -0,0 +1,8 @@
+#ifndef BACKPORT_LINUX_TYPES_H
+#define BACKPORT_LINUX_TYPES_H
+
+#include_next <linux/types.h>
+
+typedef unsigned __bitwise__ fmode_t;
+
+#endif
diff --git a/kernel_patches/backport/2.6.27_sles11/rnfs_fs.patch 
b/kernel_patches/backport/2.6.27_sles11/rnfs_fs.patch
new file mode 100644
index 0000000..344e46d
--- /dev/null
+++ b/kernel_patches/backport/2.6.27_sles11/rnfs_fs.patch
@@ -0,0 +1,1220 @@
+diff --git a/fs/exportfs/expfs.c b/fs/exportfs/expfs.c
+index 197c7db..f841d90 100644
+--- a/fs/exportfs/expfs.c
++++ b/fs/exportfs/expfs.c
+@@ -250,7 +250,6 @@ static int filldir_one(void * __buf, const char * name, 
int len,
+ static int get_name(struct vfsmount *mnt, struct dentry *dentry,
+               char *name, struct dentry *child)
+ {
+-      const struct cred *cred = current_cred();
+       struct inode *dir = dentry->d_inode;
+       int error;
+       struct file *file;
+@@ -265,7 +264,7 @@ static int get_name(struct vfsmount *mnt, struct dentry 
*dentry,
+       /*
+        * Open the directory ...
+        */
+-      file = dentry_open(dget(dentry), mntget(mnt), O_RDONLY, cred);
++      file = dentry_open(dget(dentry), mntget(mnt), O_RDONLY);
+       error = PTR_ERR(file);
+       if (IS_ERR(file))
+               goto out;
+diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
+index 6d5d4a4..80af4b4 100644
+--- a/fs/lockd/mon.c
++++ b/fs/lockd/mon.c
+@@ -65,7 +65,7 @@ static void nsm_display_ipv4_address(const struct sockaddr 
*sap, char *buf,
+                                    const size_t len)
+ {
+       const struct sockaddr_in *sin = (struct sockaddr_in *)sap;
+-      snprintf(buf, len, "%pI4", &sin->sin_addr.s_addr);
++      snprintf(buf, len, NIPQUAD_FMT, NIPQUAD(sin->sin_addr.s_addr));
+ }
+ 
+ static void nsm_display_ipv6_address(const struct sockaddr *sap, char *buf,
+@@ -74,12 +74,11 @@ static void nsm_display_ipv6_address(const struct sockaddr 
*sap, char *buf,
+       const struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+ 
+       if (ipv6_addr_v4mapped(&sin6->sin6_addr))
+-              snprintf(buf, len, "%pI4", &sin6->sin6_addr.s6_addr32[3]);
++              snprintf(buf, len, NIPQUAD_FMT, 
NIPQUAD(sin6->sin6_addr.s6_addr32[3]));
+       else if (sin6->sin6_scope_id != 0)
+-              snprintf(buf, len, "%pI6%%%u", &sin6->sin6_addr,
+-                              sin6->sin6_scope_id);
++              snprintf(buf, len, NIP6_FMT"%%%u", NIP6(sin6->sin6_addr), 
sin6->sin6_scope_id);
+       else
+-              snprintf(buf, len, "%pI6", &sin6->sin6_addr);
++              snprintf(buf, len, NIP6_FMT, NIP6(sin6->sin6_addr));
+ }
+ 
+ static void nsm_display_address(const struct sockaddr *sap,
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 370b190..3b2f697 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -899,7 +899,7 @@ static void nfs_dentry_iput(struct dentry *dentry, struct 
inode *inode)
+       iput(inode);
+ }
+ 
+-const struct dentry_operations nfs_dentry_operations = {
++struct dentry_operations nfs_dentry_operations = {
+       .d_revalidate   = nfs_lookup_revalidate,
+       .d_delete       = nfs_dentry_delete,
+       .d_iput         = nfs_dentry_iput,
+@@ -967,7 +967,7 @@ out:
+ #ifdef CONFIG_NFS_V4
+ static int nfs_open_revalidate(struct dentry *, struct nameidata *);
+ 
+-const struct dentry_operations nfs4_dentry_operations = {
++struct dentry_operations nfs4_dentry_operations = {
+       .d_revalidate   = nfs_open_revalidate,
+       .d_delete       = nfs_dentry_delete,
+       .d_iput         = nfs_dentry_iput,
+diff --git a/fs/nfs/file.c b/fs/nfs/file.c
+index ec7e27d..0850bd8 100644
+--- a/fs/nfs/file.c
++++ b/fs/nfs/file.c
+@@ -484,9 +484,8 @@ const struct address_space_operations nfs_file_aops = {
+  * writable, implying that someone is about to modify the page through a
+  * shared-writable mapping
+  */
+-static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault 
*vmf)
++static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
+ {
+-      struct page *page = vmf->page;
+       struct file *filp = vma->vm_file;
+       struct dentry *dentry = filp->f_path.dentry;
+       unsigned pagelen;
+@@ -517,9 +516,9 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, 
struct vm_fault *vmf)
+ 
+       ret = nfs_updatepage(filp, page, 0, pagelen);
+ out_unlock:
++      unlock_page(page);
+       if (!ret)
+               return VM_FAULT_LOCKED;
+-      unlock_page(page);
+       return VM_FAULT_SIGBUS;
+ }
+ 
+diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
+index 84345de..4e4d332 100644
+--- a/fs/nfs/nfs4_fs.h
++++ b/fs/nfs/nfs4_fs.h
+@@ -179,7 +179,7 @@ struct nfs4_state_recovery_ops {
+       int (*recover_lock)(struct nfs4_state *, struct file_lock *);
+ };
+ 
+-extern const struct dentry_operations nfs4_dentry_operations;
++extern struct dentry_operations nfs4_dentry_operations;
+ extern const struct inode_operations nfs4_dir_inode_operations;
+ 
+ /* inode.c */
+diff --git a/fs/nfs/nfsroot.c b/fs/nfs/nfsroot.c
+index d9ef602..00e51a5 100644
+--- a/fs/nfs/nfsroot.c
++++ b/fs/nfs/nfsroot.c
+@@ -331,7 +331,7 @@ static int __init root_nfs_addr(void)
+       }
+ 
+       snprintf(nfs_data.hostname, sizeof(nfs_data.hostname),
+-               "%pI4", &servaddr);
++               NIPQUAD_FMT, NIPQUAD(servaddr));
+       return 0;
+ }
+ 
+@@ -423,8 +423,8 @@ static int __init root_nfs_getport(int program, int 
version, int proto)
+ {
+       struct sockaddr_in sin;
+ 
+-      printk(KERN_NOTICE "Looking up port of RPC %d/%d on %pI4\n",
+-              program, version, &servaddr);
++      printk(KERN_NOTICE "Looking up port of RPC %d/%d on "NIPQUAD_FMT"\n",
++              program, version, NIPQUAD(servaddr));
+       set_sockaddr(&sin, servaddr, 0);
+       return rpcb_getport_sync(&sin, program, version, proto);
+ }
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index 6717200..3d56a8e 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -103,7 +103,7 @@ enum {
+       Opt_err
+ };
+ 
+-static const match_table_t nfs_mount_option_tokens = {
++static match_table_t nfs_mount_option_tokens = {
+       { Opt_userspace, "bg" },
+       { Opt_userspace, "fg" },
+       { Opt_userspace, "retry=%s" },
+@@ -175,7 +175,7 @@ enum {
+       Opt_xprt_err
+ };
+ 
+-static const match_table_t nfs_xprt_protocol_tokens = {
++static match_table_t nfs_xprt_protocol_tokens = {
+       { Opt_xprt_udp, "udp" },
+       { Opt_xprt_tcp, "tcp" },
+       { Opt_xprt_rdma, "rdma" },
+@@ -192,7 +192,7 @@ enum {
+       Opt_sec_err
+ };
+ 
+-static const match_table_t nfs_secflavor_tokens = {
++static match_table_t nfs_secflavor_tokens = {
+       { Opt_sec_none, "none" },
+       { Opt_sec_none, "null" },
+       { Opt_sec_sys, "sys" },
+@@ -471,12 +471,12 @@ static void nfs_show_mountd_options(struct seq_file *m, 
struct nfs_server *nfss,
+       switch (sap->sa_family) {
+       case AF_INET: {
+               struct sockaddr_in *sin = (struct sockaddr_in *)sap;
+-              seq_printf(m, ",mountaddr=%pI4", &sin->sin_addr.s_addr);
++              seq_printf(m, ",mountaddr="NIPQUAD_FMT, 
NIPQUAD(sin->sin_addr.s_addr));
+               break;
+       }
+       case AF_INET6: {
+               struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)sap;
+-              seq_printf(m, ",mountaddr=%pI6", &sin6->sin6_addr);
++              seq_printf(m, ",mountaddr="NIP6_FMT, NIP6(sin6->sin6_addr));
+               break;
+       }
+       default:
+diff --git a/fs/nfsd/auth.c b/fs/nfsd/auth.c
+index 5573508..294992e 100644
+--- a/fs/nfsd/auth.c
++++ b/fs/nfsd/auth.c
+@@ -27,73 +27,53 @@ int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export 
*exp)
+ 
+ int nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
+ {
+-      struct group_info *rqgi;
+-      struct group_info *gi;
+-      struct cred *new;
++      struct svc_cred cred = rqstp->rq_cred;
+       int i;
+       int flags = nfsexp_flags(rqstp, exp);
+       int ret;
+ 
+-      /* discard any old override before preparing the new set */
+-      revert_creds(get_cred(current->real_cred));
+-      new = prepare_creds();
+-      if (!new)
+-              return -ENOMEM;
+-
+-      new->fsuid = rqstp->rq_cred.cr_uid;
+-      new->fsgid = rqstp->rq_cred.cr_gid;
+-
+-      rqgi = rqstp->rq_cred.cr_group_info;
+-
+       if (flags & NFSEXP_ALLSQUASH) {
+-              new->fsuid = exp->ex_anon_uid;
+-              new->fsgid = exp->ex_anon_gid;
+-              gi = groups_alloc(0);
+-              if (!gi)
+-                      goto oom;
++              cred.cr_uid = exp->ex_anon_uid;
++              cred.cr_gid = exp->ex_anon_gid;
++              cred.cr_group_info = groups_alloc(0);
+       } else if (flags & NFSEXP_ROOTSQUASH) {
+-              if (!new->fsuid)
+-                      new->fsuid = exp->ex_anon_uid;
+-              if (!new->fsgid)
+-                      new->fsgid = exp->ex_anon_gid;
+-
+-              gi = groups_alloc(rqgi->ngroups);
+-              if (!gi)
+-                      goto oom;
++              struct group_info *gi;
++              if (!cred.cr_uid)
++                      cred.cr_uid = exp->ex_anon_uid;
++              if (!cred.cr_gid)
++                      cred.cr_gid = exp->ex_anon_gid;
++              gi = groups_alloc(cred.cr_group_info->ngroups);
++              if (gi)
++                      for (i = 0; i < cred.cr_group_info->ngroups; i++) {
++                              if (!GROUP_AT(cred.cr_group_info, i))
++                                      GROUP_AT(gi, i) = exp->ex_anon_gid;
++                              else
++                                      GROUP_AT(gi, i) = 
GROUP_AT(cred.cr_group_info, i);
++                      }
++              cred.cr_group_info = gi;
++      } else
++              get_group_info(cred.cr_group_info);
++
++      if (cred.cr_uid != (uid_t) -1)
++              current->fsuid = cred.cr_uid;
++      else
++              current->fsuid = exp->ex_anon_uid;
++      if (cred.cr_gid != (gid_t) -1)
++              current->fsgid = cred.cr_gid;
++      else
++              current->fsgid = exp->ex_anon_gid;
+ 
+-              for (i = 0; i < rqgi->ngroups; i++) {
+-                      if (!GROUP_AT(rqgi, i))
+-                              GROUP_AT(gi, i) = exp->ex_anon_gid;
+-                      else
+-                              GROUP_AT(gi, i) = GROUP_AT(rqgi, i);
+-              }
++      if (!cred.cr_group_info)
++              return -ENOMEM;
++      ret = set_current_groups(cred.cr_group_info);
++      put_group_info(cred.cr_group_info);
++      if ((cred.cr_uid)) {
++              current->cap_effective =
++                      cap_drop_nfsd_set(current->cap_effective);
+       } else {
+-              gi = get_group_info(rqgi);
++              current->cap_effective =
++                      cap_raise_nfsd_set(current->cap_effective,
++                                         current->cap_permitted);
+       }
+-
+-      if (new->fsuid == (uid_t) -1)
+-              new->fsuid = exp->ex_anon_uid;
+-      if (new->fsgid == (gid_t) -1)
+-              new->fsgid = exp->ex_anon_gid;
+-
+-      ret = set_groups(new, gi);
+-      put_group_info(gi);
+-      if (ret < 0)
+-              goto error;
+-
+-      if (new->fsuid)
+-              new->cap_effective = cap_drop_nfsd_set(new->cap_effective);
+-      else
+-              new->cap_effective = cap_raise_nfsd_set(new->cap_effective,
+-                                                      new->cap_permitted);
+-      put_cred(override_creds(new));
+-      put_cred(new);
+-      return 0;
+-
+-oom:
+-      ret = -ENOMEM;
+-error:
+-      abort_creds(new);
+       return ret;
+ }
+-
+diff --git a/fs/nfsd/nfs4recover.c b/fs/nfsd/nfs4recover.c
+index 5275097..d80617f 100644
+--- a/fs/nfsd/nfs4recover.c
++++ b/fs/nfsd/nfs4recover.c
+@@ -48,32 +48,26 @@
+ #include <linux/sched.h>
+ #include <linux/mount.h>
+ 
+-#define NFSDDBG_FACILITY                NFSDDBG_PROC
++#define NFSDDBG_FACILITY              NFSDDBG_PROC
+ 
+ /* Globals */
+ static struct path rec_dir;
+ static int rec_dir_init = 0;
+ 
+-static int
+-nfs4_save_creds(const struct cred **original_creds)
++static void
++nfs4_save_user(uid_t *saveuid, gid_t *savegid)
+ {
+-      struct cred *new;
+-
+-      new = prepare_creds();
+-      if (!new)
+-              return -ENOMEM;
+-
+-      new->fsuid = 0;
+-      new->fsgid = 0;
+-      *original_creds = override_creds(new);
+-      put_cred(new);
+-      return 0;
++      *saveuid = current->fsuid;
++      *savegid = current->fsgid;
++      current->fsuid = 0;
++      current->fsgid = 0;
+ }
+ 
+ static void
+-nfs4_reset_creds(const struct cred *original)
++nfs4_reset_user(uid_t saveuid, gid_t savegid)
+ {
+-      revert_creds(original);
++      current->fsuid = saveuid;
++      current->fsgid = savegid;
+ }
+ 
+ static void
+@@ -135,9 +129,10 @@ nfsd4_sync_rec_dir(void)
+ int
+ nfsd4_create_clid_dir(struct nfs4_client *clp)
+ {
+-      const struct cred *original_cred;
+       char *dname = clp->cl_recdir;
+       struct dentry *dentry;
++      uid_t uid;
++      gid_t gid;
+       int status;
+ 
+       dprintk("NFSD: nfsd4_create_clid_dir for \"%s\"\n", dname);
+@@ -145,9 +140,7 @@ nfsd4_create_clid_dir(struct nfs4_client *clp)
+       if (!rec_dir_init || clp->cl_firststate)
+               return 0;
+ 
+-      status = nfs4_save_creds(&original_cred);
+-      if (status < 0)
+-              return status;
++      nfs4_save_user(&uid, &gid);
+ 
+       /* lock the parent */
+       mutex_lock(&rec_dir.dentry->d_inode->i_mutex);
+@@ -165,7 +158,7 @@ nfsd4_create_clid_dir(struct nfs4_client *clp)
+       status = mnt_want_write(rec_dir.mnt);
+       if (status)
+               goto out_put;
+-      status = vfs_mkdir(rec_dir.dentry->d_inode, dentry, S_IRWXU);
++      status = vfs_mkdir(rec_dir.dentry->d_inode, dentry, rec_dir.mnt, 
S_IRWXU);
+       mnt_drop_write(rec_dir.mnt);
+ out_put:
+       dput(dentry);
+@@ -175,7 +168,7 @@ out_unlock:
+               clp->cl_firststate = 1;
+               nfsd4_sync_rec_dir();
+       }
+-      nfs4_reset_creds(original_cred);
++      nfs4_reset_user(uid, gid);
+       dprintk("NFSD: nfsd4_create_clid_dir returns %d\n", status);
+       return status;
+ }
+@@ -208,22 +201,20 @@ nfsd4_build_namelist(void *arg, const char *name, int 
namlen,
+ static int
+ nfsd4_list_rec_dir(struct dentry *dir, recdir_func *f)
+ {
+-      const struct cred *original_cred;
+       struct file *filp;
+       LIST_HEAD(names);
+       struct name_list *entry;
+       struct dentry *dentry;
++      uid_t uid;
++      gid_t gid;
+       int status;
+ 
+       if (!rec_dir_init)
+               return 0;
+ 
+-      status = nfs4_save_creds(&original_cred);
+-      if (status < 0)
+-              return status;
++      nfs4_save_user(&uid, &gid);
+ 
+-      filp = dentry_open(dget(dir), mntget(rec_dir.mnt), O_RDONLY,
+-                         current_cred());
++      filp = dentry_open(dget(dir), mntget(rec_dir.mnt), O_RDONLY);
+       status = PTR_ERR(filp);
+       if (IS_ERR(filp))
+               goto out;
+@@ -252,7 +243,7 @@ out:
+               list_del(&entry->list);
+               kfree(entry);
+       }
+-      nfs4_reset_creds(original_cred);
++      nfs4_reset_user(uid, gid);
+       return status;
+ }
+ 
+@@ -273,7 +264,7 @@ nfsd4_unlink_clid_dir(char *name, int namlen)
+       status = -ENOENT;
+       if (!dentry->d_inode)
+               goto out;
+-      status = vfs_rmdir(rec_dir.dentry->d_inode, dentry);
++      status = vfs_rmdir(rec_dir.dentry->d_inode, dentry, rec_dir.mnt);
+ out:
+       dput(dentry);
+ out_unlock:
+@@ -284,7 +275,8 @@ out_unlock:
+ void
+ nfsd4_remove_clid_dir(struct nfs4_client *clp)
+ {
+-      const struct cred *original_cred;
++      uid_t uid;
++      gid_t gid;
+       int status;
+ 
+       if (!rec_dir_init || !clp->cl_firststate)
+@@ -295,12 +287,10 @@ nfsd4_remove_clid_dir(struct nfs4_client *clp)
+               goto out;
+       clp->cl_firststate = 0;
+ 
+-      status = nfs4_save_creds(&original_cred);
+-      if (status < 0)
+-              goto out;
++      nfs4_save_user(&uid, &gid);
+ 
+       status = nfsd4_unlink_clid_dir(clp->cl_recdir, HEXDIR_LEN-1);
+-      nfs4_reset_creds(original_cred);
++      nfs4_reset_user(uid, gid);
+       if (status == 0)
+               nfsd4_sync_rec_dir();
+       mnt_drop_write(rec_dir.mnt);
+@@ -320,7 +310,7 @@ purge_old(struct dentry *parent, struct dentry *child)
+       if (nfs4_has_reclaimed_state(child->d_name.name, false))
+               return 0;
+ 
+-      status = vfs_rmdir(parent->d_inode, child);
++      status = vfs_rmdir(parent->d_inode, child, rec_dir.mnt);
+       if (status)
+               printk("failed to remove client recovery directory %s\n",
+                               child->d_name.name);
+@@ -378,7 +368,8 @@ nfsd4_recdir_load(void) {
+ void
+ nfsd4_init_recdir(char *rec_dirname)
+ {
+-      const struct cred *original_cred;
++      uid_t uid;
++      gid_t gid;
+       int status;
+ 
+       printk("NFSD: Using %s as the NFSv4 state recovery directory\n",
+@@ -386,13 +377,7 @@ nfsd4_init_recdir(char *rec_dirname)
+ 
+       BUG_ON(rec_dir_init);
+ 
+-      status = nfs4_save_creds(&original_cred);
+-      if (status < 0) {
+-              printk("NFSD: Unable to change credentials to find recovery"
+-                     " directory: error %d\n",
+-                     status);
+-              return;
+-      }
++      nfs4_save_user(&uid, &gid);
+ 
+       status = kern_path(rec_dirname, LOOKUP_FOLLOW | LOOKUP_DIRECTORY,
+                       &rec_dir);
+@@ -402,7 +387,7 @@ nfsd4_init_recdir(char *rec_dirname)
+ 
+       if (!status)
+               rec_dir_init = 1;
+-      nfs4_reset_creds(original_cred);
++      nfs4_reset_user(uid, gid);
+ }
+ 
+ void
+diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
+index c65a27b..d84c232 100644
+--- a/fs/nfsd/nfs4state.c
++++ b/fs/nfsd/nfs4state.c
+@@ -1552,7 +1552,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct 
nfsd4_compound_state *cstate,
+               status = nfserr_clid_inuse;
+               if (!same_creds(&conf->cl_cred, &rqstp->rq_cred)) {
+                       dprintk("NFSD: setclientid: string in use by client"
+-                              " at %pI4\n", &conf->cl_addr);
++                              " at "NIPQUAD_FMT"\n", NIPQUAD(conf->cl_addr));
+                       goto out;
+               }
+       }
+diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
+index b820c31..e258472 100644
+--- a/fs/nfsd/nfs4xdr.c
++++ b/fs/nfsd/nfs4xdr.c
+@@ -1800,7 +1800,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export 
*exp,
+       }
+       if (bmval0 & (FATTR4_WORD0_ACL | FATTR4_WORD0_ACLSUPPORT
+                       | FATTR4_WORD0_SUPPORTED_ATTRS)) {
+-              err = nfsd4_get_nfs4_acl(rqstp, dentry, &acl);
++              err = nfsd4_get_nfs4_acl(rqstp, dentry, exp->ex_path.mnt, &acl);
+               aclsupport = (err == 0);
+               if (bmval0 & FATTR4_WORD0_ACL) {
+                       if (err == -EOPNOTSUPP)
+diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c
+index 9f1ca17..3702de6 100644
+--- a/fs/nfsd/nfsfh.c
++++ b/fs/nfsd/nfsfh.c
+@@ -186,14 +186,9 @@ static __be32 nfsd_set_fh_dentry(struct svc_rqst *rqstp, 
struct svc_fh *fhp)
+                * access control settings being in effect, we cannot
+                * fix that case easily.
+                */
+-              struct cred *new = prepare_creds();
+-              if (!new)
+-                      return nfserrno(-ENOMEM);
+-              new->cap_effective =
+-                      cap_raise_nfsd_set(new->cap_effective,
+-                                         new->cap_permitted);
+-              put_cred(override_creds(new));
+-              put_cred(new);
++              current->cap_effective =
++                      cap_raise_nfsd_set(current->cap_effective,
++                                         current->cap_permitted);
+       } else {
+               error = nfsd_setuser_and_check_port(rqstp, exp);
+               if (error)
+diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
+index 6c68ffd..4bc61db 100644
+--- a/fs/nfsd/vfs.c
++++ b/fs/nfsd/vfs.c
+@@ -393,7 +393,7 @@ nfsd_setattr(struct svc_rqst *rqstp, struct svc_fh *fhp, 
struct iattr *iap,
+       err = nfserr_notsync;
+       if (!check_guard || guardtime == inode->i_ctime.tv_sec) {
+               fh_lock(fhp);
+-              host_err = notify_change(dentry, iap);
++              host_err = notify_change(dentry, fhp->fh_export->ex_path.mnt, 
iap);
+               err = nfserrno(host_err);
+               fh_unlock(fhp);
+       }
+@@ -413,12 +413,12 @@ out_nfserr:
+ #if defined(CONFIG_NFSD_V2_ACL) || \
+     defined(CONFIG_NFSD_V3_ACL) || \
+     defined(CONFIG_NFSD_V4)
+-static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf)
++static ssize_t nfsd_getxattr(struct dentry *dentry, struct vfsmount *mnt, 
char *key, void **buf)
+ {
+       ssize_t buflen;
+       ssize_t ret;
+ 
+-      buflen = vfs_getxattr(dentry, key, NULL, 0);
++      buflen = vfs_getxattr(dentry, mnt, key, NULL, 0, NULL);
+       if (buflen <= 0)
+               return buflen;
+ 
+@@ -426,7 +426,7 @@ static ssize_t nfsd_getxattr(struct dentry *dentry, char 
*key, void **buf)
+       if (!*buf)
+               return -ENOMEM;
+ 
+-      ret = vfs_getxattr(dentry, key, *buf, buflen);
++      ret = vfs_getxattr(dentry, mnt, key, *buf, buflen, NULL);
+       if (ret < 0)
+               kfree(*buf);
+       return ret;
+@@ -435,7 +435,7 @@ static ssize_t nfsd_getxattr(struct dentry *dentry, char 
*key, void **buf)
+ 
+ #if defined(CONFIG_NFSD_V4)
+ static int
+-set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl *pacl, char *key)
++set_nfsv4_acl_one(struct dentry *dentry, struct vfsmount *mnt, struct 
posix_acl *pacl, char *key)
+ {
+       int len;
+       size_t buflen;
+@@ -454,7 +454,7 @@ set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl 
*pacl, char *key)
+               goto out;
+       }
+ 
+-      error = vfs_setxattr(dentry, key, buf, len, 0);
++      error = vfs_setxattr(dentry, mnt, key, buf, len, 0, NULL);
+ out:
+       kfree(buf);
+       return error;
+@@ -487,12 +487,12 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqstp, struct svc_fh 
*fhp,
+       } else if (host_error < 0)
+               goto out_nfserr;
+ 
+-      host_error = set_nfsv4_acl_one(dentry, pacl, POSIX_ACL_XATTR_ACCESS);
++      host_error = set_nfsv4_acl_one(dentry, fhp->fh_export->ex_path.mnt, 
pacl, POSIX_ACL_XATTR_ACCESS);
+       if (host_error < 0)
+               goto out_release;
+ 
+       if (S_ISDIR(inode->i_mode))
+-              host_error = set_nfsv4_acl_one(dentry, dpacl, 
POSIX_ACL_XATTR_DEFAULT);
++              host_error = set_nfsv4_acl_one(dentry, 
fhp->fh_export->ex_path.mnt, dpacl, POSIX_ACL_XATTR_DEFAULT);
+ 
+ out_release:
+       posix_acl_release(pacl);
+@@ -505,13 +505,13 @@ out_nfserr:
+ }
+ 
+ static struct posix_acl *
+-_get_posix_acl(struct dentry *dentry, char *key)
++_get_posix_acl(struct dentry *dentry, struct vfsmount *mnt, char *key)
+ {
+       void *buf = NULL;
+       struct posix_acl *pacl = NULL;
+       int buflen;
+ 
+-      buflen = nfsd_getxattr(dentry, key, &buf);
++      buflen = nfsd_getxattr(dentry, mnt, key, &buf);
+       if (!buflen)
+               buflen = -ENODATA;
+       if (buflen <= 0)
+@@ -523,14 +523,14 @@ _get_posix_acl(struct dentry *dentry, char *key)
+ }
+ 
+ int
+-nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct 
nfs4_acl **acl)
++nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct 
vfsmount *mnt, struct nfs4_acl **acl)
+ {
+       struct inode *inode = dentry->d_inode;
+       int error = 0;
+       struct posix_acl *pacl = NULL, *dpacl = NULL;
+       unsigned int flags = 0;
+ 
+-      pacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_ACCESS);
++      pacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_ACCESS);
+       if (IS_ERR(pacl) && PTR_ERR(pacl) == -ENODATA)
+               pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
+       if (IS_ERR(pacl)) {
+@@ -540,7 +540,7 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry 
*dentry, struct nfs4_ac
+       }
+ 
+       if (S_ISDIR(inode->i_mode)) {
+-              dpacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_DEFAULT);
++              dpacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_DEFAULT);
+               if (IS_ERR(dpacl) && PTR_ERR(dpacl) == -ENODATA)
+                       dpacl = NULL;
+               else if (IS_ERR(dpacl)) {
+@@ -677,7 +677,6 @@ __be32
+ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
+                       int access, struct file **filp)
+ {
+-      const struct cred *cred = current_cred();
+       struct dentry   *dentry;
+       struct inode    *inode;
+       int             flags = O_RDONLY|O_LARGEFILE;
+@@ -732,7 +731,7 @@ nfsd_open(struct svc_rqst *rqstp, struct svc_fh *fhp, int 
type,
+               vfs_dq_init(inode);
+       }
+       *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_path.mnt),
+-                          flags, cred);
++                          flags);
+       if (IS_ERR(*filp))
+               host_err = PTR_ERR(*filp);
+ out_nfserr:
+@@ -953,13 +952,13 @@ out:
+       return err;
+ }
+ 
+-static void kill_suid(struct dentry *dentry)
++static void kill_suid(struct dentry *dentry, struct vfsmount *mnt)
+ {
+       struct iattr    ia;
+       ia.ia_valid = ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
+ 
+       mutex_lock(&dentry->d_inode->i_mutex);
+-      notify_change(dentry, &ia);
++      notify_change(dentry, mnt, &ia);
+       mutex_unlock(&dentry->d_inode->i_mutex);
+ }
+ 
+@@ -1005,9 +1004,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh 
*fhp, struct file *file,
+       if (!EX_ISSYNC(exp))
+               stable = 0;
+       if (stable && !EX_WGATHER(exp)) {
+-              spin_lock(&file->f_lock);
+               file->f_flags |= O_SYNC;
+-              spin_unlock(&file->f_lock);
+       }
+ 
+       /* Write the data. */
+@@ -1021,7 +1018,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh 
*fhp, struct file *file,
+ 
+       /* clear setuid/setgid flag after write */
+       if (host_err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID)))
+-              kill_suid(dentry);
++              kill_suid(dentry, exp->ex_path.mnt);
+ 
+       if (host_err >= 0 && stable) {
+               static ino_t    last_ino;
+@@ -1300,13 +1297,13 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
+                       nfsd_check_ignore_resizing(iap);
+               break;
+       case S_IFDIR:
+-              host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
++              host_err = vfs_mkdir(dirp, dchild, fhp->fh_export->ex_path.mnt, 
iap->ia_mode);
+               break;
+       case S_IFCHR:
+       case S_IFBLK:
+       case S_IFIFO:
+       case S_IFSOCK:
+-              host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
++              host_err = vfs_mknod(dirp, dchild, fhp->fh_export->ex_path.mnt, 
iap->ia_mode, rdev);
+               break;
+       }
+       if (host_err < 0) {
+@@ -1577,11 +1574,11 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh 
*fhp,
+               else {
+                       strncpy(path_alloced, path, plen);
+                       path_alloced[plen] = 0;
+-                      host_err = vfs_symlink(dentry->d_inode, dnew, 
path_alloced);
++                      host_err = vfs_symlink(dentry->d_inode, dnew, 
fhp->fh_export->ex_path.mnt, path_alloced);
+                       kfree(path_alloced);
+               }
+       } else
+-              host_err = vfs_symlink(dentry->d_inode, dnew, path);
++              host_err = vfs_symlink(dentry->d_inode, dnew, 
fhp->fh_export->ex_path.mnt, path);
+ 
+       if (!host_err) {
+               if (EX_ISSYNC(fhp->fh_export))
+@@ -1647,7 +1644,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
+               err = nfserrno(host_err);
+               goto out_dput;
+       }
+-      host_err = vfs_link(dold, dirp, dnew);
++      host_err = vfs_link(dold, ffhp->fh_export->ex_path.mnt, dirp, dnew, 
tfhp->fh_export->ex_path.mnt);
+       if (!host_err) {
+               if (EX_ISSYNC(ffhp->fh_export)) {
+                       err = nfserrno(nfsd_sync_dir(ddir));
+@@ -1748,7 +1745,7 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, 
char *fname, int flen,
+       if (host_err)
+               goto out_dput_new;
+ 
+-      host_err = vfs_rename(fdir, odentry, tdir, ndentry);
++      host_err = vfs_rename(fdir, odentry, ffhp->fh_export->ex_path.mnt, 
tdir, ndentry, tfhp->fh_export->ex_path.mnt);
+       if (!host_err && EX_ISSYNC(tfhp->fh_export)) {
+               host_err = nfsd_sync_dir(tdentry);
+               if (!host_err)
+@@ -1826,9 +1823,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, 
int type,
+                       host_err = -EPERM;
+               } else
+ #endif
+-              host_err = vfs_unlink(dirp, rdentry);
++              host_err = vfs_unlink(dirp, rdentry, 
fhp->fh_export->ex_path.mnt);
+       } else { /* It's RMDIR */
+-              host_err = vfs_rmdir(dirp, rdentry);
++              host_err = vfs_rmdir(dirp, rdentry, 
fhp->fh_export->ex_path.mnt);
+       }
+ 
+       dput(rdentry);
+@@ -2185,7 +2182,7 @@ nfsd_get_posix_acl(struct svc_fh *fhp, int type)
+               return ERR_PTR(-EOPNOTSUPP);
+       }
+ 
+-      size = nfsd_getxattr(fhp->fh_dentry, name, &value);
++      size = nfsd_getxattr(fhp->fh_dentry, fhp->fh_export->ex_path.mnt, name, 
&value);
+       if (size < 0)
+               return ERR_PTR(size);
+ 
+@@ -2233,12 +2230,12 @@ nfsd_set_posix_acl(struct svc_fh *fhp, int type, 
struct posix_acl *acl)
+       if (error)
+               goto getout;
+       if (size)
+-              error = vfs_setxattr(fhp->fh_dentry, name, value, size, 0);
++              error = vfs_setxattr(fhp->fh_dentry, 
fhp->fh_export->ex_path.mnt, name, value, size, 0, NULL);
+       else {
+               if (!S_ISDIR(inode->i_mode) && type == ACL_TYPE_DEFAULT)
+                       error = 0;
+               else {
+-                      error = vfs_removexattr(fhp->fh_dentry, name);
++                      error = vfs_removexattr(fhp->fh_dentry, 
fhp->fh_export->ex_path.mnt, name, NULL);
+                       if (error == -ENODATA)
+                               error = 0;
+               }
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index fdffb41..230665a 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -425,7 +425,7 @@ extern const struct inode_operations 
nfs_dir_inode_operations;
+ extern const struct inode_operations nfs3_dir_inode_operations;
+ #endif /* CONFIG_NFS_V3 */
+ extern const struct file_operations nfs_dir_operations;
+-extern const struct dentry_operations nfs_dentry_operations;
++extern struct dentry_operations nfs_dentry_operations;
+ 
+ extern void nfs_force_lookup_revalidate(struct inode *dir);
+ extern int nfs_instantiate(struct dentry *dentry, struct nfs_fh *fh, struct 
nfs_fattr *fattr);
+diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
+index b89c34e..9708e78 100644
+--- a/include/linux/nfs_xdr.h
++++ b/include/linux/nfs_xdr.h
+@@ -817,7 +817,7 @@ struct nfs_access_entry;
+  */
+ struct nfs_rpc_ops {
+       u32     version;                /* Protocol version */
+-      const struct dentry_operations *dentry_ops;
++      struct dentry_operations *dentry_ops;
+       const struct inode_operations *dir_inode_ops;
+       const struct inode_operations *file_inode_ops;
+ 
+diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
+index 2b49d67..aab2d84 100644
+--- a/include/linux/nfsd/nfsd.h
++++ b/include/linux/nfsd/nfsd.h
+@@ -86,7 +86,7 @@ __be32               nfsd_setattr(struct svc_rqst *, struct 
svc_fh *,
+ #ifdef CONFIG_NFSD_V4
+ __be32          nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
+                     struct nfs4_acl *);
+-int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct 
nfs4_acl **);
++int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct 
vfsmount *, struct nfs4_acl **);
+ #endif /* CONFIG_NFSD_V4 */
+ __be32                nfsd_create(struct svc_rqst *, struct svc_fh *,
+                               char *name, int len, struct iattr *attrs,
+diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h
+index 0d9cb6e..66ac213 100644
+--- a/include/linux/sunrpc/svc_xprt.h
++++ b/include/linux/sunrpc/svc_xprt.h
+@@ -147,13 +147,13 @@ static inline char *__svc_print_addr(const struct 
sockaddr *addr,
+ 
+       switch (addr->sa_family) {
+       case AF_INET:
+-              snprintf(buf, len, "%pI4, port=%u", &sin->sin_addr,
++              snprintf(buf, len,  NIPQUAD_FMT", port=%u", 
NIPQUAD(sin->sin_addr),
+                       ntohs(sin->sin_port));
+               break;
+ 
+       case AF_INET6:
+-              snprintf(buf, len, "%pI6, port=%u",
+-                       &sin6->sin6_addr,
++              snprintf(buf, len, NIP6_FMT", port=%u",
++                      NIP6(sin6->sin6_addr),
+                       ntohs(sin6->sin6_port));
+               break;
+ 
+diff --git a/net/sunrpc/auth.c b/net/sunrpc/auth.c
+index 0c431c2..050e4e8 100644
+--- a/net/sunrpc/auth.c
++++ b/net/sunrpc/auth.c
+@@ -350,18 +350,16 @@ EXPORT_SYMBOL_GPL(rpcauth_lookup_credcache);
+ struct rpc_cred *
+ rpcauth_lookupcred(struct rpc_auth *auth, int flags)
+ {
+-      struct auth_cred acred;
++      struct auth_cred acred = {
++              .uid = current->fsuid,
++              .gid = current->fsgid,
++              .group_info = current->group_info,
++      };
+       struct rpc_cred *ret;
+-      const struct cred *cred = current_cred();
+ 
+       dprintk("RPC:       looking up %s cred\n",
+               auth->au_ops->au_name);
+-
+-      memset(&acred, 0, sizeof(acred));
+-      acred.uid = cred->fsuid;
+-      acred.gid = cred->fsgid;
+-      acred.group_info = get_group_info(((struct cred *)cred)->group_info);
+-
++      get_group_info(acred.group_info);
+       ret = auth->au_ops->lookup_cred(auth, &acred, flags);
+       put_group_info(acred.group_info);
+       return ret;
+diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
+index 5abab09..6555f87 100644
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -279,15 +279,15 @@ struct rpc_clnt *rpc_create(struct rpc_create_args *args)
+               case AF_INET: {
+                       struct sockaddr_in *sin =
+                                       (struct sockaddr_in *)args->address;
+-                      snprintf(servername, sizeof(servername), "%pI4",
+-                               &sin->sin_addr.s_addr);
++                      snprintf(servername, sizeof(servername),  NIPQUAD_FMT,
++                               NIPQUAD(sin->sin_addr.s_addr));
+                       break;
+               }
+               case AF_INET6: {
+                       struct sockaddr_in6 *sin =
+                                       (struct sockaddr_in6 *)args->address;
+-                      snprintf(servername, sizeof(servername), "%pI6",
+-                               &sin->sin6_addr);
++                      snprintf(servername, sizeof(servername), NIP6_FMT,
++                               NIP6(sin->sin6_addr));
+                       break;
+               }
+               default:
+diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
+index 9ced062..577385a 100644
+--- a/net/sunrpc/rpc_pipe.c
++++ b/net/sunrpc/rpc_pipe.c
+@@ -480,7 +480,7 @@ static int rpc_delete_dentry(struct dentry *dentry)
+       return 1;
+ }
+ 
+-static const struct dentry_operations rpc_dentry_operations = {
++static struct dentry_operations rpc_dentry_operations = {
+       .d_delete = rpc_delete_dentry,
+ };
+ 
+diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c
+index beee6da..f5674ff 100644
+--- a/net/sunrpc/rpcb_clnt.c
++++ b/net/sunrpc/rpcb_clnt.c
+@@ -271,8 +271,8 @@ static int rpcb_register_inet4(const struct sockaddr *sap,
+       char buf[32];
+ 
+       /* Construct AF_INET universal address */
+-      snprintf(buf, sizeof(buf), "%pI4.%u.%u",
+-               &sin->sin_addr.s_addr, port >> 8, port & 0xff);
++      snprintf(buf, sizeof(buf), NIPQUAD_FMT".%u.%u",
++               NIPQUAD(sin->sin_addr.s_addr), port >> 8, port & 0xff);
+       map->r_addr = buf;
+ 
+       dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
+@@ -303,8 +303,8 @@ static int rpcb_register_inet6(const struct sockaddr *sap,
+               snprintf(buf, sizeof(buf), "::.%u.%u",
+                               port >> 8, port & 0xff);
+       else
+-              snprintf(buf, sizeof(buf), "%pI6.%u.%u",
+-                       &sin6->sin6_addr, port >> 8, port & 0xff);
++              snprintf(buf, sizeof(buf), NIP6_FMT".%u.%u",
++                       NIP6(sin6->sin6_addr), port >> 8, port & 0xff);
+       map->r_addr = buf;
+ 
+       dprintk("RPC:       %sregistering [%u, %u, %s, '%s'] with "
+@@ -433,8 +433,8 @@ int rpcb_getport_sync(struct sockaddr_in *sin, u32 prog, 
u32 vers, int prot)
+       struct rpc_clnt *rpcb_clnt;
+       int status;
+ 
+-      dprintk("RPC:       %s(%pI4, %u, %u, %d)\n",
+-              __func__, &sin->sin_addr.s_addr, prog, vers, prot);
++      dprintk("RPC:       %s("NIPQUAD_FMT", %u, %u, %d)\n",
++              __func__, NIPQUAD(sin->sin_addr.s_addr), prog, vers, prot);
+ 
+       rpcb_clnt = rpcb_create(NULL, (struct sockaddr *)sin,
+                               sizeof(*sin), prot, RPCBVERS_2);
+diff --git a/net/sunrpc/svcauth_unix.c b/net/sunrpc/svcauth_unix.c
+index 5c865e2..02c4bce 100644
+--- a/net/sunrpc/svcauth_unix.c
++++ b/net/sunrpc/svcauth_unix.c
+@@ -162,9 +162,9 @@ static void ip_map_request(struct cache_detail *cd,
+       struct ip_map *im = container_of(h, struct ip_map, h);
+ 
+       if (ipv6_addr_v4mapped(&(im->m_addr))) {
+-              snprintf(text_addr, 20, "%pI4", &im->m_addr.s6_addr32[3]);
++              snprintf(text_addr, 20, NIPQUAD_FMT, 
NIPQUAD(im->m_addr.s6_addr32[3]));
+       } else {
+-              snprintf(text_addr, 40, "%pI6", &im->m_addr);
++              snprintf(text_addr, 40, NIP6_FMT, NIP6(im->m_addr));
+       }
+       qword_add(bpp, blen, im->m_class);
+       qword_add(bpp, blen, text_addr);
+@@ -274,10 +274,10 @@ static int ip_map_show(struct seq_file *m,
+               dom = im->m_client->h.name;
+ 
+       if (ipv6_addr_v4mapped(&addr)) {
+-              seq_printf(m, "%s %pI4 %s\n",
+-                      im->m_class, &addr.s6_addr32[3], dom);
++              seq_printf(m, "%s "NIPQUAD_FMT" %s\n",
++                      im->m_class, NIPQUAD(addr.s6_addr32[3]), dom);
+       } else {
+-              seq_printf(m, "%s %pI6 %s\n", im->m_class, &addr, dom);
++              seq_printf(m, "%s "NIP6_FMT" %s\n", im->m_class, NIP6(addr), 
dom);
+       }
+       return 0;
+ }
+diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
+index af31988..21c266e 100644
+--- a/net/sunrpc/svcsock.c
++++ b/net/sunrpc/svcsock.c
+@@ -246,10 +246,10 @@ static int one_sock_name(char *buf, struct svc_sock 
*svsk)
+ 
+       switch(svsk->sk_sk->sk_family) {
+       case AF_INET:
+-              len = sprintf(buf, "ipv4 %s %pI4 %d\n",
++              len = sprintf(buf, "ipv4 %s "NIPQUAD_FMT" %d\n",
+                             svsk->sk_sk->sk_protocol == IPPROTO_UDP ?
+                             "udp" : "tcp",
+-                            &inet_sk(svsk->sk_sk)->rcv_saddr,
++                            NIPQUAD(inet_sk(svsk->sk_sk)->rcv_saddr),
+                             inet_sk(svsk->sk_sk)->num);
+               break;
+       default:
+diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c 
b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+index 3d810e7..41b93e9 100644
+--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
++++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
+@@ -1048,21 +1048,21 @@ static struct svc_xprt *svc_rdma_accept(struct 
svc_xprt *xprt)
+ 
+       dprintk("svcrdma: new connection %p accepted with the following "
+               "attributes:\n"
+-              "    local_ip        : %pI4\n"
++              "    local_ip        : "NIPQUAD_FMT"\n"
+               "    local_port      : %d\n"
+-              "    remote_ip       : %pI4\n"
++              "    remote_ip       : "NIPQUAD_FMT"\n"
+               "    remote_port     : %d\n"
+               "    max_sge         : %d\n"
+               "    sq_depth        : %d\n"
+               "    max_requests    : %d\n"
+               "    ord             : %d\n",
+               newxprt,
+-              &((struct sockaddr_in *)&newxprt->sc_cm_id->
+-                       route.addr.src_addr)->sin_addr.s_addr,
++              NIPQUAD(((struct sockaddr_in *)&newxprt->sc_cm_id->
++                       route.addr.src_addr)->sin_addr.s_addr),
+               ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
+                      route.addr.src_addr)->sin_port),
+-              &((struct sockaddr_in *)&newxprt->sc_cm_id->
+-                       route.addr.dst_addr)->sin_addr.s_addr,
++              NIPQUAD(((struct sockaddr_in *)&newxprt->sc_cm_id->
++                       route.addr.dst_addr)->sin_addr.s_addr),
+               ntohs(((struct sockaddr_in *)&newxprt->sc_cm_id->
+                      route.addr.dst_addr)->sin_port),
+               newxprt->sc_max_sge,
+diff --git a/net/sunrpc/xprtrdma/transport.c b/net/sunrpc/xprtrdma/transport.c
+index 1dd6123..cc21d83 100644
+--- a/net/sunrpc/xprtrdma/transport.c
++++ b/net/sunrpc/xprtrdma/transport.c
+@@ -174,7 +174,7 @@ xprt_rdma_format_addresses(struct rpc_xprt *xprt)
+ 
+       buf = kzalloc(20, GFP_KERNEL);
+       if (buf)
+-              snprintf(buf, 20, "%pI4", &addr->sin_addr.s_addr);
++              snprintf(buf, 20,  NIPQUAD_FMT, NIPQUAD(addr->sin_addr.s_addr));
+       xprt->address_strings[RPC_DISPLAY_ADDR] = buf;
+ 
+       buf = kzalloc(8, GFP_KERNEL);
+@@ -186,8 +186,8 @@ xprt_rdma_format_addresses(struct rpc_xprt *xprt)
+ 
+       buf = kzalloc(48, GFP_KERNEL);
+       if (buf)
+-              snprintf(buf, 48, "addr=%pI4 port=%u proto=%s",
+-                      &addr->sin_addr.s_addr,
++              snprintf(buf, 48, "addr="NIPQUAD_FMT" port=%u proto=%s",
++                      NIPQUAD(addr->sin_addr.s_addr),
+                       ntohs(addr->sin_port), "rdma");
+       xprt->address_strings[RPC_DISPLAY_ALL] = buf;
+ 
+@@ -204,8 +204,8 @@ xprt_rdma_format_addresses(struct rpc_xprt *xprt)
+ 
+       buf = kzalloc(30, GFP_KERNEL);
+       if (buf)
+-              snprintf(buf, 30, "%pI4.%u.%u",
+-                      &addr->sin_addr.s_addr,
++              snprintf(buf, 30, NIPQUAD_FMT".%u.%u",
++                      NIPQUAD(addr->sin_addr.s_addr),
+                       ntohs(addr->sin_port) >> 8,
+                       ntohs(addr->sin_port) & 0xff);
+       xprt->address_strings[RPC_DISPLAY_UNIVERSAL_ADDR] = buf;
+@@ -369,8 +369,8 @@ xprt_setup_rdma(struct xprt_create *args)
+       if (ntohs(sin->sin_port) != 0)
+               xprt_set_bound(xprt);
+ 
+-      dprintk("RPC:       %s: %pI4:%u\n",
+-              __func__, &sin->sin_addr.s_addr, ntohs(sin->sin_port));
++      dprintk("RPC:       %s: "NIPQUAD_FMT":%u\n",
++              __func__, NIPQUAD(sin->sin_addr.s_addr), ntohs(sin->sin_port));
+ 
+       /* Set max requests */
+       cdata.max_requests = xprt->max_reqs;
+diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
+index 3b21e0c..5d234d6 100644
+--- a/net/sunrpc/xprtrdma/verbs.c
++++ b/net/sunrpc/xprtrdma/verbs.c
+@@ -325,11 +325,11 @@ rpcrdma_conn_upcall(struct rdma_cm_id *id, struct 
rdma_cm_event *event)
+       case RDMA_CM_EVENT_DEVICE_REMOVAL:
+               connstate = -ENODEV;
+ connected:
+-              dprintk("RPC:       %s: %s: %pI4:%u (ep 0x%p event 0x%x)\n",
++              dprintk("RPC:       %s: %s: "NIPQUAD_FMT":%u (ep 0x%p event 
0x%x)\n",
+                       __func__,
+                       (event->event <= 11) ? conn[event->event] :
+                                               "unknown connection error",
+-                      &addr->sin_addr.s_addr,
++                      NIPQUAD(addr->sin_addr.s_addr),
+                       ntohs(addr->sin_port),
+                       ep, event->event);
+               atomic_set(&rpcx_to_rdmax(ep->rep_xprt)->rx_buf.rb_credits, 1);
+@@ -349,17 +349,17 @@ connected:
+       if (connstate == 1) {
+               int ird = attr.max_dest_rd_atomic;
+               int tird = ep->rep_remote_cma.responder_resources;
+-              printk(KERN_INFO "rpcrdma: connection to %pI4:%u "
++              printk(KERN_INFO "rpcrdma: connection to "NIPQUAD_FMT":%u "
+                       "on %s, memreg %d slots %d ird %d%s\n",
+-                      &addr->sin_addr.s_addr,
++                      NIPQUAD(addr->sin_addr.s_addr),
+                       ntohs(addr->sin_port),
+                       ia->ri_id->device->name,
+                       ia->ri_memreg_strategy,
+                       xprt->rx_buf.rb_max_requests,
+                       ird, ird < 4 && ird < tird / 2 ? " (low!)" : "");
+       } else if (connstate < 0) {
+-              printk(KERN_INFO "rpcrdma: connection to %pI4:%u closed (%d)\n",
+-                      &addr->sin_addr.s_addr,
++              printk(KERN_INFO "rpcrdma: connection to "NIPQUAD_FMT":%u 
closed (%d)\n",
++                      NIPQUAD(addr->sin_addr.s_addr),
+                       ntohs(addr->sin_port),
+                       connstate);
+       }
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index e185961..2de8b4e 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -295,7 +295,7 @@ static void xs_format_ipv4_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(20, GFP_KERNEL);
+       if (buf) {
+-              snprintf(buf, 20, "%pI4", &addr->sin_addr.s_addr);
++              snprintf(buf, 20, NIPQUAD_FMT, NIPQUAD(addr->sin_addr.s_addr));
+       }
+       xprt->address_strings[RPC_DISPLAY_ADDR] = buf;
+ 
+@@ -310,8 +310,8 @@ static void xs_format_ipv4_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(48, GFP_KERNEL);
+       if (buf) {
+-              snprintf(buf, 48, "addr=%pI4 port=%u proto=%s",
+-                      &addr->sin_addr.s_addr,
++              snprintf(buf, 48, "addr="NIPQUAD_FMT" port=%u proto=%s",
++                      NIPQUAD(addr->sin_addr.s_addr),
+                       ntohs(addr->sin_port),
+                       protocol);
+       }
+@@ -333,8 +333,8 @@ static void xs_format_ipv4_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(30, GFP_KERNEL);
+       if (buf) {
+-              snprintf(buf, 30, "%pI4.%u.%u",
+-                              &addr->sin_addr.s_addr,
++              snprintf(buf, 30, NIPQUAD_FMT".%u.%u",
++                              NIPQUAD(addr->sin_addr.s_addr),
+                               ntohs(addr->sin_port) >> 8,
+                               ntohs(addr->sin_port) & 0xff);
+       }
+@@ -352,7 +352,7 @@ static void xs_format_ipv6_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(40, GFP_KERNEL);
+       if (buf) {
+-              snprintf(buf, 40, "%pI6",&addr->sin6_addr);
++              snprintf(buf, 40, NIP6_FMT, NIP6(addr->sin6_addr));
+       }
+       xprt->address_strings[RPC_DISPLAY_ADDR] = buf;
+ 
+@@ -367,8 +367,8 @@ static void xs_format_ipv6_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(64, GFP_KERNEL);
+       if (buf) {
+-              snprintf(buf, 64, "addr=%pI6 port=%u proto=%s",
+-                              &addr->sin6_addr,
++              snprintf(buf, 64, "addr="NIP6_FMT" port=%u proto=%s",
++                              NIP6(addr->sin6_addr),
+                               ntohs(addr->sin6_port),
+                               protocol);
+       }
+@@ -376,7 +376,7 @@ static void xs_format_ipv6_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(36, GFP_KERNEL);
+       if (buf)
+-              snprintf(buf, 36, "%pi6", &addr->sin6_addr);
++              snprintf(buf, 36, NIP6_FMT, NIP6(addr->sin6_addr));
+ 
+       xprt->address_strings[RPC_DISPLAY_HEX_ADDR] = buf;
+ 
+@@ -389,8 +389,8 @@ static void xs_format_ipv6_peer_addresses(struct rpc_xprt 
*xprt,
+ 
+       buf = kzalloc(50, GFP_KERNEL);
+       if (buf) {
+-              snprintf(buf, 50, "%pI6.%u.%u",
+-                       &addr->sin6_addr,
++              snprintf(buf, 50, NIP6_FMT".%u.%u",
++                       NIP6(addr->sin6_addr),
+                        ntohs(addr->sin6_port) >> 8,
+                        ntohs(addr->sin6_port) & 0xff);
+       }
+@@ -1477,8 +1477,8 @@ static int xs_bind4(struct sock_xprt *transport, struct 
socket *sock)
+               if (port > last)
+                       nloop++;
+       } while (err == -EADDRINUSE && nloop != 2);
+-      dprintk("RPC:       %s %pI4:%u: %s (%d)\n",
+-                      __func__, &myaddr.sin_addr,
++      dprintk("RPC:       %s "NIPQUAD_FMT":%u: %s (%d)\n",
++                      __func__, NIPQUAD(myaddr.sin_addr),
+                       port, err ? "failed" : "ok", err);
+       return err;
+ }
+@@ -1510,8 +1510,8 @@ static int xs_bind6(struct sock_xprt *transport, struct 
socket *sock)
+               if (port > last)
+                       nloop++;
+       } while (err == -EADDRINUSE && nloop != 2);
+-      dprintk("RPC:       xs_bind6 %pI6:%u: %s (%d)\n",
+-              &myaddr.sin6_addr, port, err ? "failed" : "ok", err);
++      dprintk("RPC:       xs_bind6 "NIP6_FMT":%u: %s (%d)\n",
++              NIP6(myaddr.sin6_addr), port, err ? "failed" : "ok", err);
+       return err;
+ }
+ 
_______________________________________________
ewg mailing list
[email protected]
http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ewg

Reply via email to