blob: 665499ca09c48fce7e0a4db04fc65e9fb123c364 [file] [log] [blame]
/*
* Copyright (c) 2000-2004 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef HSMAPI_H
#define HSMAPI_H
#include <xfs/xfs.h>
#include <xfs/jdm.h>
#include "types.h"
#include "global.h"
#include "content.h"
#include "content_inode.h"
#define HSM_API_VERSION_1 1 /* only version supported so far */
typedef void hsm_fs_ctxt_t; /* opaque HSM filesystem context */
typedef void hsm_f_ctxt_t; /* opaque HSM file context */
/******************************************************************************
* Name
* HsmInitFsysContext - allocate and initialize an HSM filesystem context
*
* Description
* HsmInitFsysContext allocates and initializes an HSM filesystem
* context to hold all filesystem information that might later be needed
* by the other HSM routines. The context is read-only, and can be shared
* by multiple xfsdump dump streams. It should eventually be freed by
* calling HsmDeleteFsysContext(). The caller must provide the mount
* point of the filesystem to be dumped and the HSM API version that
* xfsdump was compiled with.
*
* Note: The restore routines do not require an HSM filesystem context.
*
* Returns
* != NULL, then a pointer to the filesystem context that was allocated.
* == NULL, either the HSM libary is not compatible with xfsdump, or
* the filesystem is not under HSM management.
******************************************************************************/
extern hsm_fs_ctxt_t *
HsmInitFsysContext(
const char *mountpoint,
int dumpversion);
/******************************************************************************
* Name
* HsmDeleteFsysContext - delete an HSM filesystem context
*
* Description
* HsmDeleteFsysContext releases all storage previously allocated to a
* HSM filesystem context via HsmInitFsysContext.
*
* Returns
* None.
******************************************************************************/
extern void
HsmDeleteFsysContext(
hsm_fs_ctxt_t *contextp);
/******************************************************************************
* Name
* HsmEstimateFileSpace - return estimated offline file size
*
* Description
* HsmEstimateFileSpace is called from within estimate_dump_space() only
* if -a is selected. It estimates the number of bytes needed to dump
* the file assuming that all dual-residency data will be dumped as holes.
*
* Returns
* != 0, then *bytes contains the estimated size of the file in bytes.
* == 0, then no estimate made. Caller should use his default estimator.
******************************************************************************/
extern int
HsmEstimateFileSpace(
hsm_fs_ctxt_t *fscontextp,
hsm_f_ctxt_t *fcontextp,
const xfs_bstat_t *statp,
off64_t *bytes,
int accurate);
/******************************************************************************
* Name
* HsmEstimateFileOffset - return estimated file offset
*
* Description
* HsmEstimateFileOffset is called from within quantity2offset() only
* if -a is selected. It estimates the offset within the file that has
* 'bytecount' bytes of physical data preceding it assuming that all
* dual-residency data in the file will be dumped as holes.
*
* Returns
* != 0, then *byteoffset contains the estimated offset within the file.
* == 0, then no estimate made. Caller should use his default estimator.
******************************************************************************/
extern int
HsmEstimateFileOffset(
hsm_fs_ctxt_t *contextp,
const xfs_bstat_t *statp,
off64_t bytecount,
off64_t *byteoffset);
/******************************************************************************
* Name
* HsmAllocateFileContext - allocate an HSM file context
*
* Description
* HsmAllocateFileContext mallocs the maximum-sized file context that
* might later be needed by HsmInitFileContext(). The context is
* read-write. Each xfsdump stream must have its own file context. This
* context should eventually be freed by calling HsmDeleteFileContext().
* The caller must provide the HSM filesystem context for the filesystem
* being dumped.
*
* Note: The restore routines do not require an HSM file context.
*
* Returns
* != NULL, then a pointer to the file context that was allocated.
******************************************************************************/
extern hsm_f_ctxt_t *
HsmAllocateFileContext(
hsm_fs_ctxt_t *contextp);
/******************************************************************************
* Name
* HsmDeleteFileContext - delete a previously created HSM file context
*
* Description
* HsmDeleteFileContext releases all storage previously allocated to a
* HSM file context via HsmAllocateFileContext.
*
* Returns
* None.
******************************************************************************/
extern void
HsmDeleteFileContext(
hsm_f_ctxt_t *contextp);
/******************************************************************************
* Name
* HsmInitFileContext - initialize the HSM context for a particular file
*
* Description
* HsmInitFileContext initializes an existing HSM file context for
* subsequent operations on a particular regular file. Other HSM routines
* use the context to access information collected by HsmInitFileContext
* about the file rather than having to recollect the file's information
* on each call.
*
* Returns
* != 0, context was created.
* == 0, if something is wrong with the file and it should not be dumped.
******************************************************************************/
extern int
HsmInitFileContext(
hsm_f_ctxt_t *contextp,
const xfs_bstat_t *statp);
/******************************************************************************
* Name
* HsmModifyInode - modify a xfs_bstat_t to make a file appear offline
*
* Description
* HsmModifyInode uses the context provided by a previous
* HsmInitFileContext call to determine how to modify a xfs_bstat_t
* structure to make a dual-residency HSM file appear to be offline.
*
* Returns
* != 0, xfs_bstat_t structure was modified.
* == 0, if something is wrong with the file and it should not be dumped.
******************************************************************************/
extern int
HsmModifyInode(
hsm_f_ctxt_t *contextp,
xfs_bstat_t *statp);
/******************************************************************************
* Name
* HsmModifyExtentMap - modify getbmapx array to make file appear offline
*
* Description
* HsmModifyExtentMap uses the context provided by a previous
* HsmInitFileContext call to determine how to modify a contiguous array
* of getbmapx structures to make a dual-residency HSM file appear to
* be offline.
*
* Returns
* != 0, getbmapx array was successfully modified.
* == 0, if something is wrong with the file and it should not be dumped.
******************************************************************************/
extern int
HsmModifyExtentMap(
hsm_f_ctxt_t *contextp,
struct getbmapx *bmap);
/******************************************************************************
* Name
* HsmFilterExistingAttribute - filter out unwanted extended attributes
*
* Description
* HsmFilterExistingAttribute uses the context provided by a previous
* HsmInitFileContext call to determine whether or not the extended
* attribute with name 'namep' should be included in a file's dump image.
* (An extended attribute can be modified within the dump by filtering
* it out with this routine, then adding the new version of the attribute
* back with HsmAddNewAttribute.)
*
* Note: this routine must be idempotent. It is possible that xfsdump
* will call this routine a second time for the same attribute if after
* the first call it discovers that there isn't room in its buffer to
* hold the attribute value.
*
* Returns
* != 0, the attribute was successfully examined. If '*skip_entry' is
* non-zero, xfsdump will not add this attribute to the dump.
* == 0, if something is wrong with the file and it should not be dumped.
******************************************************************************/
extern int
HsmFilterExistingAttribute(
hsm_f_ctxt_t *hsm_f_ctxtp,
const char *namep, /* name of attribute to filter */
u_int32_t valuesz, /* attribute's current value size */
int flag, /* ext attr flags */
int *skip_entry);
/******************************************************************************
* Name
* HsmAddNewAttribute - add zero or more HSM attributes to a file's dump
*
* Description
* HsmAddNewAttribute uses the context provided by a previous
* HsmInitFileContext call to determine whether or not additional HSM
* extended attributes need to be added to a file's dump image. On the
* first call for a file, 'cursor' will be zero. xfsdump will increment
* 'cursor' by one each time it asks for a new attribute. When no more
* attributes are to be added, '*namepp' should be set to NULL.
*
* Note: this routine must be idempotent. It is possible that xfsdump
* will call this routine a second time using the same cursor value if
* it discovers that there isn't room in its buffer to hold the attribute
* value it was given in the first call.
*
* Returns
* != 0, call was successful. If '*namepp' is non-NULL, then it is the
* name of an attribute to be added to the file's dump. '*valuep'
* points the the value of the attribute, and '*valueszp' is the
* value's size. If '*namep* is NULL, then there are no more
* attributes to be added.
* == 0, if something is wrong with the file and it should not be dumped.
******************************************************************************/
extern int
HsmAddNewAttribute(
hsm_f_ctxt_t *hsm_f_ctxtp,
int cursor,
int flag, /* ext attr flags */
char **namepp, /* pointer to new attribute name */
char **valuepp, /* pointer to its value */
u_int32_t *valueszp); /* pointer to the value size */
/******************************************************************************
* Name
* HsmBeginRestoreFile
*
* Description
* HsmBeginRestoreFile is called after a file is created but before any
* data has been restored to it. The hsm_flagp param can be used to
* keep track of limited state between calls to the HSM restore routines.
*
* Note that this does not require a filesystem or file context like the
* HSM calls for xfsdump. This is currently a crude interface to satisfy
* a specific need. It can be generalized at a later time, if necessary.
*
* Returns
* None.
******************************************************************************/
extern void
HsmBeginRestoreFile(
bstat_t *statp,
int fd,
int *hsm_flagp);
/******************************************************************************
* Name
* HsmRestoreAttribute
*
* Description
** HsmRestoreAttribute is called when restoring an extended attribute.
* The hsm_flagp param can be used to keep track of limited state
* between calls to the HSM restore routines.
*
* Note that this does not require a filesystem or file context like the
* HSM calls for xfsdump. This is currently a crude interface to satisfy
* a specific need. It can be generalized at a later time, if necessary.
*
* Returns
* None.
******************************************************************************/
extern void
HsmRestoreAttribute(
int flag, /* ext attr flags */
char *namep, /* pointer to new attribute name */
int *hsm_flagp);
/******************************************************************************
* Name
* HsmEndRestoreFile
*
* Description
* HsmEndRestoreFile is called when all data and extended attributes
* have been restored. The hsm_flagsp param can be used to keep track
* of limited state between calls to the HSM restore routines.
*
* Note that this does not require a filesystem or file context like the
* HSM calls for xfsdump. This is currently a crude interface to satisfy
* a specific need. It can be generalized at a later time, if necessary.
*
* Returns
* None.
******************************************************************************/
extern void
HsmEndRestoreFile(
char *path,
int fd,
int *hsm_flagp);
#endif /* HSMAPI_H */