diff options
Diffstat (limited to 'xlators/nfs/server/src/nfs-generics.c')
-rw-r--r-- | xlators/nfs/server/src/nfs-generics.c | 904 |
1 files changed, 78 insertions, 826 deletions
diff --git a/xlators/nfs/server/src/nfs-generics.c b/xlators/nfs/server/src/nfs-generics.c index f83a7c868..b248c2875 100644 --- a/xlators/nfs/server/src/nfs-generics.c +++ b/xlators/nfs/server/src/nfs-generics.c @@ -34,184 +34,182 @@ int -nfs_fstat (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, fop_stat_cbk_t cbk, - void *local) +nfs_fstat (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd, + fop_stat_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!fd) || (!nfu)) + if ((!nfsx) || (!xl) || (!fd) || (!nfu)) return ret; - ret = nfs_fop_fstat (xl, nfu, fd, cbk, local); + ret = nfs_fop_fstat (nfsx, xl, nfu, fd, cbk, local); return ret; } int -nfs_stat (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, fop_stat_cbk_t cbk, - void *local) +nfs_stat (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, + fop_stat_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_fop_stat (xl, nfu, pathloc, cbk, local); + ret = nfs_fop_stat (nfsx, xl, nfu, pathloc, cbk, local); return ret; } - int -nfs_readdirp (xlator_t *xl, nfs_user_t *nfu, fd_t *dirfd, size_t bufsize, - off_t offset, fop_readdir_cbk_t cbk, void *local) +nfs_readdirp (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *dirfd, + size_t bufsize, off_t offset, fop_readdir_cbk_t cbk, void *local) { - if ((!xl) || (!dirfd) || (!nfu)) + if ((!nfsx) || (!xl) || (!dirfd) || (!nfu)) return -EFAULT; - return nfs_fop_readdirp (xl, nfu, dirfd, bufsize, offset, cbk, + return nfs_fop_readdirp (nfsx, xl, nfu, dirfd, bufsize, offset, cbk, local); } - int -nfs_lookup (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, +nfs_lookup (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, fop_lookup_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_fop_lookup (xl, nfu, pathloc, cbk, local); + ret = nfs_fop_lookup (nfsx, xl, nfu, pathloc, cbk, local); return ret; } int -nfs_create (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, int flags, - mode_t mode, fop_create_cbk_t cbk, void *local) +nfs_create (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, + int flags, mode_t mode, fop_create_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_inode_create (xl, nfu, pathloc, flags, mode, cbk,local); + ret = nfs_inode_create (nfsx, xl, nfu, pathloc, flags, mode, cbk,local); return ret; } int -nfs_flush (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, fop_flush_cbk_t cbk, - void *local) +nfs_flush (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd, + fop_flush_cbk_t cbk, void *local) { - return nfs_fop_flush (xl, nfu, fd, cbk, local); + return nfs_fop_flush (nfsx, xl, nfu, fd, cbk, local); } int -nfs_mkdir (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, mode_t mode, - fop_mkdir_cbk_t cbk, void *local) +nfs_mkdir (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, + mode_t mode, fop_mkdir_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_inode_mkdir (xl, nfu, pathloc, mode, cbk, local); + ret = nfs_inode_mkdir (nfsx, xl, nfu, pathloc, mode, cbk, local); return ret; } int -nfs_truncate (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, off_t offset, - fop_truncate_cbk_t cbk, void *local) +nfs_truncate (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, + off_t offset, fop_truncate_cbk_t cbk, void *local) { int ret = -EFAULT; if ((!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_fop_truncate (xl, nfu, pathloc, offset, cbk, local); + ret = nfs_fop_truncate (nfsx, xl, nfu, pathloc, offset, cbk, local); return ret; } int -nfs_read (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, size_t size, +nfs_read (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd, size_t size, off_t offset, fop_readv_cbk_t cbk, void *local) { - return nfs_fop_read (xl, nfu, fd, size, offset, cbk, local); + return nfs_fop_read (nfsx, xl, nfu, fd, size, offset, cbk, local); } int -nfs_fsync (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, int32_t datasync, - fop_fsync_cbk_t cbk, void *local) +nfs_fsync (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd, + int32_t datasync, fop_fsync_cbk_t cbk, void *local) { - return nfs_fop_fsync (xl, nfu, fd, datasync, cbk, local); + return nfs_fop_fsync (nfsx, xl, nfu, fd, datasync, cbk, local); } int -nfs_write (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, struct iobuf *srciob, - struct iovec *vector, int32_t count, off_t offset, - fop_writev_cbk_t cbk, void *local) +nfs_write (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, fd_t *fd, + struct iobuf *srciob, struct iovec *vector, int32_t count, + off_t offset, fop_writev_cbk_t cbk, void *local) { - return nfs_fop_write (xl, nfu, fd, srciob, vector, count, offset, cbk, - local); + return nfs_fop_write (nfsx, xl, nfu, fd, srciob, vector, count, offset, + cbk, local); } int -nfs_open (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, int32_t flags, - fop_open_cbk_t cbk, void *local) +nfs_open (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, + int32_t flags, fop_open_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_inode_open (xl, nfu, pathloc, flags, GF_OPEN_NOWB, cbk, + ret = nfs_inode_open (nfsx, xl, nfu, pathloc, flags, GF_OPEN_NOWB, cbk, local); return ret; } int -nfs_rename (xlator_t *xl, nfs_user_t *nfu, loc_t *oldloc, loc_t *newloc, - fop_rename_cbk_t cbk, void *local) +nfs_rename (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *oldloc, + loc_t *newloc, fop_rename_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!oldloc) || (!newloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!oldloc) || (!newloc) || (!nfu)) return ret; - ret = nfs_inode_rename (xl, nfu, oldloc, newloc, cbk, local); + ret = nfs_inode_rename (nfsx, xl, nfu, oldloc, newloc, cbk, local); return ret; } int -nfs_link (xlator_t *xl, nfs_user_t *nfu, loc_t *oldloc, loc_t *newloc, - fop_link_cbk_t cbk, void *local) +nfs_link (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *oldloc, + loc_t *newloc, fop_link_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!oldloc) || (!newloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!oldloc) || (!newloc) || (!nfu)) return ret; - ret = nfs_inode_link (xl, nfu, oldloc, newloc, cbk, local); + ret = nfs_inode_link (nfsx, xl, nfu, oldloc, newloc, cbk, local); return ret; } int -nfs_unlink (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, +nfs_unlink (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, fop_unlink_cbk_t cbk, void *local) { int ret = -EFAULT; @@ -219,849 +217,103 @@ nfs_unlink (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, if ((!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_inode_unlink (xl, nfu, pathloc, cbk, local); + ret = nfs_inode_unlink (nfsx, xl, nfu, pathloc, cbk, local); return ret; } int -nfs_rmdir (xlator_t *xl, nfs_user_t *nfu, loc_t *path, fop_rmdir_cbk_t cbk, - void *local) +nfs_rmdir (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *path, + fop_rmdir_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!path) || (!nfu)) + if ((!nfsx) || (!xl) || (!path) || (!nfu)) return ret; - ret = nfs_inode_rmdir (xl, nfu, path, cbk, local); + ret = nfs_inode_rmdir (nfsx, xl, nfu, path, cbk, local); return ret; } int -nfs_mknod (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, mode_t mode, - dev_t dev, fop_mknod_cbk_t cbk, void *local) +nfs_mknod (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, + mode_t mode, dev_t dev, fop_mknod_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_inode_mknod (xl, nfu, pathloc, mode, dev, cbk, local); + ret = nfs_inode_mknod (nfsx, xl, nfu, pathloc, mode, dev, cbk, local); return ret; } int -nfs_readlink (xlator_t *xl, nfs_user_t *nfu, loc_t *linkloc, +nfs_readlink (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *linkloc, fop_readlink_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!linkloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!linkloc) || (!nfu)) return ret; - ret = nfs_fop_readlink (xl, nfu, linkloc, NFS_PATH_MAX, cbk, local); + ret = nfs_fop_readlink (nfsx, xl, nfu, linkloc, NFS_PATH_MAX, cbk, + local); return ret; } - int -nfs_symlink (xlator_t *xl, nfs_user_t *nfu, char *target, loc_t *linkloc, - fop_symlink_cbk_t cbk, void *local) +nfs_symlink (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, char *target, + loc_t *linkloc, fop_symlink_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!linkloc) || (!target) || (!nfu)) + if ((!nfsx) || (!xl) || (!linkloc) || (!target) || (!nfu)) return ret; - ret = nfs_inode_symlink (xl, nfu, target, linkloc, cbk, local); + ret = nfs_inode_symlink (nfsx, xl, nfu, target, linkloc, cbk, local); return ret; } int -nfs_setattr (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, +nfs_setattr (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, struct iatt *buf, int32_t valid, fop_setattr_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_fop_setattr (xl, nfu, pathloc, buf, valid, cbk, local); + ret = nfs_fop_setattr (nfsx, xl, nfu, pathloc, buf, valid, cbk, local); return ret; } int -nfs_statfs (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, +nfs_statfs (xlator_t *nfsx, xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, fop_statfs_cbk_t cbk, void *local) { int ret = -EFAULT; - if ((!xl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!xl) || (!pathloc) || (!nfu)) return ret; - ret = nfs_fop_statfs (xl, nfu, pathloc, cbk, local); + ret = nfs_fop_statfs (nfsx, xl, nfu, pathloc, cbk, local); return ret; } - -int -nfs_open_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, fd_t *fd) -{ - nfs_syncfop_t *sf = frame->local; - - if (!sf) - return -1; - - if (op_ret == -1) - gf_log (GF_NFS, GF_LOG_TRACE, "Sync open failed: %s", - strerror (op_errno)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Sync open done"); - - sf->replystub = fop_open_cbk_stub (frame, NULL, op_ret, op_errno, fd); - - nfs_syncfop_notify (sf); - return 0; -} - - -call_stub_t * -nfs_open_sync (xlator_t *xl, nfs_user_t *nfu, loc_t *pathloc, int32_t flags) -{ - nfs_syncfop_t *sf = NULL; - call_stub_t *reply = NULL; - int ret = -1; - - if ((!xl) || (!pathloc) || (!nfu)) - return NULL; - - sf = nfs_syncfop_init (); - if (!sf) { - gf_log (GF_NFS, GF_LOG_ERROR, "synclocal init failed"); - goto err; - } - - ret = nfs_open (xl, nfu, pathloc, flags, nfs_open_sync_cbk, sf); - if (ret < 0) - goto err; - - reply = nfs_syncfop_wait (sf); - -err: - if (ret < 0) - FREE (sf); - - return reply; -} - - - int -nfs_fdctx_alloc (fd_t *fd, xlator_t *xl) -{ - nfs_fdctx_t *fdctx = NULL; - int ret = -EFAULT; - - if ((!fd) || (!xl)) - return ret; - - fdctx = CALLOC (1, sizeof (*fdctx)); - if (!fdctx) { - gf_log (GF_NFS, GF_LOG_ERROR, "Memory allocation failure"); - ret = -ENOMEM; - goto err; - } - - pthread_mutex_init (&fdctx->lock, NULL); - - ret = fd_ctx_set (fd, xl, (uint64_t)fdctx); - if (ret == -1) { - gf_log (GF_NFS, GF_LOG_ERROR, "Failed to set fd context"); - ret = -EFAULT; - goto free_ctx; - } - - ret = 0; - -free_ctx: - if (ret < 0) - FREE (fdctx); - -err: - return ret; -} - - -void -nfs_fdctx_del (fd_t *fd, xlator_t *xl) -{ - nfs_fdctx_t *fdctx = NULL; - uint64_t ctxaddr = 0; - int ret = -1; - - if ((!fd) || (!xl)) - return; - - ret = fd_ctx_del (fd, xl, &ctxaddr); - if (ret == -1) - goto err; - - fdctx = (nfs_fdctx_t *)ctxaddr; - FREE (fdctx); - -err: - return; -} - - -nfs_fdctx_t * -nfs_fdctx_get (fd_t *fd, xlator_t *xl) -{ - nfs_fdctx_t *fdctx = NULL; - int ret = -1; - uint64_t ctxptr = 0; - - if ((!fd) || (!xl)) - return NULL; - - ret = fd_ctx_get (fd, xl, &ctxptr); - if (ret == -1) { - gf_log (GF_NFS, GF_LOG_ERROR, "Failed to get fd context"); - goto err; - } - - fdctx = (nfs_fdctx_t *)ctxptr; -err: - return fdctx; -} - - -int -nfs_dir_fdctx_init (fd_t *dirfd, xlator_t *xl, xlator_t *fopxl, size_t bufsize) -{ - int ret = -EFAULT; - nfs_fdctx_t *fdctx = NULL; - - if ((!dirfd) || (!xl)) - return ret; - - ret = nfs_fdctx_alloc (dirfd, xl); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "Failed to alloc dir fd context"); - goto err; - } - - fdctx = nfs_fdctx_get (dirfd, xl); - if (!fdctx) { - ret = -EFAULT; - gf_log (GF_NFS, GF_LOG_ERROR, "Failed to get dir fd context"); - goto err; - } - - fdctx->dcache = CALLOC (1, sizeof (struct nfs_direntcache)); - if (!fdctx->dcache) { - ret = -ENOMEM; - gf_log (GF_NFS, GF_LOG_ERROR, "Failed to allocate dirent" - " cache"); - goto free_ctx; - } - - INIT_LIST_HEAD (&fdctx->dcache->entries.list); - fdctx->dirent_bufsize = bufsize; - fdctx->dirvol = fopxl; - - ret = 0; - -free_ctx: - if (ret < 0) - nfs_fdctx_del (dirfd, xl); -err: - return ret; -} - - - - -/* Dirent caching code copied from libglusterfsclient. - * Please duplicate enhancements and bug fixes there too. - */ -void -nfs_dcache_invalidate (xlator_t *nfsx, fd_t *fd) -{ - nfs_fdctx_t *fd_ctx = NULL; - - if (!fd) - return; - - fd_ctx = nfs_fdctx_get (fd, nfsx); - if (!fd_ctx) { - gf_log (GF_NFS, GF_LOG_ERROR, "No fd context present"); - return; - } - - if (!fd_ctx->dcache) { - gf_log (GF_NFS, GF_LOG_TRACE, "No dirent cache present"); - return; - } - - if (!list_empty (&fd_ctx->dcache->entries.list)) { - gf_log (GF_NFS, GF_LOG_TRACE, "Freeing dirents"); - gf_dirent_free (&fd_ctx->dcache->entries); - } - - INIT_LIST_HEAD (&fd_ctx->dcache->entries.list); - - fd_ctx->dcache->next = NULL; - fd_ctx->dcache->prev_off = 0; - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache invalidated"); - - return; -} - -/* Dirent caching code copied from libglusterfsclient. - * Please duplicate enhancements and bug fixes there too. - */ -/* The first entry in the entries is always a placeholder - * or the list head. The real entries begin from entries->next. - */ -int -nfs_dcache_update (xlator_t *nfsx, fd_t *fd, gf_dirent_t *entries) -{ - nfs_fdctx_t *fdctx = NULL; - int ret = -EFAULT; - - if ((!fd) || (!entries)) - return ret; - - fdctx = nfs_fdctx_get (fd, nfsx); - if (!fdctx) { - gf_log (GF_NFS, GF_LOG_ERROR, "No fd context present"); - return ret; - } - - /* dcache is not enabled. */ - if (!fdctx->dcache) { - gf_log (GF_NFS, GF_LOG_TRACE, "No dirent cache present"); - return ret; - } - - /* If we're updating, we must begin with invalidating any previous - * entries. - */ - nfs_dcache_invalidate (nfsx, fd); - - fdctx->dcache->next = entries->next; - /* We still need to store a pointer to the head - * so we start free'ing from the head when invalidation - * is required. - * - * Need to delink the entries from the list - * given to us by an underlying translators. Most translators will - * free this list after this call so we must preserve the dirents in - * order to cache them. - */ - list_splice_init (&entries->list, &fdctx->dcache->entries.list); - ret = 0; - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache updated"); - - return ret; -} - -/* Dirent caching code copied from libglusterfsclient. - * Please duplicate enhancements and bug fixes there too. - */ -int -nfs_dcache_readdir (xlator_t *nfsx, fd_t *fd, gf_dirent_t *dirp, off_t *offset) -{ - nfs_fdctx_t *fdctx = NULL; - int cachevalid = 0; - - if ((!fd) || (!dirp) || (!offset)) - return 0; - - fdctx = nfs_fdctx_get (fd, nfsx); - if (!fdctx) { - gf_log (GF_NFS, GF_LOG_ERROR, "No fd context present"); - goto out; - } - - if (!fdctx->dcache) { - gf_log (GF_NFS, GF_LOG_TRACE, "No dirent cache present"); - goto out; - } - - /* We've either run out of entries in the cache - * or the cache is empty. - */ - if (!fdctx->dcache->next) { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache is empty"); - goto out; - } - - /* The dirent list is created as a circular linked list - * so this check is needed to ensure, we dont start - * reading old entries again. - * If we're reached this situation, the cache is exhausted - * and we'll need to pre-fetch more entries to continue serving. - */ - if (fdctx->dcache->next == &fdctx->dcache->entries) { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache was exhausted"); - goto out; - } - - /* During sequential reading we generally expect that the offset - * requested is the same as the offset we served in the previous call - * to readdir. But, seekdir, rewinddir and libgf_dcache_invalidate - * require special handling because seekdir/rewinddir change the offset - * in the fd_ctx and libgf_dcache_invalidate changes the prev_off. - */ - if (*offset != fdctx->dcache->prev_off) { - /* For all cases of the if branch above, we know that the - * cache is now invalid except for the case below. It handles - * the case where the two offset values above are different - * but different because the previous readdir block was - * exhausted, resulting in a prev_off being set to 0 in - * libgf_dcache_invalidate, while the requested offset is non - * zero because that is what we returned for the last dirent - * of the previous readdir block. - */ - if ((*offset != 0) && (fdctx->dcache->prev_off == 0)) { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache was" - " exhausted"); - cachevalid = 1; - } else - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache is" - " invalid"); - } else { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent cache is valid"); - cachevalid = 1; - } - - if (!cachevalid) - goto out; - - dirp->d_ino = fdctx->dcache->next->d_ino; - strncpy (dirp->d_name, fdctx->dcache->next->d_name, - fdctx->dcache->next->d_len + 1); - dirp->d_len = fdctx->dcache->next->d_len; - dirp->d_stat = fdctx->dcache->next->d_stat; -// nfs_map_dev (fdctx->dirvol, &dirp->d_stat.st_dev); - - *offset = fdctx->dcache->next->d_off; - dirp->d_off = *offset; - fdctx->dcache->prev_off = fdctx->dcache->next->d_off; - fdctx->dcache->next = fdctx->dcache->next->next; - -out: - return cachevalid; -} - -int -__nfs_readdir_sync (xlator_t *nfsx, xlator_t *fopxl, nfs_user_t *nfu, - fd_t *dirfd, off_t *offset, gf_dirent_t *entry, - size_t bufsize) -{ - int ret = -1; - call_stub_t *reply = NULL; - - if ((!fopxl) || (!dirfd) || (!entry)) - return ret; - - ret = nfs_dcache_readdir (nfsx, dirfd, entry, offset); - if (ret) { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent served from cache"); - ret = 0; - goto err; - } - - reply = nfs_fop_readdirp_sync (fopxl, nfu, dirfd, *offset,bufsize); - if (!reply) { - ret = -1; - gf_log (GF_NFS, GF_LOG_ERROR, "Sync readdir failed"); - goto err; - } - - if (reply->args.readdir_cbk.op_ret <= 0) { - ret = -1; - goto err; - } - - ret = nfs_dcache_update (nfsx, dirfd, &reply->args.readdir_cbk.entries); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "Failed to update dirent cache"); - goto err; - } - - ret = nfs_dcache_readdir (nfsx, dirfd, entry, offset); - if (ret) { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent served from cache," - " after updating from server"); - ret = 0; - } else { - gf_log (GF_NFS, GF_LOG_TRACE, "Dirent still not served from" - " cache, even after updating from server"); - ret = -1; - } - -err: - if (reply) - call_stub_destroy (reply); - return ret; -} - - - -int -nfs_readdir_sync (xlator_t *nfsx, xlator_t *fopxl, nfs_user_t *nfu, - fd_t *dirfd, gf_dirent_t *entry) -{ - int ret = -EFAULT; - nfs_fdctx_t *fdctx = NULL; - - if ((!nfsx) || (!fopxl) || (!dirfd) || (!entry) || (!nfu)) - return ret; - - fdctx = nfs_fdctx_get (dirfd, nfsx); - if (!fdctx) { - gf_log (GF_NFS, GF_LOG_ERROR, "No fd context present"); - goto err; - } - - pthread_mutex_lock (&fdctx->lock); - { - ret = __nfs_readdir_sync (nfsx, fopxl, nfu, dirfd, - &fdctx->offset, entry, - fdctx->dirent_bufsize); - } - pthread_mutex_unlock (&fdctx->lock); - - if (ret < 0) - gf_log (GF_NFS, GF_LOG_ERROR, "Sync readdir failed: %s", - strerror (-ret)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Entry read: %s: len %d, ino %" - PRIu64", igen: %"PRIu64, entry->d_name, entry->d_len, - entry->d_ino, entry->d_stat.ia_dev); - -err: - return ret; -} - - -int32_t -nfs_flush_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno) -{ - nfs_syncfop_t *sf = frame->local; - - if (!sf) - return -1; - - if (op_ret == -1) - gf_log (GF_NFS, GF_LOG_TRACE, "Sync open failed: %s", - strerror (op_errno)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Sync open done"); - - sf->replystub = fop_flush_cbk_stub (frame, NULL, op_ret, op_errno); - - nfs_syncfop_notify (sf); - return 0; -} - - -call_stub_t * -nfs_flush_sync (xlator_t *xl, nfs_user_t *nfu, fd_t *fd) -{ - nfs_syncfop_t *sf = NULL; - call_stub_t *reply = NULL; - int ret = -1; - - if ((!xl) || (!fd) || (!nfu)) - return NULL; - - sf = nfs_syncfop_init (); - if (!sf) { - gf_log (GF_NFS, GF_LOG_ERROR, "synclocal init failed"); - goto err; - } - - ret = nfs_flush (xl, nfu, fd, nfs_flush_sync_cbk, sf); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "Sync flush failed: %s", - strerror (-ret)); - goto err; - } - - reply = nfs_syncfop_wait (sf); - -err: - if (ret < 0) - FREE (sf); - - return reply; -} - - -int32_t -nfs_writev_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *prebuf, - struct iatt *postbuf) -{ - nfs_syncfop_t *sf = frame->local; - - if (!sf) - return -1; - - if (op_ret == -1) - gf_log (GF_NFS, GF_LOG_TRACE, "Sync write failed: %s", - strerror (op_errno)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Sync write done"); - - sf->replystub = fop_writev_cbk_stub (frame, NULL, op_ret, op_errno, - prebuf, postbuf); - - nfs_syncfop_notify (sf); - return 0; -} - - - -call_stub_t * -nfs_write_sync (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, struct iobuf *srciob, - struct iovec *vec, int count, off_t offset) -{ - nfs_syncfop_t *sf = NULL; - call_stub_t *reply = NULL; - int ret = -1; - - if ((!xl) || (!fd) || (!vec) || (!nfu) || (!srciob)) - return NULL; - - sf = nfs_syncfop_init (); - if (!sf) { - gf_log (GF_NFS, GF_LOG_ERROR, "synclocal init failed"); - goto err; - } - - ret = nfs_write (xl, nfu, fd, srciob, vec, count, offset, - nfs_writev_sync_cbk, sf); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "Sync flush failed: %s", - strerror (-ret)); - goto err; - } - - reply = nfs_syncfop_wait (sf); - -err: - if (ret < 0) - FREE (sf); - - return reply; -} - - - -int32_t -nfs_fsync_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iatt *prebuf, - struct iatt *postbuf) -{ - nfs_syncfop_t *sf = frame->local; - - if (!sf) - return -1; - - if (op_ret == -1) - gf_log (GF_NFS, GF_LOG_TRACE, "Sync fsync failed: %s", - strerror (op_errno)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Sync fsync done"); - - sf->replystub = fop_fsync_cbk_stub (frame, NULL, op_ret, op_errno, - prebuf, postbuf); - - nfs_syncfop_notify (sf); - return 0; -} - - - -call_stub_t * -nfs_fsync_sync (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, int32_t datasync) -{ - nfs_syncfop_t *sf = NULL; - call_stub_t *reply = NULL; - int ret = -1; - - if ((!xl) || (!fd) || (!nfu)) - return NULL; - - sf = nfs_syncfop_init (); - if (!sf) { - gf_log (GF_NFS, GF_LOG_ERROR, "synclocal init failed"); - goto err; - } - - ret = nfs_fsync (xl, nfu, fd, datasync, nfs_fsync_sync_cbk, sf); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "Sync fsync failed: %s", - strerror (-ret)); - goto err; - } - - reply = nfs_syncfop_wait (sf); - -err: - if (ret < 0) - FREE (sf); - - return reply; -} - -int32_t -nfs_read_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, struct iovec *vector, - int32_t count, struct iatt *buf, struct iobref *iobref) -{ - nfs_syncfop_t *sf = frame->local; - - if (!sf) - return -1; - - if (op_ret == -1) - gf_log (GF_NFS, GF_LOG_TRACE, "Sync read failed: %s", - strerror (op_errno)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Sync read done"); - - sf->replystub = fop_readv_cbk_stub (frame, NULL, op_ret, op_errno, - vector, count, buf, iobref); - - nfs_syncfop_notify (sf); - return 0; -} - - - -call_stub_t * -nfs_read_sync (xlator_t *xl, nfs_user_t *nfu, fd_t *fd, size_t size, - off_t offset) -{ - nfs_syncfop_t *sf = NULL; - call_stub_t *reply = NULL; - int ret = -1; - - if ((!xl) || (!fd) || (!nfu)) - return NULL; - - sf = nfs_syncfop_init (); - if (!sf) { - gf_log (GF_NFS, GF_LOG_ERROR, "synclocal init failed"); - goto err; - } - - ret = nfs_read (xl, nfu, fd, size, offset, nfs_read_sync_cbk, sf); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "Sync read failed: %s", - strerror (-ret)); - goto err; - } - - reply = nfs_syncfop_wait (sf); - -err: - if (ret < 0) - FREE (sf); - - return reply; -} - - -int32_t -nfs_opendir_sync_cbk (call_frame_t *frame, void *cookie, xlator_t *this, - int32_t op_ret, int32_t op_errno, fd_t *fd) -{ - nfs_syncfop_t *sf = frame->local; - - if (!sf) - return -1; - - if (op_ret == -1) - gf_log (GF_NFS, GF_LOG_TRACE, "Sync opendir failed: %s", - strerror (op_errno)); - else - gf_log (GF_NFS, GF_LOG_TRACE, "Sync opendir done"); - - sf->replystub = fop_opendir_cbk_stub (frame, NULL, op_ret, op_errno,fd); - - nfs_syncfop_notify (sf); - return 0; -} - - -call_stub_t * -nfs_opendir_sync (xlator_t *nfsx, xlator_t *fopxl, nfs_user_t *nfu, - loc_t *pathloc, size_t bufsize) -{ - int ret = -EFAULT; - call_stub_t *reply = NULL; - nfs_syncfop_t *sf = NULL; - fd_t *dirfd = NULL; - - if ((!nfsx) || (!fopxl) || (!pathloc) || (!nfu)) - return NULL; - - sf = nfs_syncfop_init (); - if (!sf) { - gf_log (GF_NFS, GF_LOG_ERROR, "synclocal init failed"); - ret = -ENOMEM; - goto err; - } - - ret = nfs_inode_opendir (fopxl, nfu, pathloc, nfs_opendir_sync_cbk, sf); - if (ret < 0) - goto err; - - reply = nfs_syncfop_wait (sf); - if (!reply) { - ret = -EFAULT; - goto err; - } - - dirfd = reply->args.opendir_cbk.fd; - ret = nfs_dir_fdctx_init (dirfd, nfsx, fopxl, bufsize); - if (ret < 0) { - gf_log (GF_NFS, GF_LOG_ERROR, "fd context allocation failed"); - goto err; - } - - ret = 0; - -err: - if (ret < 0) - FREE (sf); - - return reply; -} - - -int -nfs_opendir (xlator_t *fopxl, nfs_user_t *nfu, loc_t *pathloc, +nfs_opendir (xlator_t *nfsx, xlator_t *fopxl, nfs_user_t *nfu, loc_t *pathloc, fop_opendir_cbk_t cbk, void *local) { - if ((!fopxl) || (!pathloc) || (!nfu)) + if ((!nfsx) || (!fopxl) || (!pathloc) || (!nfu)) return -EFAULT; - return nfs_inode_opendir (fopxl, nfu, pathloc, cbk, local); + return nfs_inode_opendir (nfsx, fopxl, nfu, pathloc, cbk, local); } |