static void workspace_nfs_write(fuse_req_t req, const char *buff, size_t size, off_t offset, struct workspace_fh_struct *fh) { struct resource_struct *resource=fh->object->resource; struct net_nfs_export_struct *nfs_export=(struct net_nfs_export_struct *) resource->data; struct nfs_context *nfs_ctx=(struct nfs_context *) nfs_export->data; struct nfsfh *nfsfh=(struct nfsfh *) fh->handle.data; int result=0; logoutput("workspace_nfs_write"); pthread_mutex_lock(&nfs_export->mutex); result=nfs_pwrite(nfs_ctx, nfsfh, offset, size, (void *) (intptr_t) buff); pthread_mutex_unlock(&nfs_export->mutex); if (result>=0) { fuse_reply_write(req, result); } else { fuse_reply_err(req, abs(result)); } }
static int64_t file_pwrite(struct file_context *fc, char *buf, int64_t count, uint64_t off) { if (fc->is_nfs == 0) { lseek(fc->fd, off, SEEK_SET); return write(fc->fd, buf, count); } else { return nfs_pwrite(fc->nfs, fc->nfsfh, off, count, buf); } }
static int fuse_nfs_write(const char *path, const char *buf, size_t size, off_t offset, struct fuse_file_info *fi) { int ret = 0; struct nfsfh *nfsfh = (struct nfsfh *)fi->fh; ret = nfs_pwrite(nfs, nfsfh, offset, size, discard_const(buf)); return ret; }
ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) { if (nfs_fd_list[fd].is_nfs == 1) { int ret; LD_NFS_DPRINTF(9, "pwrite(fd:%d offset:%d count:%d)", fd, (int)offset, (int)count); if ((ret = nfs_pwrite(nfs_fd_list[fd].nfs, nfs_fd_list[fd].fh, offset, count, (char *)discard_const(buf))) < 0) { errno = -ret; return -1; } return ret; } return real_pwrite(fd, buf, count, offset); }