+ struct nfsdir *nfsdir = data->continue_data;;
+ struct nfsdir *cached;
+
+ cached = nfs_dircache_find(nfs, &data->fh);
+ if (cached) {
+ if (attr && attr->mtime.seconds == cached->attr.mtime.seconds) {
+ cached->current = cached->entries;
+ data->cb(0, nfs, cached, data->private_data);
+ free_nfs_cb_data(data);
+ return 0;
+ } else {
+ /* cache must be stale */
+ nfs_free_nfsdir(cached);
+ }
+ }
+
+ nfsdir->fh.data.data_len = data->fh.data.data_len;
+ nfsdir->fh.data.data_val = malloc(nfsdir->fh.data.data_len);
+ if (nfsdir->fh.data.data_val == NULL) {
+ rpc_set_error(nfs->rpc, "OOM when allocating fh for nfsdir");
+ data->cb(-ENOMEM, nfs, rpc_get_error(nfs->rpc), data->private_data);
+ free_nfs_cb_data(data);
+ return -1;
+ }
+ memcpy(nfsdir->fh.data.data_val, data->fh.data.data_val, data->fh.data.data_len);