X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=nfs3%2Fnfs3.c;h=9fccd00f2fe31b55121111555b1cf9cc784800a3;hb=9d922eff12f6288a15f17948f625ae3c66238695;hp=4b1b8c5bc801930548ecbf42ffc82f84b367fbdb;hpb=4e5b01e916b753f652137229d1a402c85499e871;p=bluesky.git diff --git a/nfs3/nfs3.c b/nfs3/nfs3.c index 4b1b8c5..9fccd00 100644 --- 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); -#define MAX_READDIR_DIRENTS 4 +#define MAX_READDIR_DIRENTS 64 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) { + /* 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); @@ -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) { + 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; @@ -858,7 +870,24 @@ nfsproc3_fsstat_3_svc(nfs_fh3 *argp, struct svc_req *rqstp) { static fsstat3res result; - result.status = NFS3ERR_NOTSUPP; + BlueSkyInode *inode = lookup_fh(argp); + if (inode == NULL) { + result.status = NFS3ERR_STALE; + result.fsstat3res_u.resfail.present = FALSE; + return &result; + } + + result.status = NFS3_OK; + result.fsstat3res_u.resok.obj_attributes.present = TRUE; + encode_fattr3(&result.fsstat3res_u.resok.obj_attributes.post_op_attr_u.attributes, inode); + + result.fsstat3res_u.resok.tbytes = (1 << 30); + result.fsstat3res_u.resok.fbytes = (1 << 30); + result.fsstat3res_u.resok.abytes = (1 << 30); + result.fsstat3res_u.resok.tfiles = 0; + result.fsstat3res_u.resok.ffiles = 0; + result.fsstat3res_u.resok.afiles = 0; + result.fsstat3res_u.resok.invarsec = 0; return &result; }