File: [Development] / xfs-cmds / dmapi / include / dmapi_kern.h (download)
Revision 1.3, Thu Mar 21 17:33:31 2002 UTC (15 years, 7 months ago) by roehrich
Branch: MAIN
Changes since 1.2: +5 -1
lines
dm_handle_to_path() will now work in most cases, and in the other cases
there's just a little more grunt work that has to be done in the library. If
the directory that contains some component of the path has never had a lookup
performed on it, then the kernel won't have that dir in its dcache. In that
case it'll create an anonymous dentry for the filesystem's root dir, and the
library detects that this happened.
If the library detects that an anonymous dentry was created, then it returns
an error indicating that it didn't find the path. Before I take this another
step, I'd like to know if this scenario happens in actual practice. I'm
betting the directory of interest has almost always been loaded into the
dcache by a user process before the HSM uses dm_handle_to_path(). We'll see.
It seems that ioctl(XFS_IOC_OPEN_BY_HANDLE) would have the same restriction,
though it looks like it's never used in a case where the path hasn't already
been accessed.
This mod also removes libdm's dependence on libhandle.
sync with kernel side
|
/*
* Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 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.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write the Free Software Foundation, Inc., 59
* Temple Place - Suite 330, Boston MA 02111-1307, USA.
*
* Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
* Mountain View, CA 94043, or:
*
* http://www.sgi.com
*
* For further information regarding this notice, see:
*
* http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
*/
#ifndef __DMAPI_KERN_H__
#define __DMAPI_KERN_H__
struct sys_dmapi_args {
long arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11;
};
typedef struct sys_dmapi_args sys_dmapi_args_t;
#ifdef __KERNEL__
struct xfs_handle_t;
/* The first group of definitions and prototypes define the filesystem's
interface into the DMAPI code.
*/
/* Definitions used for the flags field on dm_send_data_event(),
dm_send_unmount_event(), and dm_send_namesp_event() calls.
*/
#define DM_FLAGS_NDELAY 0x001 /* return EAGAIN after dm_pending() */
#define DM_FLAGS_UNWANTED 0x002 /* event not in fsys dm_eventset_t */
/* Possible code levels reported by dm_code_level(). */
#define DM_CLVL_INIT 0 /* DMAPI prior to X/Open compliance */
#define DM_CLVL_XOPEN 1 /* X/Open compliant DMAPI */
/* Prototypes used outside of the DMI module/directory. */
int dm_send_data_event(
dm_eventtype_t event,
struct bhv_desc *bdp,
dm_right_t vp_right,
off_t off,
size_t len,
int flags);
int dm_send_destroy_event(
struct bhv_desc *bdp,
dm_right_t vp_right);
int dm_send_mount_event(
struct vfs *vfsp,
dm_right_t vfsp_right,
struct bhv_desc *bdp,
dm_right_t vp_right,
struct bhv_desc *rootbdp,
dm_right_t rootvp_right,
char *name1,
char *name2);
int dm_send_namesp_event(
dm_eventtype_t event,
struct bhv_desc *bdp1,
dm_right_t vp1_right,
struct bhv_desc *bdp2,
dm_right_t vp2_right,
char *name1,
char *name2,
mode_t mode,
int retcode,
int flags);
void dm_send_unmount_event(
struct vfs *vfsp,
struct vnode *vp,
dm_right_t vfsp_right,
mode_t mode,
int retcode,
int flags);
int dm_code_level(void);
int dm_vp_to_handle (
struct vnode *vp,
xfs_handle_t *handlep);
void dm_hookup_vfsmount(
vfs_t *vfsp,
struct vfsmount *mnt);
/* The following prototypes and definitions are used by DMAPI as its
interface into the filesystem code. Communication between DMAPI and the
filesystem are established as follows:
1. DMAPI uses the VFS_DMAPI_FSYS_VECTOR to ask for the addresses
of all the functions within the filesystem that it may need to call.
2. The filesystem returns an array of function name/address pairs which
DMAPI builds into a function vector.
The VFS_DMAPI_FSYS_VECTOR call is only made one time for a particular
filesystem type. From then on, DMAPI uses its function vector to call the
filesystem functions directly. Functions in the array which DMAPI doesn't
recognize are ignored. A dummy function which returns ENOSYS is used for
any function that DMAPI needs but which was not provided by the filesystem.
If XFS doesn't recognize the VFS_DMAPI_FSYS_VECTOR, DMAPI assumes that it
doesn't have the X/Open support code; in this case DMAPI uses the XFS-code
originally bundled within DMAPI.
The goal of this interface is allow incremental changes to be made to
both the filesystem and to DMAPI while minimizing inter-patch dependencies,
and to eventually allow DMAPI to support multiple filesystem types at the
same time should that become necessary.
*/
typedef enum {
DM_FSYS_CLEAR_INHERIT = 0,
DM_FSYS_CREATE_BY_HANDLE = 1,
DM_FSYS_DOWNGRADE_RIGHT = 2,
DM_FSYS_GET_ALLOCINFO_RVP = 3,
DM_FSYS_GET_BULKALL_RVP = 4,
DM_FSYS_GET_BULKATTR_RVP = 5,
DM_FSYS_GET_CONFIG = 6,
DM_FSYS_GET_CONFIG_EVENTS = 7,
DM_FSYS_GET_DESTROY_DMATTR = 8,
DM_FSYS_GET_DIOINFO = 9,
DM_FSYS_GET_DIRATTRS_RVP = 10,
DM_FSYS_GET_DMATTR = 11,
DM_FSYS_GET_EVENTLIST = 12,
DM_FSYS_GET_FILEATTR = 13,
DM_FSYS_GET_REGION = 14,
DM_FSYS_GETALL_DMATTR = 15,
DM_FSYS_GETALL_INHERIT = 16,
DM_FSYS_INIT_ATTRLOC = 17,
DM_FSYS_MKDIR_BY_HANDLE = 18,
DM_FSYS_PROBE_HOLE = 19,
DM_FSYS_PUNCH_HOLE = 20,
DM_FSYS_READ_INVIS_RVP = 21,
DM_FSYS_RELEASE_RIGHT = 22,
DM_FSYS_REMOVE_DMATTR = 23,
DM_FSYS_REQUEST_RIGHT = 24,
DM_FSYS_SET_DMATTR = 25,
DM_FSYS_SET_EVENTLIST = 26,
DM_FSYS_SET_FILEATTR = 27,
DM_FSYS_SET_INHERIT = 28,
DM_FSYS_SET_REGION = 29,
DM_FSYS_SYMLINK_BY_HANDLE = 30,
DM_FSYS_SYNC_BY_HANDLE = 31,
DM_FSYS_UPGRADE_RIGHT = 32,
DM_FSYS_WRITE_INVIS_RVP = 33,
DM_FSYS_MAX = 34
} dm_fsys_switch_t;
#define DM_FSYS_OBJ 0x1 /* object refers to a fsys handle */
/*
* Prototypes for filesystem-specific functions.
*/
typedef int (*dm_fsys_clear_inherit_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_attrname_t *attrnamep);
typedef int (*dm_fsys_create_by_handle_t)(
bhv_desc_t *bdp,
dm_right_t right,
void *hanp,
size_t hlen,
char *cname);
typedef int (*dm_fsys_downgrade_right_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int type); /* DM_FSYS_OBJ or zero */
typedef int (*dm_fsys_get_allocinfo_rvp_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_off_t *offp,
u_int nelem,
dm_extent_t *extentp,
u_int *nelemp,
int *rvalp);
typedef int (*dm_fsys_get_bulkall_rvp_t)(
bhv_desc_t *bdp, /* root vnode */
dm_right_t right,
u_int mask,
dm_attrname_t *attrnamep,
dm_attrloc_t *locp,
size_t buflen,
void *bufp,
size_t *rlenp,
int *rvalp);
typedef int (*dm_fsys_get_bulkattr_rvp_t)(
bhv_desc_t *bdp, /* root vnode */
dm_right_t right,
u_int mask,
dm_attrloc_t *locp,
size_t buflen,
void *bufp,
size_t *rlenp,
int *rvalp);
typedef int (*dm_fsys_get_config_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_config_t flagname,
dm_size_t *retvalp);
typedef int (*dm_fsys_get_config_events_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int nelem,
dm_eventset_t *eventsetp,
u_int *nelemp);
typedef int (*dm_fsys_get_destroy_dmattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_attrname_t *attrnamep,
char **valuepp,
int *vlenp);
typedef int (*dm_fsys_get_dioinfo_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_dioinfo_t *diop);
typedef int (*dm_fsys_get_dirattrs_rvp_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int mask,
dm_attrloc_t *locp,
size_t buflen,
void *bufp,
size_t *rlenp,
int *rvalp);
typedef int (*dm_fsys_get_dmattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_attrname_t *attrnamep,
size_t buflen,
void *bufp,
size_t *rlenp);
typedef int (*dm_fsys_get_eventlist_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int type,
u_int nelem,
dm_eventset_t *eventsetp, /* in kernel space! */
u_int *nelemp); /* in kernel space! */
typedef int (*dm_fsys_get_fileattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int mask,
dm_stat_t *statp);
typedef int (*dm_fsys_get_region_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int nelem,
dm_region_t *regbufp,
u_int *nelemp);
typedef int (*dm_fsys_getall_dmattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
size_t buflen,
void *bufp,
size_t *rlenp);
typedef int (*dm_fsys_getall_inherit_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int nelem,
dm_inherit_t *inheritbufp,
u_int *nelemp);
typedef int (*dm_fsys_init_attrloc_t)(
bhv_desc_t *bdp, /* sometimes root vnode */
dm_right_t right,
dm_attrloc_t *locp);
typedef int (*dm_fsys_mkdir_by_handle_t)(
bhv_desc_t *bdp,
dm_right_t right,
void *hanp,
size_t hlen,
char *cname);
typedef int (*dm_fsys_probe_hole_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_off_t off,
dm_size_t len,
dm_off_t *roffp,
dm_size_t *rlenp);
typedef int (*dm_fsys_punch_hole_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_off_t off,
dm_size_t len);
typedef int (*dm_fsys_read_invis_rvp_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_off_t off,
dm_size_t len,
void *bufp,
int *rvp);
typedef int (*dm_fsys_release_right_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int type);
typedef int (*dm_fsys_remove_dmattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
int setdtime,
dm_attrname_t *attrnamep);
typedef int (*dm_fsys_request_right_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int type, /* DM_FSYS_OBJ or zero */
u_int flags,
dm_right_t newright);
typedef int (*dm_fsys_set_dmattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_attrname_t *attrnamep,
int setdtime,
size_t buflen,
void *bufp);
typedef int (*dm_fsys_set_eventlist_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int type,
dm_eventset_t *eventsetp, /* in kernel space! */
u_int maxevent);
typedef int (*dm_fsys_set_fileattr_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int mask,
dm_fileattr_t *attrp);
typedef int (*dm_fsys_set_inherit_t)(
bhv_desc_t *bdp,
dm_right_t right,
dm_attrname_t *attrnamep,
mode_t mode);
typedef int (*dm_fsys_set_region_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int nelem,
dm_region_t *regbufp,
dm_boolean_t *exactflagp);
typedef int (*dm_fsys_symlink_by_handle_t)(
bhv_desc_t *bdp,
dm_right_t right,
void *hanp,
size_t hlen,
char *cname,
char *path);
typedef int (*dm_fsys_sync_by_handle_t)(
bhv_desc_t *bdp,
dm_right_t right);
typedef int (*dm_fsys_upgrade_right_t)(
bhv_desc_t *bdp,
dm_right_t right,
u_int type); /* DM_FSYS_OBJ or zero */
typedef int (*dm_fsys_write_invis_rvp_t)(
bhv_desc_t *bdp,
dm_right_t right,
int flags,
dm_off_t off,
dm_size_t len,
void *bufp,
int *rvp);
/* Structure definitions used by the VFS_DMAPI_FSYS_VECTOR call. */
typedef struct {
dm_fsys_switch_t func_no; /* function number */
union {
dm_fsys_clear_inherit_t clear_inherit;
dm_fsys_create_by_handle_t create_by_handle;
dm_fsys_downgrade_right_t downgrade_right;
dm_fsys_get_allocinfo_rvp_t get_allocinfo_rvp;
dm_fsys_get_bulkall_rvp_t get_bulkall_rvp;
dm_fsys_get_bulkattr_rvp_t get_bulkattr_rvp;
dm_fsys_get_config_t get_config;
dm_fsys_get_config_events_t get_config_events;
dm_fsys_get_destroy_dmattr_t get_destroy_dmattr;
dm_fsys_get_dioinfo_t get_dioinfo;
dm_fsys_get_dirattrs_rvp_t get_dirattrs_rvp;
dm_fsys_get_dmattr_t get_dmattr;
dm_fsys_get_eventlist_t get_eventlist;
dm_fsys_get_fileattr_t get_fileattr;
dm_fsys_get_region_t get_region;
dm_fsys_getall_dmattr_t getall_dmattr;
dm_fsys_getall_inherit_t getall_inherit;
dm_fsys_init_attrloc_t init_attrloc;
dm_fsys_mkdir_by_handle_t mkdir_by_handle;
dm_fsys_probe_hole_t probe_hole;
dm_fsys_punch_hole_t punch_hole;
dm_fsys_read_invis_rvp_t read_invis_rvp;
dm_fsys_release_right_t release_right;
dm_fsys_remove_dmattr_t remove_dmattr;
dm_fsys_request_right_t request_right;
dm_fsys_set_dmattr_t set_dmattr;
dm_fsys_set_eventlist_t set_eventlist;
dm_fsys_set_fileattr_t set_fileattr;
dm_fsys_set_inherit_t set_inherit;
dm_fsys_set_region_t set_region;
dm_fsys_symlink_by_handle_t symlink_by_handle;
dm_fsys_sync_by_handle_t sync_by_handle;
dm_fsys_upgrade_right_t upgrade_right;
dm_fsys_write_invis_rvp_t write_invis_rvp;
} u_fc;
} fsys_function_vector_t;
struct dm_fcntl_vector {
int code_level;
int count; /* Number of functions in the vector */
fsys_function_vector_t *vecp;
};
typedef struct dm_fcntl_vector dm_fcntl_vector_t;
struct dm_fcntl_mapevent {
size_t length; /* length of transfer */
dm_eventtype_t max_event; /* Maximum (WRITE or READ) event */
int error; /* returned error code */
};
typedef struct dm_fcntl_mapevent dm_fcntl_mapevent_t;
#endif /* __KERNEL__ */
/* The following definitions are needed both by the kernel and by the
library routines.
*/
#define DM_MAX_HANDLE_SIZE 56 /* maximum size for a file handle */
/*
* Opcodes for dmapi ioctl.
*/
#define DM_CLEAR_INHERIT 1
#define DM_CREATE_BY_HANDLE 2
#define DM_CREATE_SESSION 3
#define DM_CREATE_USEREVENT 4
#define DM_DESTROY_SESSION 5
#define DM_DOWNGRADE_RIGHT 6
#define DM_FD_TO_HANDLE 7
#define DM_FIND_EVENTMSG 8
#define DM_GET_ALLOCINFO 9
#define DM_GET_BULKALL 10
#define DM_GET_BULKATTR 11
#define DM_GET_CONFIG 12
#define DM_GET_CONFIG_EVENTS 13
#define DM_GET_DIOINFO 14
#define DM_GET_DIRATTRS 15
#define DM_GET_DMATTR 16
#define DM_GET_EVENTLIST 17
#define DM_GET_EVENTS 18
#define DM_GET_FILEATTR 19
#define DM_GET_MOUNTINFO 20
#define DM_GET_REGION 21
#define DM_GETALL_DISP 22
#define DM_GETALL_DMATTR 23
#define DM_GETALL_INHERIT 24
#define DM_GETALL_SESSIONS 25
#define DM_GETALL_TOKENS 26
#define DM_INIT_ATTRLOC 27
#define DM_MKDIR_BY_HANDLE 28
#define DM_MOVE_EVENT 29
#define DM_OBJ_REF_HOLD 30
#define DM_OBJ_REF_QUERY 31
#define DM_OBJ_REF_RELE 32
#define DM_PATH_TO_FSHANDLE 33
#define DM_PATH_TO_HANDLE 34
#define DM_PENDING 35
#define DM_PROBE_HOLE 36
#define DM_PUNCH_HOLE 37
#define DM_QUERY_RIGHT 38
#define DM_QUERY_SESSION 39
#define DM_READ_INVIS 40
#define DM_RELEASE_RIGHT 41
#define DM_REMOVE_DMATTR 42
#define DM_REQUEST_RIGHT 43
#define DM_RESPOND_EVENT 44
#define DM_SEND_MSG 45
#define DM_SET_DISP 46
#define DM_SET_DMATTR 47
#define DM_SET_EVENTLIST 48
#define DM_SET_FILEATTR 49
#define DM_SET_INHERIT 50
#define DM_SET_REGION 51
#define DM_SET_RETURN_ON_DESTROY 52
#define DM_SYMLINK_BY_HANDLE 53
#define DM_SYNC_BY_HANDLE 54
#define DM_UPGRADE_RIGHT 55
#define DM_WRITE_INVIS 56
#define DM_OPEN_BY_HANDLE 57
#endif /* __DMAPI_KERN_H__ */