projects
/
bluesky.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Improve NFS readdirplus to estimate response sizes.
[bluesky.git]
/
nfs3
/
nfs3.c
diff --git
a/nfs3/nfs3.c
b/nfs3/nfs3.c
index
4b1b8c5
..
70273ff
100644
(file)
--- a/
nfs3/nfs3.c
+++ b/
nfs3/nfs3.c
@@
-747,7
+747,7
@@
nfsproc3_link_3_svc(link3args *argp, struct svc_req *rqstp)
gint bluesky_dirent_compare(gconstpointer a, gconstpointer b,
gpointer unused);
gint bluesky_dirent_compare(gconstpointer a, gconstpointer b,
gpointer unused);
-#define MAX_READDIR_DIRENTS 4
+#define MAX_READDIR_DIRENTS
6
4
readdir3res *
nfsproc3_readdir_3_svc(readdir3args *argp, struct svc_req *rqstp)
{
readdir3res *
nfsproc3_readdir_3_svc(readdir3args *argp, struct svc_req *rqstp)
{
@@
-797,6
+797,13
@@
nfsproc3_readdir_3_svc(readdir3args *argp, struct svc_req *rqstp)
readdirplus3res *
nfsproc3_readdirplus_3_svc(readdirplus3args *argp, struct svc_req *rqstp)
{
readdirplus3res *
nfsproc3_readdirplus_3_svc(readdirplus3args *argp, struct svc_req *rqstp)
{
+ /* XDR-encoded sizes:
+ * post_op_attr: 88 bytes
+ * base readdirplus3resok: 88 + 16 bytes
+ * base directory entry: 24 bytes + filename
+ * attributes/fh3: 88 + 8 + filehandle size
+ */
+ size_t dircount = 88 + 16, attrcount = 0;
static readdirplus3res result;
BlueSkyInode *dir = lookup_fh(&argp->dir);
static readdirplus3res result;
BlueSkyInode *dir = lookup_fh(&argp->dir);
@@
-826,6
+833,11
@@
nfsproc3_readdirplus_3_svc(readdirplus3args *argp, struct svc_req *rqstp)
BlueSkyDirent *d = g_sequence_get(i);
BlueSkyInode *inode = bluesky_get_inode(fs, d->inum);
if (inode != NULL) {
BlueSkyDirent *d = g_sequence_get(i);
BlueSkyInode *inode = bluesky_get_inode(fs, d->inum);
if (inode != NULL) {
+ dircount += 24 + ((strlen(d->name) + 3) & ~3);
+ attrcount += 88 + 8 + 8;
+ if (dircount > argp->dircount
+ || dircount + attrcount > argp->maxcount)
+ break;
dirents[count].fileid = d->inum;
dirents[count].name = d->name;
dirents[count].cookie = d->cookie;
dirents[count].fileid = d->inum;
dirents[count].name = d->name;
dirents[count].cookie = d->cookie;