/** * FSAL_write: * Perform a write operation on an opened file. * * \param file_descriptor (input): * The file descriptor returned by FSAL_open. * \param seek_descriptor (optional input): * Specifies the position where data is to be written. * If not specified, data will be written at the current position. * \param buffer_size (input): * Amount (in bytes) of data to be written. * \param buffer (input): * Address in memory of the data to write to file. * \param write_amount (output): * Pointer to the amount of data (in bytes) that have been written * during this call. * * \return Major error codes: * - ERR_FSAL_NO_ERROR (no error) * - ERR_FSAL_INVAL (invalid parameter) * - ERR_FSAL_NOT_OPENED (tried to write in a non-opened zfsfsal_file_t) * - ERR_FSAL_FAULT (a NULL pointer was passed as mandatory argument) * - Other error codes can be returned : * ERR_FSAL_IO, ERR_FSAL_NOSPC, ERR_FSAL_DQUOT... */ fsal_status_t ZFSFSAL_write(zfsfsal_file_t * file_descriptor, /* IN */ fsal_seek_t * seek_descriptor, /* IN */ fsal_size_t buffer_size, /* IN */ caddr_t buffer, /* IN */ fsal_size_t * write_amount /* OUT */ ) { int rc, behind = 0; off_t offset; /* sanity checks. */ if(!file_descriptor || !buffer || !write_amount) Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_write); TakeTokenFSCall(); if(seek_descriptor) { switch(seek_descriptor->whence) { case FSAL_SEEK_CUR: offset = file_descriptor->current_offset + seek_descriptor->offset; break; case FSAL_SEEK_SET: offset = seek_descriptor->offset; break; case FSAL_SEEK_END: behind = 1; offset = seek_descriptor->offset; break; } } rc = libzfswrap_write(file_descriptor->p_vfs, &file_descriptor->cred, file_descriptor->p_vnode, buffer, buffer_size, behind, offset); ReleaseTokenFSCall(); /* >> interpreted returned status << */ if(rc) Return(posix2fsal_error(rc), 0, INDEX_FSAL_write); /* >> dont forget setting output vars : write_amount << */ *write_amount = buffer_size; Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_write); }
/** * FSAL_write: * Perform a write operation on an opened file. * * \param file_descriptor (input): * The file descriptor returned by FSAL_open. * \param p_context (input): * Authentication context for the operation (user,...). * \param seek_descriptor (optional input): * Specifies the position where data is to be written. * If not specified, data will be written at the current position. * \param buffer_size (input): * Amount (in bytes) of data to be written. * \param buffer (input): * Address in memory of the data to write to file. * \param write_amount (output): * Pointer to the amount of data (in bytes) that have been written * during this call. * * \return Major error codes: * - ERR_FSAL_NO_ERROR (no error) * - ERR_FSAL_INVAL (invalid parameter) * - ERR_FSAL_NOT_OPENED (tried to write in a non-opened zfsfsal_file_t) * - ERR_FSAL_FAULT (a NULL pointer was passed as mandatory argument) * - Other error codes can be returned : * ERR_FSAL_IO, ERR_FSAL_NOSPC, ERR_FSAL_DQUOT... */ fsal_status_t ZFSFSAL_write(fsal_file_t * file_desc, /* IN */ fsal_op_context_t * p_context, /* IN */ fsal_seek_t * seek_descriptor, /* IN */ fsal_size_t buffer_size, /* IN */ caddr_t buffer, /* IN */ fsal_size_t * write_amount /* OUT */ ) { int rc, behind = 0; off_t offset; zfsfsal_file_t * file_descriptor = (zfsfsal_file_t *)file_desc; /* sanity checks. */ if(!file_descriptor || !buffer || !write_amount) Return(ERR_FSAL_FAULT, 0, INDEX_FSAL_write); /* Hook to prevent writing into a snapshot */ if(file_descriptor->handle.data.i_snap != 0) { LogDebug(COMPONENT_FSAL, "Trying to write to a file inside a snapshot"); Return(ERR_FSAL_ROFS, 0, INDEX_FSAL_write); } TakeTokenFSCall(); if(seek_descriptor) { switch(seek_descriptor->whence) { case FSAL_SEEK_CUR: offset = file_descriptor->current_offset + seek_descriptor->offset; break; case FSAL_SEEK_SET: offset = seek_descriptor->offset; break; case FSAL_SEEK_END: behind = 1; offset = seek_descriptor->offset; break; } } /* Test that the vfs still exist */ ZFSFSAL_VFS_RDLock(); libzfswrap_vfs_t *p_vfs = ZFSFSAL_GetVFS(&file_descriptor->handle); if(!p_vfs) { ZFSFSAL_VFS_Unlock(); ReleaseTokenFSCall(); Return(ERR_FSAL_NOENT, 0, INDEX_FSAL_write); } rc = libzfswrap_write(p_vfs, &file_descriptor->cred, file_descriptor->p_vnode, buffer, buffer_size, behind, offset); ZFSFSAL_VFS_Unlock(); ReleaseTokenFSCall(); /* >> interpreted returned status << */ if(rc) Return(posix2fsal_error(rc), 0, INDEX_FSAL_write); /* >> dont forget setting output vars : write_amount << */ *write_amount = buffer_size; Return(ERR_FSAL_NO_ERROR, 0, INDEX_FSAL_write); }