]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge branch 'for-2.6.28' of git://linux-nfs.org/~bfields/linux
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Oct 2008 17:14:23 +0000 (10:14 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 23 Oct 2008 17:14:23 +0000 (10:14 -0700)
* 'for-2.6.28' of git://linux-nfs.org/~bfields/linux:
  nfsd: clean up expkey_parse error cases
  nfsd: Drop reference in expkey_parse error cases
  nfsd: Fix memory leak in nfsd_getxattr
  NFSD: Fix BUG during NFSD shutdown processing

fs/nfsd/export.c
fs/nfsd/nfssvc.c
fs/nfsd/vfs.c

index 9dc036f1835614e3c2505abad50496071cf8b0b2..5cd882b8871aea82445291e15db6769d7c3ee27c 100644 (file)
@@ -99,7 +99,7 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
        int fsidtype;
        char *ep;
        struct svc_expkey key;
-       struct svc_expkey *ek;
+       struct svc_expkey *ek = NULL;
 
        if (mesg[mlen-1] != '\n')
                return -EINVAL;
@@ -107,7 +107,8 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
 
        buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
        err = -ENOMEM;
-       if (!buf) goto out;
+       if (!buf)
+               goto out;
 
        err = -EINVAL;
        if ((len=qword_get(&mesg, buf, PAGE_SIZE)) <= 0)
@@ -151,16 +152,16 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
 
        /* now we want a pathname, or empty meaning NEGATIVE  */
        err = -EINVAL;
-       if ((len=qword_get(&mesg, buf, PAGE_SIZE)) < 0)
+       len = qword_get(&mesg, buf, PAGE_SIZE);
+       if (len < 0)
                goto out;
        dprintk("Path seems to be <%s>\n", buf);
        err = 0;
        if (len == 0) {
                set_bit(CACHE_NEGATIVE, &key.h.flags);
                ek = svc_expkey_update(&key, ek);
-               if (ek)
-                       cache_put(&ek->h, &svc_expkey_cache);
-               else err = -ENOMEM;
+               if (!ek)
+                       err = -ENOMEM;
        } else {
                struct nameidata nd;
                err = path_lookup(buf, 0, &nd);
@@ -171,14 +172,14 @@ static int expkey_parse(struct cache_detail *cd, char *mesg, int mlen)
                key.ek_path = nd.path;
 
                ek = svc_expkey_update(&key, ek);
-               if (ek)
-                       cache_put(&ek->h, &svc_expkey_cache);
-               else
+               if (!ek)
                        err = -ENOMEM;
                path_put(&nd.path);
        }
        cache_flush();
  out:
+       if (ek)
+               cache_put(&ek->h, &svc_expkey_cache);
        if (dom)
                auth_domain_put(dom);
        kfree(buf);
index 59eeb46f82c5e842c528ff63a905347c2015e15e..07e4f5d7baa8c63f3639cfee85cb043d0ae8cd84 100644 (file)
@@ -249,6 +249,10 @@ static int nfsd_init_socks(int port)
        if (error < 0)
                return error;
 
+       error = lockd_up();
+       if (error < 0)
+               return error;
+
        error = svc_create_xprt(nfsd_serv, "tcp", port,
                                        SVC_SOCK_DEFAULTS);
        if (error < 0)
index aa1d0d6489a119a3e8e00aa301cc9a9719006087..9609eb51d727147ac745f4d89f3e2110dae222ae 100644 (file)
@@ -410,6 +410,7 @@ out_nfserr:
 static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf)
 {
        ssize_t buflen;
+       ssize_t ret;
 
        buflen = vfs_getxattr(dentry, key, NULL, 0);
        if (buflen <= 0)
@@ -419,7 +420,10 @@ static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf)
        if (!*buf)
                return -ENOMEM;
 
-       return vfs_getxattr(dentry, key, *buf, buflen);
+       ret = vfs_getxattr(dentry, key, *buf, buflen);
+       if (ret < 0)
+               kfree(*buf);
+       return ret;
 }
 #endif