+ BlueSkyInode *inode = lookup_fh(&argp->file);
+ if (inode == NULL) {
+ result.status = NFS3ERR_STALE;
+ result.read3res_u.resfail.present = FALSE;
+ return &result;
+ }
+
+ int count = argp->count;
+ if (argp->offset >= inode->size) {
+ count = 0;
+ result.read3res_u.resok.eof = TRUE;
+ } else {
+ count = MIN(count, inode->size - argp->offset);
+ if (argp->offset + count == inode->size)
+ result.read3res_u.resok.eof = TRUE;
+ else
+ result.read3res_u.resok.eof = FALSE;
+
+ bluesky_file_read(inode, argp->offset, buf, count);
+ }
+
+ result.status = NFS3_OK;
+ result.read3res_u.resok.file_attributes.present = TRUE;
+ encode_fattr3(&result.read3res_u.resok.file_attributes.post_op_attr_u.attributes, inode);
+ result.read3res_u.resok.count = count;
+ result.read3res_u.resok.data.data_val = buf;
+ result.read3res_u.resok.data.data_len = count;