static nfsstat4 make_ds_handle(struct fsal_pnfs_ds *const pds, const struct gsh_buffdesc *const desc, struct fsal_ds_handle **const handle, int flags) { struct lustre_file_handle *lustre_fh = (struct lustre_file_handle *)desc->addr; struct lustre_ds *ds; /* Handle to be created */ struct fsal_filesystem *fs; struct fsal_fsid__ fsid; enum fsid_type fsid_type; *handle = NULL; if (desc->len != sizeof(struct lustre_file_handle)) return NFS4ERR_BADHANDLE; lustre_extract_fsid(lustre_fh, &fsid_type, &fsid); fs = lookup_fsid(&fsid, fsid_type); if (fs == NULL) { LogInfo(COMPONENT_FSAL, "Could not find filesystem for fsid=0x%016"PRIx64 ".0x%016"PRIx64" from handle", fsid.major, fsid.minor); return NFS4ERR_STALE; } if (fs->fsal != pds->fsal) { LogInfo(COMPONENT_FSAL, "Non LUSTRE filesystem fsid=0x%016"PRIx64 ".0x%016"PRIx64" from handle", fsid.major, fsid.minor); return NFS4ERR_STALE; } ds = gsh_calloc(sizeof(struct lustre_ds), 1); if (ds == NULL) return NFS4ERR_SERVERFAULT; *handle = &ds->ds; fsal_ds_handle_init(*handle, pds); /* Connect lazily when a FILE_SYNC4 write forces us to, not here. */ ds->connected = false; ds->lustre_fs = fs->private; memcpy(&ds->wire, desc->addr, desc->len); return NFS4_OK; }
/** * @brief Create a FSAL data server handle from a wire handle * * This function creates a FSAL data server handle from a client * supplied "wire" handle. This is also where validation gets done, * since PUTFH is the only operation that can return * NFS4ERR_BADHANDLE. * * @param[in] export_pub The export in which to create the handle * @param[in] desc Buffer from which to create the file * @param[out] ds_pub FSAL data server handle * * @return NFSv4.1 error codes. */ static nfsstat4 make_ds_handle(struct fsal_pnfs_ds *const pds, const struct gsh_buffdesc *const hdl_desc, struct fsal_ds_handle **const handle, int flags) { /* Handle to be created for DS */ struct glfs_ds_handle *ds = NULL; unsigned char globjhdl[GFAPI_HANDLE_LENGTH] = {'\0'}; struct stat sb; struct glusterfs_export *glfs_export = container_of(pds->mds_fsal_export, struct glusterfs_export, export); *handle = NULL; if (hdl_desc->len != sizeof(struct glfs_ds_wire)) return NFS4ERR_BADHANDLE; ds = gsh_calloc(1, sizeof(struct glfs_ds_handle)); *handle = &ds->ds; fsal_ds_handle_init(*handle, pds); memcpy(globjhdl, hdl_desc->addr, GFAPI_HANDLE_LENGTH); /* Create glfs_object for the DS handle */ ds->glhandle = glfs_h_create_from_handle(glfs_export->gl_fs->fs, globjhdl, GFAPI_HANDLE_LENGTH, &sb); if (ds->glhandle == NULL) { LogDebug(COMPONENT_PNFS, "glhandle in ds_handle is NULL"); return NFS4ERR_SERVERFAULT; } /* Connect lazily when a FILE_SYNC4 write forces us to, not here. */ ds->connected = false; return NFS4_OK; }
static nfsstat4 make_ds_handle(struct fsal_pnfs_ds *const pds, const struct gsh_buffdesc *const desc, struct fsal_ds_handle **const handle, int flags) { struct gpfs_file_handle *fh = (struct gpfs_file_handle *)desc->addr; struct gpfs_ds *ds; /* Handle to be created */ struct fsal_filesystem *fs; struct fsal_fsid__ fsid; *handle = NULL; if (desc->len != sizeof(struct gpfs_file_handle)) return NFS4ERR_BADHANDLE; if (flags & FH_FSAL_BIG_ENDIAN) { #if (BYTE_ORDER != BIG_ENDIAN) fh->handle_size = bswap_16(fh->handle_size); fh->handle_type = bswap_16(fh->handle_type); fh->handle_version = bswap_16(fh->handle_version); fh->handle_key_size = bswap_16(fh->handle_key_size); #endif } else { #if (BYTE_ORDER == BIG_ENDIAN) fh->handle_size = bswap_16(fh->handle_size); fh->handle_type = bswap_16(fh->handle_type); fh->handle_version = bswap_16(fh->handle_version); fh->handle_key_size = bswap_16(fh->handle_key_size); #endif } LogFullDebug(COMPONENT_FSAL, "flags 0x%X size %d type %d ver %d key_size %d FSID 0x%X:%X", flags, fh->handle_size, fh->handle_type, fh->handle_version, fh->handle_key_size, fh->handle_fsid[0], fh->handle_fsid[1]); gpfs_extract_fsid(fh, &fsid); fs = lookup_fsid(&fsid, GPFS_FSID_TYPE); if (fs == NULL) { LogInfo(COMPONENT_FSAL, "Could not find filesystem for fsid=0x%016"PRIx64 ".0x%016"PRIx64" from handle", fsid.major, fsid.minor); return NFS4ERR_STALE; } if (fs->fsal != pds->fsal) { LogInfo(COMPONENT_FSAL, "Non GPFS filesystem fsid=0x%016"PRIx64".0x%016"PRIx64 " from handle", fsid.major, fsid.minor); return NFS4ERR_STALE; } ds = gsh_calloc(1, sizeof(struct gpfs_ds)); *handle = &ds->ds; fsal_ds_handle_init(*handle, pds); /* Connect lazily when a FILE_SYNC4 write forces us to, not here. */ ds->connected = false; ds->gpfs_fs = fs->private_data; memcpy(&ds->wire, desc->addr, desc->len); return NFS4_OK; }