vserver 2.0 rc7
[linux-2.6.git] / fs / nfsd / nfs3xdr.c
index 95a6e29..f307000 100644 (file)
@@ -102,22 +102,6 @@ decode_filename(u32 *p, char **namp, int *lenp)
        return p;
 }
 
-static inline u32 *
-decode_pathname(u32 *p, char **namp, int *lenp)
-{
-       char            *name;
-       int             i;
-
-       if ((p = xdr_decode_string_inplace(p, namp, lenp, NFS3_MAXPATHLEN)) != NULL) {
-               for (i = 0, name = *namp; i < *lenp; i++, name++) {
-                       if (*name == '\0')
-                               return NULL;
-               }
-       }
-
-       return p;
-}
-
 static inline u32 *
 decode_sattr3(u32 *p, struct iattr *iap)
 {
@@ -139,9 +123,9 @@ decode_sattr3(u32 *p, struct iattr *iap)
                iap->ia_valid |= ATTR_GID;
                gid = ntohl(*p++);
        }
-       iap->ia_uid = INOXID_UID(1, uid, gid);
-       iap->ia_gid = INOXID_GID(1, uid, gid);
-       iap->ia_xid = INOXID_XID(1, uid, gid, 0);
+       iap->ia_uid = INOXID_UID(XID_TAG_NFSD, uid, gid);
+       iap->ia_gid = INOXID_GID(XID_TAG_NFSD, uid, gid);
+       iap->ia_xid = INOXID_XID(XID_TAG_NFSD, uid, gid, 0);
        if (*p++) {
                u64     newsize;
 
@@ -825,6 +809,11 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
        if (isdotent(name, namlen)) {
                if (namlen == 2) {
                        dchild = dget_parent(dparent);
+                       if (dchild == dparent) {
+                               /* filesystem root - cannot return filehandle for ".." */
+                               dput(dchild);
+                               return 1;
+                       }
                } else
                        dchild = dget(dparent);
        } else