mirror of
https://github.com/torvalds/linux.git
synced 2024-11-11 06:31:49 +00:00
nfsd: clean up readdirplus encoding
Make the return from compose_entry_fh() zero or an error, even though the returned error isn't used, just to make the meaning of the return immediately obvious. Move some repeated code out of main function into helper. Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
This commit is contained in:
parent
1be10a88ca
commit
8177e6d6df
@ -814,17 +814,6 @@ encode_entry_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name,
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __be32 *
|
|
||||||
encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p,
|
|
||||||
struct svc_fh *fhp)
|
|
||||||
{
|
|
||||||
p = encode_post_op_attr(cd->rqstp, p, fhp);
|
|
||||||
*p++ = xdr_one; /* yes, a file handle follows */
|
|
||||||
p = encode_fh(p, fhp);
|
|
||||||
fh_put(fhp);
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
||||||
const char *name, int namlen)
|
const char *name, int namlen)
|
||||||
@ -843,22 +832,46 @@ compose_entry_fh(struct nfsd3_readdirres *cd, struct svc_fh *fhp,
|
|||||||
if (dchild == dparent) {
|
if (dchild == dparent) {
|
||||||
/* filesystem root - cannot return filehandle for ".." */
|
/* filesystem root - cannot return filehandle for ".." */
|
||||||
dput(dchild);
|
dput(dchild);
|
||||||
return 1;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
dchild = dget(dparent);
|
dchild = dget(dparent);
|
||||||
} else
|
} else
|
||||||
dchild = lookup_one_len(name, dparent, namlen);
|
dchild = lookup_one_len(name, dparent, namlen);
|
||||||
if (IS_ERR(dchild))
|
if (IS_ERR(dchild))
|
||||||
return 1;
|
return -ENOENT;
|
||||||
if (d_mountpoint(dchild) ||
|
rv = -ENOENT;
|
||||||
fh_compose(fhp, exp, dchild, &cd->fh) != 0 ||
|
if (d_mountpoint(dchild))
|
||||||
!dchild->d_inode)
|
goto out;
|
||||||
rv = 1;
|
rv = fh_compose(fhp, exp, dchild, &cd->fh);
|
||||||
|
if (rv)
|
||||||
|
goto out;
|
||||||
|
if (!dchild->d_inode)
|
||||||
|
goto out;
|
||||||
|
rv = 0;
|
||||||
|
out:
|
||||||
dput(dchild);
|
dput(dchild);
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__be32 *encode_entryplus_baggage(struct nfsd3_readdirres *cd, __be32 *p, const char *name, int namlen)
|
||||||
|
{
|
||||||
|
struct svc_fh fh;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
err = compose_entry_fh(cd, &fh, name, namlen);
|
||||||
|
if (err) {
|
||||||
|
*p++ = 0;
|
||||||
|
*p++ = 0;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
p = encode_post_op_attr(cd->rqstp, p, &fh);
|
||||||
|
*p++ = xdr_one; /* yes, a file handle follows */
|
||||||
|
p = encode_fh(p, &fh);
|
||||||
|
fh_put(&fh);
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Encode a directory entry. This one works for both normal readdir
|
* Encode a directory entry. This one works for both normal readdir
|
||||||
* and readdirplus.
|
* and readdirplus.
|
||||||
@ -929,16 +942,8 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
|
|||||||
|
|
||||||
p = encode_entry_baggage(cd, p, name, namlen, ino);
|
p = encode_entry_baggage(cd, p, name, namlen, ino);
|
||||||
|
|
||||||
/* throw in readdirplus baggage */
|
if (plus)
|
||||||
if (plus) {
|
p = encode_entryplus_baggage(cd, p, name, namlen);
|
||||||
struct svc_fh fh;
|
|
||||||
|
|
||||||
if (compose_entry_fh(cd, &fh, name, namlen) > 0) {
|
|
||||||
*p++ = 0;
|
|
||||||
*p++ = 0;
|
|
||||||
} else
|
|
||||||
p = encode_entryplus_baggage(cd, p, &fh);
|
|
||||||
}
|
|
||||||
num_entry_words = p - cd->buffer;
|
num_entry_words = p - cd->buffer;
|
||||||
} else if (cd->rqstp->rq_respages[pn+1] != NULL) {
|
} else if (cd->rqstp->rq_respages[pn+1] != NULL) {
|
||||||
/* temporarily encode entry into next page, then move back to
|
/* temporarily encode entry into next page, then move back to
|
||||||
@ -951,17 +956,8 @@ encode_entry(struct readdir_cd *ccd, const char *name, int namlen,
|
|||||||
|
|
||||||
p1 = encode_entry_baggage(cd, p1, name, namlen, ino);
|
p1 = encode_entry_baggage(cd, p1, name, namlen, ino);
|
||||||
|
|
||||||
/* throw in readdirplus baggage */
|
if (plus)
|
||||||
if (plus) {
|
p = encode_entryplus_baggage(cd, p1, name, namlen);
|
||||||
struct svc_fh fh;
|
|
||||||
|
|
||||||
if (compose_entry_fh(cd, &fh, name, namlen) > 0) {
|
|
||||||
/* zero out the filehandle */
|
|
||||||
*p1++ = 0;
|
|
||||||
*p1++ = 0;
|
|
||||||
} else
|
|
||||||
p1 = encode_entryplus_baggage(cd, p1, &fh);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* determine entry word length and lengths to go in pages */
|
/* determine entry word length and lengths to go in pages */
|
||||||
num_entry_words = p1 - tmp;
|
num_entry_words = p1 - tmp;
|
||||||
|
Loading…
Reference in New Issue
Block a user