1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-10 01:18:15 +03:00

vfs_ceph_new: ref cephmount_cached entry in handle->data

Allow direct access to ceph-mount cached-entry via 'handle->data'
private pointer. Required in order to allow more complex cached-state
with each cephfs mount. Users should now use the local-helper function
'cmount_of' to access the underlying ceph_mount_info.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15686

Signed-off-by: Shachar Sharon <ssharon@redhat.com>
Reviewed-by: Guenther Deschner <gd@samba.org>
Reviewed-by: Anoop C S <anoopcs@samba.org>
This commit is contained in:
Shachar Sharon 2024-06-18 12:58:52 +03:00 committed by Günther Deschner
parent beb21324c9
commit 31085c7efc

View File

@ -82,7 +82,7 @@ static ssize_t lstatus_code(intmax_t ret)
/*
* Track unique connections, as virtual mounts, to cephfs file systems.
* Individual mounts will be set on the handle->data attribute, but
* Individual mount-entries will be set on the handle->data attribute, but
* the mounts themselves will be shared so as not to spawn extra mounts
* to the same cephfs.
*
@ -98,7 +98,8 @@ static struct cephmount_cached {
} *cephmount_cached;
static int cephmount_cache_add(const char *cookie,
struct ceph_mount_info *mount)
struct ceph_mount_info *mount,
struct cephmount_cached **out_entry)
{
struct cephmount_cached *entry = NULL;
@ -120,10 +121,12 @@ static int cephmount_cache_add(const char *cookie,
DBG_DEBUG("adding mount cache entry for %s\n", entry->cookie);
DLIST_ADD(cephmount_cached, entry);
*out_entry = entry;
return 0;
}
static struct ceph_mount_info *cephmount_cache_update(const char *cookie)
static struct cephmount_cached *cephmount_cache_update(const char *cookie)
{
struct cephmount_cached *entry = NULL;
@ -132,7 +135,7 @@ static struct ceph_mount_info *cephmount_cache_update(const char *cookie)
entry->count++;
DBG_DEBUG("updated mount cache: count is [%"
PRIu32 "]\n", entry->count);
return entry->mount;
return entry;
}
}
@ -140,27 +143,18 @@ static struct ceph_mount_info *cephmount_cache_update(const char *cookie)
return NULL;
}
static int cephmount_cache_remove(struct ceph_mount_info *mount)
static int cephmount_cache_remove(struct cephmount_cached *entry)
{
struct cephmount_cached *entry = NULL;
for (entry = cephmount_cached; entry; entry = entry->next) {
if (entry->mount == mount) {
if (--entry->count) {
DBG_DEBUG("updated mount cache: count is [%"
PRIu32 "]\n", entry->count);
return entry->count;
}
DBG_DEBUG("removing mount cache entry for %s\n",
entry->cookie);
DLIST_REMOVE(cephmount_cached, entry);
talloc_free(entry);
return 0;
}
if (--entry->count) {
DBG_DEBUG("updated mount cache: count is [%" PRIu32 "]\n",
entry->count);
return entry->count;
}
errno = ENOENT;
return -1;
DBG_DEBUG("removing mount cache entry for %s\n", entry->cookie);
DLIST_REMOVE(cephmount_cached, entry);
talloc_free(entry);
return 0;
}
static char *cephmount_get_cookie(TALLOC_CTX * mem_ctx, const int snum)
@ -276,6 +270,7 @@ static int vfs_ceph_connect(struct vfs_handle_struct *handle,
const char *service, const char *user)
{
int ret = 0;
struct cephmount_cached *entry = NULL;
struct ceph_mount_info *cmount = NULL;
int snum = SNUM(handle->conn);
char *cookie = cephmount_get_cookie(handle, snum);
@ -283,8 +278,8 @@ static int vfs_ceph_connect(struct vfs_handle_struct *handle,
return -1;
}
cmount = cephmount_cache_update(cookie);
if (cmount != NULL) {
entry = cephmount_cache_update(cookie);
if (entry != NULL) {
goto connect_ok;
}
@ -293,42 +288,48 @@ static int vfs_ceph_connect(struct vfs_handle_struct *handle,
ret = -1;
goto connect_fail;
}
ret = cephmount_cache_add(cookie, cmount);
if (ret) {
ret = cephmount_cache_add(cookie, cmount, &entry);
if (ret != 0) {
goto connect_fail;
}
connect_ok:
handle->data = cmount;
connect_ok:
handle->data = entry;
DBG_WARNING("Connection established with the server: %s\n", cookie);
/*
* Unless we have an async implementation of getxattrat turn this off.
*/
lp_do_parameter(SNUM(handle->conn), "smbd async dosmode", "false");
connect_fail:
connect_fail:
talloc_free(cookie);
return ret;
}
static struct ceph_mount_info *cmount_of(const struct vfs_handle_struct *handle)
{
const struct cephmount_cached *entry = handle->data;
return entry->mount;
}
static void vfs_ceph_disconnect(struct vfs_handle_struct *handle)
{
int ret = cephmount_cache_remove(handle->data);
if (ret < 0) {
DBG_ERR("failed to remove ceph mount from cache: %s\n",
strerror(errno));
return;
}
struct ceph_mount_info *cmount = cmount_of(handle);
int ret = 0;
ret = cephmount_cache_remove(handle->data);
if (ret > 0) {
DBG_DEBUG("mount cache entry still in use\n");
return;
}
ret = ceph_unmount(handle->data);
ret = ceph_unmount(cmount);
if (ret < 0) {
DBG_ERR("[CEPH] failed to unmount: %s\n", strerror(-ret));
}
ret = ceph_release(handle->data);
ret = ceph_release(cmount);
if (ret < 0) {
DBG_ERR("[CEPH] failed to release: %s\n", strerror(-ret));
}
@ -393,7 +394,7 @@ static int vfs_ceph_ll_lookup_inode(const struct vfs_handle_struct *handle,
{
struct inodeno_t ino = {.val = inoval};
return ceph_ll_lookup_inode(handle->data, ino, pout);
return ceph_ll_lookup_inode(cmount_of(handle), ino, pout);
}
static int vfs_ceph_ll_walk(const struct vfs_handle_struct *handle,
@ -410,7 +411,15 @@ static int vfs_ceph_ll_walk(const struct vfs_handle_struct *handle,
if (uperm == NULL) {
return -ENOMEM;
}
ret = ceph_ll_walk(handle->data, name, pin, stx, want, flags, uperm);
ret = ceph_ll_walk(cmount_of(handle),
name,
pin,
stx,
want,
flags,
uperm);
vfs_ceph_userperm_del(uperm);
return ret;
}
@ -419,7 +428,7 @@ static int vfs_ceph_ll_statfs(const struct vfs_handle_struct *handle,
const struct vfs_ceph_iref *iref,
struct statvfs *stbuf)
{
return ceph_ll_statfs(handle->data, iref->inode, stbuf);
return ceph_ll_statfs(cmount_of(handle), iref->inode, stbuf);
}
static int vfs_ceph_ll_getattr(const struct vfs_handle_struct *handle,
@ -434,7 +443,7 @@ static int vfs_ceph_ll_getattr(const struct vfs_handle_struct *handle,
if (uperm == NULL) {
return -ENOMEM;
}
ret = ceph_ll_getattr(handle->data,
ret = ceph_ll_getattr(cmount_of(handle),
iref->inode,
&stx,
SAMBA_STATX_ATTR_MASK,
@ -460,7 +469,7 @@ static int vfs_ceph_ll_chown(struct vfs_handle_struct *handle,
if (uperm == NULL) {
return -ENOMEM;
}
ret = ceph_ll_setattr(handle->data,
ret = ceph_ll_setattr(cmount_of(handle),
iref->inode,
&stx,
CEPH_STATX_UID | CEPH_STATX_GID,
@ -511,7 +520,7 @@ static int vfs_ceph_iget_by_fname(const struct vfs_handle_struct *handle,
struct vfs_ceph_iref *iref)
{
const char *name = smb_fname->base_name;
const char *cwd = ceph_getcwd(handle->data);
const char *cwd = ceph_getcwd(cmount_of(handle));
int ret = -1;
if (!strcmp(name, cwd)) {
@ -539,7 +548,7 @@ static void vfs_ceph_iput(const struct vfs_handle_struct *handle,
if ((iref != NULL) && (iref->inode != NULL)) {
DBG_DEBUG("[CEPH] put-inode: ino=%" PRIu64 "\n", iref->ino);
ceph_ll_put(handle->data, iref->inode);
ceph_ll_put(cmount_of(handle), iref->inode);
iref->inode = NULL;
}
}
@ -556,14 +565,14 @@ static uint64_t vfs_ceph_disk_free(struct vfs_handle_struct *handle,
struct Inode *inode = NULL;
int ret;
ret = ceph_ll_lookup_root(handle->data, &inode);
ret = ceph_ll_lookup_root(cmount_of(handle), &inode);
if (ret != 0) {
DBG_DEBUG("[CEPH] ceph_ll_lookup_root returned %d\n", ret);
errno = -ret;
return (uint64_t)(-1);
}
ret = ceph_ll_statfs(handle->data, inode, &statvfs_buf);
ceph_ll_put(handle->data, inode);
ret = ceph_ll_statfs(cmount_of(handle), inode, &statvfs_buf);
ceph_ll_put(cmount_of(handle), inode);
if (ret != 0) {
DBG_DEBUG("[CEPH] ceph_ll_statfs returned %d\n", ret);
errno = -ret;
@ -641,10 +650,12 @@ static DIR *vfs_ceph_fdopendir(struct vfs_handle_struct *handle,
#ifdef HAVE_CEPH_FDOPENDIR
int dirfd = fsp_get_io_fd(fsp);
DBG_DEBUG("[CEPH] fdopendir(%p, %d)\n", handle, dirfd);
ret = ceph_fdopendir(handle->data, dirfd, &result);
ret = ceph_fdopendir(cmount_of(handle), dirfd, &result);
#else
DBG_DEBUG("[CEPH] fdopendir(%p, %p)\n", handle, fsp);
ret = ceph_opendir(handle->data, fsp->fsp_name->base_name, &result);
ret = ceph_opendir(cmount_of(handle),
fsp->fsp_name->base_name,
&result);
#endif
if (ret < 0) {
result = NULL;
@ -662,7 +673,8 @@ static struct dirent *vfs_ceph_readdir(struct vfs_handle_struct *handle,
struct dirent *result = NULL;
DBG_DEBUG("[CEPH] readdir(%p, %p)\n", handle, dirp);
result = ceph_readdir(handle->data, (struct ceph_dir_result *) dirp);
result = ceph_readdir(cmount_of(handle),
(struct ceph_dir_result *)dirp);
DBG_DEBUG("[CEPH] readdir(...) = %p\n", result);
return result;
@ -671,7 +683,7 @@ static struct dirent *vfs_ceph_readdir(struct vfs_handle_struct *handle,
static void vfs_ceph_rewinddir(struct vfs_handle_struct *handle, DIR *dirp)
{
DBG_DEBUG("[CEPH] rewinddir(%p, %p)\n", handle, dirp);
ceph_rewinddir(handle->data, (struct ceph_dir_result *) dirp);
ceph_rewinddir(cmount_of(handle), (struct ceph_dir_result *)dirp);
}
static int vfs_ceph_mkdirat(struct vfs_handle_struct *handle,
@ -688,7 +700,10 @@ static int vfs_ceph_mkdirat(struct vfs_handle_struct *handle,
dirfd,
smb_fname->base_name);
result = ceph_mkdirat(handle->data, dirfd, smb_fname->base_name, mode);
result = ceph_mkdirat(cmount_of(handle),
dirfd,
smb_fname->base_name,
mode);
DBG_DEBUG("[CEPH] mkdirat(...) = %d\n", result);
@ -706,7 +721,7 @@ static int vfs_ceph_mkdirat(struct vfs_handle_struct *handle,
DBG_DEBUG("[CEPH] mkdir(%p, %s)\n",
handle, smb_fname_str_dbg(full_fname));
result = ceph_mkdir(handle->data, full_fname->base_name, mode);
result = ceph_mkdir(cmount_of(handle), full_fname->base_name, mode);
TALLOC_FREE(full_fname);
@ -719,7 +734,8 @@ static int vfs_ceph_closedir(struct vfs_handle_struct *handle, DIR *dirp)
int result;
DBG_DEBUG("[CEPH] closedir(%p, %p)\n", handle, dirp);
result = ceph_closedir(handle->data, (struct ceph_dir_result *) dirp);
result = ceph_closedir(cmount_of(handle),
(struct ceph_dir_result *)dirp);
DBG_DEBUG("[CEPH] closedir(...) = %d\n", result);
return status_code(result);
}
@ -769,7 +785,7 @@ static int vfs_ceph_openat(struct vfs_handle_struct *handle,
became_root = true;
}
result = ceph_openat(handle->data,
result = ceph_openat(cmount_of(handle),
dirfd,
smb_fname->base_name,
flags,
@ -794,7 +810,10 @@ static int vfs_ceph_openat(struct vfs_handle_struct *handle,
became_root = true;
}
result = ceph_open(handle->data, smb_fname->base_name, flags, mode);
result = ceph_open(cmount_of(handle),
smb_fname->base_name,
flags,
mode);
#endif
if (became_root) {
unbecome_root();
@ -811,7 +830,7 @@ static int vfs_ceph_close(struct vfs_handle_struct *handle, files_struct *fsp)
int result;
DBG_DEBUG("[CEPH] close(%p, %p)\n", handle, fsp);
result = ceph_close(handle->data, fsp_get_pathref_fd(fsp));
result = ceph_close(cmount_of(handle), fsp_get_pathref_fd(fsp));
DBG_DEBUG("[CEPH] close(...) = %d\n", result);
return status_code(result);
}
@ -831,7 +850,12 @@ static ssize_t vfs_ceph_pread(struct vfs_handle_struct *handle,
llu(n),
llu(offset));
result = ceph_read(handle->data, fsp_get_io_fd(fsp), data, n, offset);
result = ceph_read(cmount_of(handle),
fsp_get_io_fd(fsp),
data,
n,
offset);
DBG_DEBUG("[CEPH] pread(...) = %llu\n", llu(result));
return lstatus_code(result);
}
@ -861,7 +885,7 @@ static struct tevent_req *vfs_ceph_pread_send(struct vfs_handle_struct *handle,
return NULL;
}
ret = ceph_read(handle->data, fsp_get_io_fd(fsp), data, n, offset);
ret = ceph_read(cmount_of(handle), fsp_get_io_fd(fsp), data, n, offset);
if (ret < 0) {
/* ceph returns -errno on error. */
tevent_req_error(req, -ret);
@ -902,7 +926,13 @@ static ssize_t vfs_ceph_pwrite(struct vfs_handle_struct *handle,
data,
llu(n),
llu(offset));
result = ceph_write(handle->data, fsp_get_io_fd(fsp), data, n, offset);
result = ceph_write(cmount_of(handle),
fsp_get_io_fd(fsp),
data,
n,
offset);
DBG_DEBUG("[CEPH] pwrite(...) = %llu\n", llu(result));
return lstatus_code(result);
}
@ -932,7 +962,8 @@ static struct tevent_req *vfs_ceph_pwrite_send(struct vfs_handle_struct *handle,
return NULL;
}
ret = ceph_write(handle->data, fsp_get_io_fd(fsp), data, n, offset);
ret = ceph_write(
cmount_of(handle), fsp_get_io_fd(fsp), data, n, offset);
if (ret < 0) {
/* ceph returns -errno on error. */
tevent_req_error(req, -ret);
@ -967,7 +998,10 @@ static off_t vfs_ceph_lseek(struct vfs_handle_struct *handle,
off_t result = 0;
DBG_DEBUG("[CEPH] vfs_ceph_lseek\n");
result = ceph_lseek(handle->data, fsp_get_io_fd(fsp), offset, whence);
result = ceph_lseek(cmount_of(handle),
fsp_get_io_fd(fsp),
offset,
whence);
return lstatus_code(result);
}
@ -1032,7 +1066,7 @@ static int vfs_ceph_renameat(struct vfs_handle_struct *handle,
return -1;
}
result = ceph_rename(handle->data,
result = ceph_rename(cmount_of(handle),
full_fname_src->base_name,
full_fname_dst->base_name);
@ -1063,7 +1097,7 @@ static struct tevent_req *vfs_ceph_fsync_send(struct vfs_handle_struct *handle,
}
/* Make sync call. */
ret = ceph_fsync(handle->data, fsp_get_io_fd(fsp), false);
ret = ceph_fsync(cmount_of(handle), fsp_get_io_fd(fsp), false);
if (ret != 0) {
/* ceph_fsync returns -errno on error. */
@ -1195,8 +1229,12 @@ static int vfs_ceph_fstatat(struct vfs_handle_struct *handle,
DBG_DEBUG("[CEPH] fstatat(%p, %d, %s)\n",
handle, dirfd, smb_fname->base_name);
result = ceph_statxat(handle->data, dirfd, smb_fname->base_name,
&stx, SAMBA_STATX_ATTR_MASK, 0);
result = ceph_statxat(cmount_of(handle),
dirfd,
smb_fname->base_name,
&stx,
SAMBA_STATX_ATTR_MASK,
0);
#else
struct smb_filename *full_fname = NULL;
@ -1210,8 +1248,11 @@ static int vfs_ceph_fstatat(struct vfs_handle_struct *handle,
DBG_DEBUG("[CEPH] fstatat(%p, %s)\n",
handle, smb_fname_str_dbg(full_fname));
result = ceph_statx(handle->data, full_fname->base_name,
&stx, SAMBA_STATX_ATTR_MASK, 0);
result = ceph_statx(cmount_of(handle),
full_fname->base_name,
&stx,
SAMBA_STATX_ATTR_MASK,
0);
TALLOC_FREE(full_fname);
#endif
@ -1286,7 +1327,7 @@ static int vfs_ceph_fntimes(struct vfs_handle_struct *handle,
/*
* We can use an io_fd to set xattrs.
*/
result = ceph_fsetattrx(handle->data,
result = ceph_fsetattrx(cmount_of(handle),
fsp_get_io_fd(fsp),
&stx,
mask);
@ -1294,7 +1335,7 @@ static int vfs_ceph_fntimes(struct vfs_handle_struct *handle,
/*
* This is no longer a handle based call.
*/
result = ceph_setattrx(handle->data,
result = ceph_setattrx(cmount_of(handle),
fsp->fsp_name->base_name,
&stx,
mask,
@ -1327,7 +1368,7 @@ static int vfs_ceph_unlinkat(struct vfs_handle_struct *handle,
return result;
}
result = ceph_unlinkat(handle->data,
result = ceph_unlinkat(cmount_of(handle),
dirfd,
smb_fname->base_name,
flags);
@ -1353,9 +1394,9 @@ static int vfs_ceph_unlinkat(struct vfs_handle_struct *handle,
}
if (flags & AT_REMOVEDIR) {
result = ceph_rmdir(handle->data, full_fname->base_name);
result = ceph_rmdir(cmount_of(handle), full_fname->base_name);
} else {
result = ceph_unlink(handle->data, full_fname->base_name);
result = ceph_unlink(cmount_of(handle), full_fname->base_name);
}
TALLOC_FREE(full_fname);
DBG_DEBUG("[CEPH] unlink(...) = %d\n", result);
@ -1374,12 +1415,14 @@ static int vfs_ceph_fchmod(struct vfs_handle_struct *handle,
/*
* We can use an io_fd to change permissions.
*/
result = ceph_fchmod(handle->data, fsp_get_io_fd(fsp), mode);
result = ceph_fchmod(cmount_of(handle),
fsp_get_io_fd(fsp),
mode);
} else {
/*
* This is no longer a handle based call.
*/
result = ceph_chmod(handle->data,
result = ceph_chmod(cmount_of(handle),
fsp->fsp_name->base_name,
mode);
}
@ -1399,7 +1442,7 @@ static int vfs_ceph_fchown(struct vfs_handle_struct *handle,
/*
* We can use an io_fd to change ownership.
*/
result = ceph_fchown(handle->data,
result = ceph_fchown(cmount_of(handle),
fsp_get_io_fd(fsp),
uid,
gid);
@ -1407,7 +1450,7 @@ static int vfs_ceph_fchown(struct vfs_handle_struct *handle,
/*
* This is no longer a handle based call.
*/
result = ceph_chown(handle->data,
result = ceph_chown(cmount_of(handle),
fsp->fsp_name->base_name,
uid,
gid);
@ -1448,7 +1491,7 @@ static int vfs_ceph_chdir(struct vfs_handle_struct *handle,
{
int result = -1;
DBG_DEBUG("[CEPH] chdir(%p, %s)\n", handle, smb_fname->base_name);
result = ceph_chdir(handle->data, smb_fname->base_name);
result = ceph_chdir(cmount_of(handle), smb_fname->base_name);
DBG_DEBUG("[CEPH] chdir(...) = %d\n", result);
return status_code(result);
}
@ -1456,7 +1499,7 @@ static int vfs_ceph_chdir(struct vfs_handle_struct *handle,
static struct smb_filename *vfs_ceph_getwd(struct vfs_handle_struct *handle,
TALLOC_CTX *ctx)
{
const char *cwd = ceph_getcwd(handle->data);
const char *cwd = ceph_getcwd(cmount_of(handle));
DBG_DEBUG("[CEPH] getwd(%p) = %s\n", handle, cwd);
return synthetic_smb_fname(ctx, cwd, NULL, NULL, 0, 0);
}
@ -1486,12 +1529,14 @@ static int strict_allocate_ftruncate(struct vfs_handle_struct *handle,
/* Shrink - just ftruncate. */
if (pst->st_ex_size > len) {
result = ceph_ftruncate(handle->data, fsp_get_io_fd(fsp), len);
result = ceph_ftruncate(cmount_of(handle),
fsp_get_io_fd(fsp),
len);
return status_code(result);
}
space_to_write = len - pst->st_ex_size;
result = ceph_fallocate(handle->data,
result = ceph_fallocate(cmount_of(handle),
fsp_get_io_fd(fsp),
0,
pst->st_ex_size,
@ -1511,7 +1556,7 @@ static int vfs_ceph_ftruncate(struct vfs_handle_struct *handle,
return strict_allocate_ftruncate(handle, fsp, len);
}
result = ceph_ftruncate(handle->data, fsp_get_io_fd(fsp), len);
result = ceph_ftruncate(cmount_of(handle), fsp_get_io_fd(fsp), len);
return status_code(result);
}
@ -1526,8 +1571,11 @@ static int vfs_ceph_fallocate(struct vfs_handle_struct *handle,
DBG_DEBUG("[CEPH] fallocate(%p, %p, %u, %llu, %llu\n",
handle, fsp, mode, llu(offset), llu(len));
/* unsupported mode flags are rejected by libcephfs */
result = ceph_fallocate(
handle->data, fsp_get_io_fd(fsp), mode, offset, len);
result = ceph_fallocate(cmount_of(handle),
fsp_get_io_fd(fsp),
mode,
offset,
len);
DBG_DEBUG("[CEPH] fallocate(...) = %d\n", result);
return status_code(result);
}
@ -1613,7 +1661,7 @@ static int vfs_ceph_symlinkat(struct vfs_handle_struct *handle,
dirfd,
new_smb_fname->base_name);
result = ceph_symlinkat(handle->data,
result = ceph_symlinkat(cmount_of(handle),
link_target->base_name,
dirfd,
new_smb_fname->base_name);
@ -1633,9 +1681,9 @@ static int vfs_ceph_symlinkat(struct vfs_handle_struct *handle,
link_target->base_name,
full_fname->base_name);
result = ceph_symlink(handle->data,
link_target->base_name,
full_fname->base_name);
result = ceph_symlink(cmount_of(handle),
link_target->base_name,
full_fname->base_name);
TALLOC_FREE(full_fname);
DBG_DEBUG("[CEPH] symlink(...) = %d\n", result);
return status_code(result);
@ -1659,7 +1707,7 @@ static int vfs_ceph_readlinkat(struct vfs_handle_struct *handle,
buf,
llu(bufsiz));
result = ceph_readlinkat(handle->data,
result = ceph_readlinkat(cmount_of(handle),
dirfd,
smb_fname->base_name,
buf,
@ -1680,7 +1728,7 @@ static int vfs_ceph_readlinkat(struct vfs_handle_struct *handle,
DBG_DEBUG("[CEPH] readlink(%p, %s, %p, %llu)\n", handle,
full_fname->base_name, buf, llu(bufsiz));
result = ceph_readlink(handle->data,
result = ceph_readlink(cmount_of(handle),
full_fname->base_name,
buf,
bufsiz);
@ -1719,9 +1767,9 @@ static int vfs_ceph_linkat(struct vfs_handle_struct *handle,
full_fname_old->base_name,
full_fname_new->base_name);
result = ceph_link(handle->data,
full_fname_old->base_name,
full_fname_new->base_name);
result = ceph_link(cmount_of(handle),
full_fname_old->base_name,
full_fname_new->base_name);
DBG_DEBUG("[CEPH] link(...) = %d\n", result);
TALLOC_FREE(full_fname_old);
TALLOC_FREE(full_fname_new);
@ -1745,7 +1793,10 @@ static int vfs_ceph_mknodat(struct vfs_handle_struct *handle,
}
DBG_DEBUG("[CEPH] mknodat(%p, %s)\n", handle, full_fname->base_name);
result = ceph_mknod(handle->data, full_fname->base_name, mode, dev);
result = ceph_mknod(cmount_of(handle),
full_fname->base_name,
mode,
dev);
DBG_DEBUG("[CEPH] mknodat(...) = %d\n", result);
TALLOC_FREE(full_fname);
@ -1869,13 +1920,13 @@ static ssize_t vfs_ceph_fgetxattr(struct vfs_handle_struct *handle,
value,
llu(size));
if (!fsp->fsp_flags.is_pathref) {
ret = ceph_fgetxattr(handle->data,
ret = ceph_fgetxattr(cmount_of(handle),
fsp_get_io_fd(fsp),
name,
value,
size);
} else {
ret = ceph_getxattr(handle->data,
ret = ceph_getxattr(cmount_of(handle),
fsp->fsp_name->base_name,
name,
value,
@ -1897,18 +1948,18 @@ static ssize_t vfs_ceph_flistxattr(struct vfs_handle_struct *handle,
/*
* We can use an io_fd to list xattrs.
*/
ret = ceph_flistxattr(handle->data,
fsp_get_io_fd(fsp),
list,
size);
ret = ceph_flistxattr(cmount_of(handle),
fsp_get_io_fd(fsp),
list,
size);
} else {
/*
* This is no longer a handle based call.
*/
ret = ceph_listxattr(handle->data,
fsp->fsp_name->base_name,
list,
size);
ret = ceph_listxattr(cmount_of(handle),
fsp->fsp_name->base_name,
list,
size);
}
DBG_DEBUG("[CEPH] flistxattr(...) = %d\n", ret);
return lstatus_code(ret);
@ -1924,14 +1975,16 @@ static int vfs_ceph_fremovexattr(struct vfs_handle_struct *handle,
/*
* We can use an io_fd to remove xattrs.
*/
ret = ceph_fremovexattr(handle->data, fsp_get_io_fd(fsp), name);
ret = ceph_fremovexattr(cmount_of(handle),
fsp_get_io_fd(fsp),
name);
} else {
/*
* This is no longer a handle based call.
*/
ret = ceph_removexattr(handle->data,
fsp->fsp_name->base_name,
name);
ret = ceph_removexattr(cmount_of(handle),
fsp->fsp_name->base_name,
name);
}
DBG_DEBUG("[CEPH] fremovexattr(...) = %d\n", ret);
return status_code(ret);
@ -1956,22 +2009,22 @@ static int vfs_ceph_fsetxattr(struct vfs_handle_struct *handle,
/*
* We can use an io_fd to set xattrs.
*/
ret = ceph_fsetxattr(handle->data,
fsp_get_io_fd(fsp),
name,
value,
size,
flags);
ret = ceph_fsetxattr(cmount_of(handle),
fsp_get_io_fd(fsp),
name,
value,
size,
flags);
} else {
/*
* This is no longer a handle based call.
*/
ret = ceph_setxattr(handle->data,
fsp->fsp_name->base_name,
name,
value,
size,
flags);
ret = ceph_setxattr(cmount_of(handle),
fsp->fsp_name->base_name,
name,
value,
size,
flags);
}
DBG_DEBUG("[CEPH] fsetxattr(...) = %d\n", ret);
return status_code(ret);
@ -2004,9 +2057,9 @@ static NTSTATUS vfs_ceph_create_dfs_pathat(struct vfs_handle_struct *handle,
goto out;
}
ret = ceph_symlink(handle->data,
msdfs_link,
full_fname->base_name);
ret = ceph_symlink(cmount_of(handle),
msdfs_link,
full_fname->base_name);
if (ret == 0) {
status = NT_STATUS_OK;
} else {
@ -2081,7 +2134,7 @@ static NTSTATUS vfs_ceph_read_dfs_pathat(struct vfs_handle_struct *handle,
goto err;
}
ret = ceph_statx(handle->data,
ret = ceph_statx(cmount_of(handle),
full_fname->base_name,
&stx,
SAMBA_STATX_ATTR_MASK,
@ -2091,11 +2144,11 @@ static NTSTATUS vfs_ceph_read_dfs_pathat(struct vfs_handle_struct *handle,
goto err;
}
referral_len = ceph_readlink(handle->data,
full_fname->base_name,
link_target,
bufsize - 1);
if (referral_len < 0) {
referral_len = ceph_readlink(cmount_of(handle),
full_fname->base_name,
link_target,
bufsize - 1);
if (referral_len < 0) {
/* ceph errors are -errno. */
if (-referral_len == EINVAL) {
DBG_INFO("%s is not a link.\n",
@ -2109,8 +2162,8 @@ static NTSTATUS vfs_ceph_read_dfs_pathat(struct vfs_handle_struct *handle,
strerror(errno));
}
goto err;
}
link_target[referral_len] = '\0';
}
link_target[referral_len] = '\0';
DBG_INFO("%s -> %s\n",
full_fname->base_name,