Author: czarny                       Date: Thu Aug 23 12:10:40 2007 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
- wholla lotta patches from kernel.spec into desktop version
- unionfs upped to 2.1.2_for_2.6.22.4

---- Files affected:
SOURCES:
   kernel-desktop-CITI_NFS4_ALL.patch (NONE -> 1.1)  (NEW), 
kernel-desktop-forcedeth-WON.patch (NONE -> 1.1)  (NEW), 
kernel-desktop-hostap.patch (NONE -> 1.1)  (NEW), kernel-desktop-NFS_ALL.patch 
(NONE -> 1.1)  (NEW), kernel-desktop-PF_RING.patch (NONE -> 1.1)  (NEW), 
kernel-desktop-routes.patch (NONE -> 1.1)  (NEW), 
kernel-desktop-toshiba-acpi.patch (NONE -> 1.1)  (NEW), 
kernel-desktop-ueagle-atm-freezer.patch (NONE -> 1.1)  (NEW), 
kernel-desktop-unionfs.patch (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/kernel-desktop-CITI_NFS4_ALL.patch
diff -u /dev/null SOURCES/kernel-desktop-CITI_NFS4_ALL.patch:1.1
--- /dev/null   Thu Aug 23 14:10:40 2007
+++ SOURCES/kernel-desktop-CITI_NFS4_ALL.patch  Thu Aug 23 14:10:35 2007
@@ -0,0 +1,1999 @@
+Changes since 2.6.22-rc1-CITI_NFS4_ALL-1
+       - update to 2.6.22-rc5
+       - allow id-squashing options to vary per pseudoflavor
+       - enforce requirement that flags other than ro/rw and
+         id-squashing flags not vary per pseudoflavor
+       - meelap: vary maximum delegation limit by RAM size
+       - meelap: don't grant delegations on files that saw conflicts
+       - silence a compiler warning in ACL code
+       - bhalevy: fix enc_stateid_sz for nfsd callbacks
+       - fix mishandling of acl errors that could cause an oops
+       - make all export finding function return -errno's on err
+       - show flavor info in /proc/net/rpc/nfsd.export/content
+       - miscellaneous cleanup
+
+---
+
+ b/fs/Kconfig                            |    1 
+ b/fs/lockd/svc.c                        |   31 ++-
+ b/fs/locks.c                            |   23 +-
+ b/fs/nfs/file.c                         |    4 
+ b/fs/nfsd/auth.c                        |   18 +-
+ b/fs/nfsd/export.c                      |  284 
++++++++++++++++++++++++++------
+ b/fs/nfsd/lockd.c                       |    1 
+ b/fs/nfsd/nfs4acl.c                     |   12 +
+ b/fs/nfsd/nfs4callback.c                |    2 
+ b/fs/nfsd/nfs4idmap.c                   |   13 +
+ b/fs/nfsd/nfs4proc.c                    |   34 +++
+ b/fs/nfsd/nfs4state.c                   |   28 ++-
+ b/fs/nfsd/nfs4xdr.c                     |   99 +++++++++++
+ b/fs/nfsd/nfsctl.c                      |    1 
+ b/fs/nfsd/nfsfh.c                       |   32 ++-
+ b/fs/nfsd/nfsproc.c                     |    3 
+ b/fs/nfsd/nfssvc.c                      |   10 +
+ b/fs/nfsd/vfs.c                         |  110 ++++++------
+ b/fs/open.c                             |   16 +
+ b/include/linux/fs.h                    |    2 
+ b/include/linux/lockd/bind.h            |    9 +
+ b/include/linux/nfsd/export.h           |   41 ++++
+ b/include/linux/nfsd/nfsd.h             |    9 -
+ b/include/linux/nfsd/state.h            |    3 
+ b/include/linux/nfsd/xdr4.h             |    7 
+ b/include/linux/sunrpc/gss_api.h        |    1 
+ b/include/linux/sunrpc/svc.h            |    2 
+ b/include/linux/sunrpc/svcauth.h        |    1 
+ b/include/linux/sunrpc/svcauth_gss.h    |    2 
+ b/net/sunrpc/auth_gss/gss_krb5_mech.c   |    1 
+ b/net/sunrpc/auth_gss/gss_mech_switch.c |   15 +
+ b/net/sunrpc/auth_gss/gss_spkm3_mech.c  |    1 
+ b/net/sunrpc/auth_gss/svcauth_gss.c     |   32 +++
+ b/net/sunrpc/svcauth_unix.c             |    7 
+ include/linux/nfsd/interface.h          |   13 -
+ 36 files changed, 693 insertions(+), 177 deletions(-)
+
+diff --git a/fs/Kconfig b/fs/Kconfig
+index 0fa0c11..76cf825 100644
+--- a/fs/Kconfig
++++ b/fs/Kconfig
+@@ -1675,6 +1675,7 @@ config NFSD_V3_ACL
+ config NFSD_V4
+       bool "Provide NFSv4 server support (EXPERIMENTAL)"
+       depends on NFSD_V3 && EXPERIMENTAL
++      select RPCSEC_GSS_KRB5
+       help
+         If you would like to include the NFSv4 server as well as the NFSv2
+         and NFSv3 servers, say Y here.  This feature is experimental, and
+diff --git a/fs/lockd/svc.c b/fs/lockd/svc.c
+index 126b1bf..6378572 100644
+--- a/fs/lockd/svc.c
++++ b/fs/lockd/svc.c
+@@ -75,18 +75,35 @@ static const int           nlm_port_min = 0, nlm_port_max 
= 65535;
+ 
+ static struct ctl_table_header * nlm_sysctl_table;
+ 
+-static unsigned long set_grace_period(void)
++static time_t get_lockd_grace_period(void)
+ {
+-      unsigned long grace_period;
+-
+       /* Note: nlm_timeout should always be nonzero */
+       if (nlm_grace_period)
+-              grace_period = ((nlm_grace_period + nlm_timeout - 1)
+-                              / nlm_timeout) * nlm_timeout * HZ;
++              return ((nlm_grace_period + nlm_timeout - 1)
++                              / nlm_timeout) * nlm_timeout;
+       else
+-              grace_period = nlm_timeout * 5 * HZ;
++              return nlm_timeout * 5;
++}
++
++time_t get_nfs_grace_period(void)
++{
++      time_t lockdgrace = get_lockd_grace_period();
++      time_t nfsdgrace = 0;
++
++      if (nlmsvc_ops)
++              nfsdgrace = nlmsvc_ops->get_grace_period();
++
++      return max(lockdgrace, nfsdgrace);
++}
++EXPORT_SYMBOL(get_nfs_grace_period);
++
++static unsigned long set_grace_period(void)
++{
++      time_t grace_period;
++
++      grace_period = get_nfs_grace_period();
+       nlmsvc_grace_period = 1;
+-      return grace_period + jiffies;
++      return grace_period * HZ + jiffies;
+ }
+ 
+ static inline void clear_grace_period(void)
+diff --git a/fs/locks.c b/fs/locks.c
+index 431a8b8..bcc37b9 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -661,7 +661,7 @@ static int locks_block_on_timeout(struct file_lock 
*blocker, struct file_lock *w
+       return result;
+ }
+ 
+-int
++void
+ posix_test_lock(struct file *filp, struct file_lock *fl)
+ {
+       struct file_lock *cfl;
+@@ -670,17 +670,15 @@ posix_test_lock(struct file *filp, struct file_lock *fl)
+       for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = 
cfl->fl_next) {
+               if (!IS_POSIX(cfl))
+                       continue;
+-              if (posix_locks_conflict(cfl, fl))
++              if (posix_locks_conflict(fl, cfl))
+                       break;
+       }
+-      if (cfl) {
++      if (cfl)
+               __locks_copy_lock(fl, cfl);
+-              unlock_kernel();
+-              return 1;
+-      } else
++      else
+               fl->fl_type = F_UNLCK;
+       unlock_kernel();
+-      return 0;
++      return;
+ }
+ 
+ EXPORT_SYMBOL(posix_test_lock);
+@@ -823,7 +821,7 @@ static int __posix_lock_file(struct inode *inode, struct 
file_lock *request, str
+       lock_kernel();
+       if (request->fl_type != F_UNLCK) {
+               for_each_lock(inode, before) {
+-                      struct file_lock *fl = *before;
++                      fl = *before;
+                       if (!IS_POSIX(fl))
+                               continue;
+                       if (!posix_locks_conflict(request, fl))
+@@ -1169,9 +1167,9 @@ static void time_out_leases(struct inode *inode)
+  *    @inode: the inode of the file to return
+  *    @mode: the open mode (read or write)
+  *
+- *    break_lease (inlined for speed) has checked there already
+- *    is a lease on this file.  Leases are broken on a call to open()
+- *    or truncate().  This function can sleep unless you
++ *    break_lease (inlined for speed) has checked there already is at least
++ *    some kind of lock (maybe a lease) on this file.  Leases are broken on
++ *    a call to open() or truncate().  This function can sleep unless you
+  *    specified %O_NONBLOCK to your open().
+  */
+ int __break_lease(struct inode *inode, unsigned int mode)
+@@ -1597,8 +1595,7 @@ asmlinkage long sys_flock(unsigned int fd, unsigned int 
cmd)
+ /**
+  * vfs_test_lock - test file byte range lock
+  * @filp: The file to test lock for
+- * @fl: The lock to test
+- * @conf: Place to return a copy of the conflicting lock, if found
++ * @fl: The lock to test; also used to hold result
+  *
+  * Returns -ERRNO on failure.  Indicates presence of conflicting lock by
+  * setting conf->fl_type to something other than F_UNLCK.
+diff --git a/fs/nfs/file.c b/fs/nfs/file.c
+index 9eb8eb4..5b24e88 100644
+--- a/fs/nfs/file.c
++++ b/fs/nfs/file.c
+@@ -397,7 +397,9 @@ static int do_getlk(struct file *filp, int cmd, struct 
file_lock *fl)
+ 
+       lock_kernel();
+       /* Try local locking first */
+-      if (posix_test_lock(filp, fl)) {
++      posix_test_lock(filp, fl);
++      if (fl->fl_type != F_UNLCK) {
++              /* found a conflict */
+               goto out;
+       }
+ 
+diff --git a/fs/nfsd/auth.c b/fs/nfsd/auth.c
+index 6e92b0f..cf61dc8 100644
+--- a/fs/nfsd/auth.c
++++ b/fs/nfsd/auth.c
+@@ -12,17 +12,31 @@
+ 
+ #define       CAP_NFSD_MASK (CAP_FS_MASK|CAP_TO_MASK(CAP_SYS_RESOURCE))
+ 
++static int nfsexp_flags(struct svc_rqst *rqstp, struct svc_export *exp)
++{
++      struct exp_flavor_info *f;
++      struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors;
++
++      for (f = exp->ex_flavors; f < end; f++) {
++              if (f->pseudoflavor == rqstp->rq_flavor)
++                      return f->flags;
++      }
++      return exp->ex_flags;
++
++}
++
+ int nfsd_setuser(struct svc_rqst *rqstp, struct svc_export *exp)
+ {
+       struct svc_cred cred = rqstp->rq_cred;
+       int i;
++      int flags = nfsexp_flags(rqstp, exp);
+       int ret;
+ 
+-      if (exp->ex_flags & NFSEXP_ALLSQUASH) {
++      if (flags & NFSEXP_ALLSQUASH) {
+               cred.cr_uid = exp->ex_anon_uid;
+               cred.cr_gid = exp->ex_anon_gid;
+               cred.cr_group_info = groups_alloc(0);
+-      } else if (exp->ex_flags & NFSEXP_ROOTSQUASH) {
++      } else if (flags & NFSEXP_ROOTSQUASH) {
+               struct group_info *gi;
+               if (!cred.cr_uid)
+                       cred.cr_uid = exp->ex_anon_uid;
+diff --git a/fs/nfsd/export.c b/fs/nfsd/export.c
+index 79bd03b..d9ed7f1 100644
+--- a/fs/nfsd/export.c
++++ b/fs/nfsd/export.c
+@@ -32,6 +32,8 @@
+ #include <linux/nfsd/nfsfh.h>
+ #include <linux/nfsd/syscall.h>
+ #include <linux/lockd/bind.h>
++#include <linux/sunrpc/msg_prot.h>
++#include <linux/sunrpc/gss_api.h>
+ 
+ #define NFSDDBG_FACILITY      NFSDDBG_EXPORT
+ 
+@@ -451,8 +453,46 @@ out_free_all:
+       return err;
+ }
+ 
++static int secinfo_parse(char **mesg, char *buf, struct svc_export *exp)
++{
++      int listsize, err;
++      struct exp_flavor_info *f;
++
++      err = get_int(mesg, &listsize);
++      if (err)
++              return err;
++      if (listsize < 0 || listsize > MAX_SECINFO_LIST)
++              return -EINVAL;
++
++      for (f=exp->ex_flavors; f < exp->ex_flavors + listsize; f++) {
++              err = get_int(mesg, &f->pseudoflavor);
++              if (err)
++                      return err;
++              /*
++               * Just a quick sanity check; we could also try to check
++               * whether this pseudoflavor is supported, but at worst
++               * an unsupported pseudoflavor on the export would just
++               * be a pseudoflavor that won't match the flavor of any
++               * authenticated request.  The administrator will
++               * probably discover the problem when someone fails to
++               * authenticate.
++               */
++              if (f->pseudoflavor < 0)
++                      return -EINVAL;
++              err = get_int(mesg, &f->flags);
++              if (err)
++                      return err;
++              /* Only some flags are allowed to differ between flavors: */
++              if (~NFSEXP_SECINFO_FLAGS & (f->flags ^ exp->ex_flags))
++                      return -EINVAL;
++      }
++      exp->ex_nflavors = listsize;
++      return 0;
++}
++
+ #else /* CONFIG_NFSD_V4 */
+ static inline int fsloc_parse(char **mesg, char *buf, struct 
nfsd4_fs_locations *fsloc) { return 0; }
++static inline int secinfo_parse(char **mesg, char *buf, struct svc_export 
*exp) { return 0; }
+ #endif
+ 
+ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
+@@ -476,6 +516,9 @@ static int svc_export_parse(struct cache_detail *cd, char 
*mesg, int mlen)
+ 
+       exp.ex_uuid = NULL;
+ 
++      /* secinfo */
++      exp.ex_nflavors = 0;
++
+       if (mesg[mlen-1] != '\n')
+               return -EINVAL;
+       mesg[mlen-1] = 0;
+@@ -553,7 +596,9 @@ static int svc_export_parse(struct cache_detail *cd, char 
*mesg, int mlen)
+                                       if (exp.ex_uuid == NULL)
+                                               err = -ENOMEM;
+                               }
+-                      } else
++                      } else if (strcmp(buf, "secinfo") == 0)
++                              err = secinfo_parse(&mesg, buf, &exp);
++                      else
+                               /* quietly ignore unknown words and anything
+                                * following. Newer user-space can try to set
+                                * new values, then see what the result was.
+@@ -593,6 +638,7 @@ static int svc_export_parse(struct cache_detail *cd, char 
*mesg, int mlen)
+ 
+ static void exp_flags(struct seq_file *m, int flag, int fsid,
+               uid_t anonu, uid_t anong, struct nfsd4_fs_locations *fslocs);
++static void show_secinfo(struct seq_file *m, struct svc_export *exp);
+ 
+ static int svc_export_show(struct seq_file *m,
+                          struct cache_detail *cd,
+@@ -622,6 +668,7 @@ static int svc_export_show(struct seq_file *m,
+                               seq_printf(m, "%02x", exp->ex_uuid[i]);
+                       }
+               }
++              show_secinfo(m, exp);
+       }
+       seq_puts(m, ")\n");
+       return 0;
+@@ -654,6 +701,7 @@ static void export_update(struct cache_head *cnew, struct 
cache_head *citem)
+ {
+       struct svc_export *new = container_of(cnew, struct svc_export, h);
+       struct svc_export *item = container_of(citem, struct svc_export, h);
++      int i;
+ 
+       new->ex_flags = item->ex_flags;
+       new->ex_anon_uid = item->ex_anon_uid;
+@@ -669,6 +717,10 @@ static void export_update(struct cache_head *cnew, struct 
cache_head *citem)
+       item->ex_fslocs.locations_count = 0;
+       new->ex_fslocs.migrated = item->ex_fslocs.migrated;
+       item->ex_fslocs.migrated = 0;
++      new->ex_nflavors = item->ex_nflavors;
++      for (i = 0; i < MAX_SECINFO_LIST; i++){
++              new->ex_flavors[i] = item->ex_flavors[i];
++      }
+ }
+ 
+ static struct cache_head *svc_export_alloc(void)
+@@ -738,16 +790,18 @@ exp_find_key(svc_client *clp, int fsid_type, u32 *fsidv, 
struct cache_req *reqp)
+       int err;
+       
+       if (!clp)
+-              return NULL;
++              return ERR_PTR(-ENOENT);
+ 
+       key.ek_client = clp;
+       key.ek_fsidtype = fsid_type;
+       memcpy(key.ek_fsid, fsidv, key_len(fsid_type));
+ 
+       ek = svc_expkey_lookup(&key);
+-      if (ek != NULL)
+-              if ((err = cache_check(&svc_expkey_cache, &ek->h, reqp)))
+-                      ek = ERR_PTR(err);
++      if (ek == NULL)
++              return ERR_PTR(-ENOMEM);
++      err = cache_check(&svc_expkey_cache, &ek->h, reqp);
++      if (err)
++              return ERR_PTR(err);
+       return ek;
+ }
+ 
+@@ -808,30 +862,21 @@ exp_get_by_name(svc_client *clp, struct vfsmount *mnt, 
struct dentry *dentry,
+               struct cache_req *reqp)
+ {
+       struct svc_export *exp, key;
++      int err;
+       
+       if (!clp)
+-              return NULL;
++              return ERR_PTR(-ENOENT);
+ 
+       key.ex_client = clp;
+       key.ex_mnt = mnt;
+       key.ex_dentry = dentry;
+ 
+       exp = svc_export_lookup(&key);
+-      if (exp != NULL)  {
+-              int err;
+-
+-              err = cache_check(&svc_export_cache, &exp->h, reqp);
+-              switch (err) {
+-              case 0: break;
+-              case -EAGAIN:
+-              case -ETIMEDOUT:
+-                      exp = ERR_PTR(err);
+-                      break;
+-              default:
+-                      exp = NULL;
+-              }
+-      }
+-
++      if (exp == NULL)
++              return ERR_PTR(-ENOMEM);
++      err = cache_check(&svc_export_cache, &exp->h, reqp);
++      if (err)
++              return ERR_PTR(err);
+       return exp;
+ }
+ 
+@@ -847,7 +892,7 @@ exp_parent(svc_client *clp, struct vfsmount *mnt, struct 
dentry *dentry,
+       dget(dentry);
+       exp = exp_get_by_name(clp, mnt, dentry, reqp);
+ 
+-      while (exp == NULL && !IS_ROOT(dentry)) {
++      while (PTR_ERR(exp) == -ENOENT && !IS_ROOT(dentry)) {
+               struct dentry *parent;
+ 
+               parent = dget_parent(dentry);
+@@ -900,7 +945,7 @@ static void exp_fsid_unhash(struct svc_export *exp)
+               return;
+ 
+       ek = exp_get_fsid_key(exp->ex_client, exp->ex_fsid);
+-      if (ek && !IS_ERR(ek)) {
++      if (!IS_ERR(ek)) {
+               ek->h.expiry_time = get_seconds()-1;
+               cache_put(&ek->h, &svc_expkey_cache);
+       }
+@@ -938,7 +983,7 @@ static void exp_unhash(struct svc_export *exp)
+       struct inode *inode = exp->ex_dentry->d_inode;
+ 
+       ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino);
+-      if (ek && !IS_ERR(ek)) {
++      if (!IS_ERR(ek)) {
+               ek->h.expiry_time = get_seconds()-1;
+               cache_put(&ek->h, &svc_expkey_cache);
+       }
+@@ -989,13 +1034,12 @@ exp_export(struct nfsctl_export *nxp)
+ 
+       /* must make sure there won't be an ex_fsid clash */
+       if ((nxp->ex_flags & NFSEXP_FSID) &&
+-          (fsid_key = exp_get_fsid_key(clp, nxp->ex_dev)) &&
+-          !IS_ERR(fsid_key) &&
++          (!IS_ERR(fsid_key = exp_get_fsid_key(clp, nxp->ex_dev))) &&
+           fsid_key->ek_mnt &&
+           (fsid_key->ek_mnt != nd.mnt || fsid_key->ek_dentry != nd.dentry) )
+               goto finish;
+ 
+-      if (exp) {
++      if (!IS_ERR(exp)) {
+               /* just a flags/id/fsid update */
+ 
+               exp_fsid_unhash(exp);
+@@ -1104,7 +1148,7 @@ exp_unexport(struct nfsctl_export *nxp)
+       err = -EINVAL;
+       exp = exp_get_by_name(dom, nd.mnt, nd.dentry, NULL);
+       path_release(&nd);
+-      if (!exp)
++      if (IS_ERR(exp))
+               goto out_domain;
+ 
+       exp_do_unexport(exp);
+@@ -1149,10 +1193,6 @@ exp_rootfh(svc_client *clp, char *path, struct knfsd_fh 
*f, int maxsize)
+               err = PTR_ERR(exp);
+               goto out;
+       }
+-      if (!exp) {
+-              dprintk("nfsd: exp_rootfh export not found.\n");
+-              goto out;
+-      }
+ 
+       /*
+        * fh must be initialized before calling fh_compose
+@@ -1176,17 +1216,130 @@ exp_find(struct auth_domain *clp, int fsid_type, u32 
*fsidv,
+ {
+       struct svc_export *exp;
+       struct svc_expkey *ek = exp_find_key(clp, fsid_type, fsidv, reqp);
+-      if (!ek || IS_ERR(ek))
++      if (IS_ERR(ek))
+               return ERR_PTR(PTR_ERR(ek));
+ 
+       exp = exp_get_by_name(clp, ek->ek_mnt, ek->ek_dentry, reqp);
+       cache_put(&ek->h, &svc_expkey_cache);
+ 
+-      if (!exp || IS_ERR(exp))
++      if (IS_ERR(exp))
+               return ERR_PTR(PTR_ERR(exp));
+       return exp;
+ }
+ 
++__be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp)
++{
++      struct exp_flavor_info *f;
++      struct exp_flavor_info *end = exp->ex_flavors + exp->ex_nflavors;
++
++      /* legacy gss-only clients are always OK: */
++      if (exp->ex_client == rqstp->rq_gssclient)
++              return 0;
++      /* ip-address based client; check sec= export option: */
++      for (f = exp->ex_flavors; f < end; f++) {
++              if (f->pseudoflavor == rqstp->rq_flavor)
++                      return 0;
++      }
++      /* defaults in absence of sec= options: */
++      if (exp->ex_nflavors == 0) {
++              if (rqstp->rq_flavor == RPC_AUTH_NULL ||
++                  rqstp->rq_flavor == RPC_AUTH_UNIX)
++                      return 0;
++      }
++      return nfserr_wrongsec;
++}
++
++/*
++ * Uses rq_client and rq_gssclient to find an export; uses rq_client (an
++ * auth_unix client) if it's available and has secinfo information;
++ * otherwise, will try to use rq_gssclient.
++ *
++ * Called from functions that handle requests; functions that do work on
++ * behalf of mountd are passed a single client name to use, and should
++ * use exp_get_by_name() or exp_find().
++ */
++struct svc_export *
++rqst_exp_get_by_name(struct svc_rqst *rqstp, struct vfsmount *mnt,
++              struct dentry *dentry)
++{
++      struct svc_export *gssexp, *exp = NULL;
++
++      if (rqstp->rq_client == NULL)
++              goto gss;
++
++      /* First try the auth_unix client: */
++      exp = exp_get_by_name(rqstp->rq_client, mnt, dentry,
++                                              &rqstp->rq_chandle);
++      if (PTR_ERR(exp) == -ENOENT)
++              goto gss;
++      if (IS_ERR(exp))
++              return exp;
++      /* If it has secinfo, assume there are no gss/... clients */
++      if (exp->ex_nflavors > 0)
++              return exp;
++gss:
++      /* Otherwise, try falling back on gss client */
++      if (rqstp->rq_gssclient == NULL)
++              return exp;
++      gssexp = exp_get_by_name(rqstp->rq_gssclient, mnt, dentry,
++                                              &rqstp->rq_chandle);
++      if (PTR_ERR(gssexp) == -ENOENT)
++              return exp;
++      if (exp)
++              exp_put(exp);
++      return gssexp;
++}
++
++struct svc_export *
++rqst_exp_find(struct svc_rqst *rqstp, int fsid_type, u32 *fsidv)
++{
++      struct svc_export *gssexp, *exp = NULL;
++
++      if (rqstp->rq_client == NULL)
++              goto gss;
++
++      /* First try the auth_unix client: */
++      exp = exp_find(rqstp->rq_client, fsid_type, fsidv, &rqstp->rq_chandle);
++      if (PTR_ERR(exp) == -ENOENT)
++              goto gss;
++      if (IS_ERR(exp))
++              return exp;
++      /* If it has secinfo, assume there are no gss/... clients */
++      if (exp->ex_nflavors > 0)
++              return exp;
++gss:
++      /* Otherwise, try falling back on gss client */
++      if (rqstp->rq_gssclient == NULL)
++              return exp;
++      gssexp = exp_find(rqstp->rq_gssclient, fsid_type, fsidv,
++                                              &rqstp->rq_chandle);
++      if (PTR_ERR(gssexp) == -ENOENT)
++              return exp;
++      if (exp)
++              exp_put(exp);
++      return gssexp;
++}
++
++struct svc_export *
++rqst_exp_parent(struct svc_rqst *rqstp, struct vfsmount *mnt,
++              struct dentry *dentry)
++{
++      struct svc_export *exp;
++
++      dget(dentry);
++      exp = rqst_exp_get_by_name(rqstp, mnt, dentry);
++
<<Diff was trimmed, longer than 597 lines>>
_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to