#ifndef _SYS_FS_UDF_INODE_H
#define _SYS_FS_UDF_INODE_H
#include <sys/note.h>
#ifdef __cplusplus
extern "C" {
#endif
#define SUN_IMPL_ID "*SUN SOLARIS UDF"
#define SUN_IMPL_ID_LEN 16
#define SUN_OS_CLASS 4
#define SUN_OS_ID 2
#define CLSTR_SIZE 8
#define CLSTR_MASK 7
enum de_op { DE_CREATE, DE_MKDIR, DE_LINK, DE_RENAME };
enum dr_op { DR_REMOVE, DR_RMDIR, DR_RENAME };
#define blkoff(udfvfsp, loc) \
((loc) & (udfvfsp)->udf_lbmask)
#define lblkno(udf_vfsp, loc) \
((int32_t)((loc) / (udf_vfsp)->udf_lbsize))
#define fsbtodb(udf, blk) \
((blk) << udf->udf_l2d_shift)
struct udf_fid {
uint16_t udfid_len;
uint16_t udfid_prn;
uint32_t udfid_icb_lbn;
uint32_t udfid_uinq_lo;
};
#define MAXNAMLEN 255
struct ud_part {
uint16_t udp_flags;
uint16_t udp_number;
uint32_t udp_seqno;
uint32_t udp_access;
uint32_t udp_start;
uint32_t udp_length;
uint32_t udp_unall_loc;
uint32_t udp_unall_len;
uint32_t udp_freed_loc;
uint32_t udp_freed_len;
uint32_t udp_nfree;
uint32_t udp_nblocks;
uint32_t udp_last_alloc;
int32_t udp_cache_count;
daddr_t udp_cache[CLSTR_SIZE];
};
#define UDP_BITMAPS 0x00
#define UDP_SPACETBLS 0x01
#define UDP_MT_RO 0x0001
#define UDP_MT_WO 0x0002
#define UDP_MT_RW 0x0003
#define UDP_MT_OW 0x0004
#define MAX_SPM 4
struct ud_map {
uint32_t udm_flags;
uint16_t udm_vsn;
uint16_t udm_pn;
uint32_t udm_vat_icb;
uint32_t udm_nent;
uint32_t *udm_count;
struct buf **udm_bp;
uint32_t **udm_addr;
int32_t udm_plen;
int32_t udm_nspm;
uint32_t udm_spsz;
uint32_t udm_loc[MAX_SPM];
struct buf *udm_sbp[MAX_SPM];
caddr_t udm_spaddr[MAX_SPM];
};
#define UDM_MAP_NORM 0x00
#define UDM_MAP_VPM 0x01
#define UDM_MAP_SPM 0x02
struct udf_vfs {
struct vfs *udf_vfs;
struct udf_vfs *udf_next;
struct udf_vfs *udf_wnext;
struct buf *udf_vds;
struct buf *udf_iseq;
struct vnode *udf_root;
struct vnode *udf_devvp;
char *udf_fsmnt;
uint32_t udf_flags;
uint32_t udf_mtype;
int32_t udf_rdclustsz;
int32_t udf_wrclustsz;
uint64_t udf_maxfsize;
int32_t udf_maxfbits;
char udf_volid[32];
uint16_t udf_tsno;
int32_t udf_lbsize;
int32_t udf_lbmask;
int32_t udf_l2b_shift;
int32_t udf_l2d_shift;
int32_t udf_npart;
struct ud_part *udf_parts;
int32_t udf_nmaps;
struct ud_map *udf_maps;
int32_t udf_fragmented;
int32_t udf_mark_bad;
uint32_t udf_freeblks;
uint32_t udf_totalblks;
uint64_t udf_maxuniq;
uint32_t udf_nfiles;
uint32_t udf_ndirs;
uint32_t udf_miread;
uint32_t udf_miwrite;
uint32_t udf_mawrite;
time_t udf_time;
uint32_t udf_mod;
uint32_t udf_clean;
kmutex_t udf_lock;
kmutex_t udf_rename_lck;
struct pri_vol_desc *udf_pvd;
struct log_vol_desc *udf_lvd;
struct log_vol_int_desc *udf_lvid;
uint32_t udf_mvds_loc;
uint32_t udf_mvds_len;
uint32_t udf_rvds_loc;
uint32_t udf_rvds_len;
uint32_t udf_iseq_loc;
uint32_t udf_iseq_len;
uint16_t udf_fsd_prn;
uint32_t udf_fsd_loc;
uint32_t udf_fsd_len;
uint16_t udf_ricb_prn;
uint32_t udf_ricb_loc;
uint32_t udf_ricb_len;
daddr_t udf_root_blkno;
};
#ifndef __lint
_NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
udf_vfs::udf_fragmented))
_NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
udf_vfs::udf_freeblks udf_vfs::udf_totalblks))
_NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
udf_vfs::udf_maxuniq udf_vfs::udf_nfiles
udf_vfs::udf_ndirs))
_NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
udf_vfs::udf_time
udf_vfs::udf_mod udf_vfs::udf_clean))
_NOTE(READ_ONLY_DATA(udf_vfs::udf_nmaps udf_vfs::udf_maps))
_NOTE(READ_ONLY_DATA(udf_vfs::udf_mtype
udf_vfs::udf_rdclustsz
udf_vfs::udf_wrclustsz
udf_vfs::udf_maxfsize
udf_vfs::udf_maxfbits
udf_vfs::udf_lbsize
udf_vfs::udf_l2b_shift
udf_vfs::udf_lbmask
udf_vfs::udf_l2d_shift))
_NOTE(READ_ONLY_DATA(udf_vfs::udf_pvd
udf_vfs::udf_lvd
udf_vfs::udf_lvid))
_NOTE(READ_ONLY_DATA(udf_vfs::udf_mvds_loc
udf_vfs::udf_mvds_len
udf_vfs::udf_iseq_loc
udf_vfs::udf_iseq_len
udf_vfs::udf_fsd_prn
udf_vfs::udf_fsd_loc
udf_vfs::udf_fsd_len
udf_vfs::udf_ricb_prn
udf_vfs::udf_ricb_loc
udf_vfs::udf_ricb_len
udf_vfs::udf_root_blkno))
_NOTE(READ_ONLY_DATA(ud_part::udp_flags
ud_part::udp_number
ud_part::udp_seqno
ud_part::udp_access
ud_part::udp_start
ud_part::udp_length
ud_part::udp_unall_loc
ud_part::udp_unall_len
ud_part::udp_freed_loc
ud_part::udp_freed_len
ud_part::udp_nblocks))
_NOTE(MUTEX_PROTECTS_DATA(udf_vfs::udf_lock,
ud_part::udp_nfree
ud_part::udp_last_alloc
ud_part::udp_cache_count
ud_part::udp_cache))
#endif
#define UDF_MT_RO UDP_MT_RO
#define UDF_MT_WO UDP_MT_OW
#define UDF_MT_RW UDP_MT_RW
#define UDF_MT_OW UDP_MT_OW
#define UDF_FL_RDONLY 0x0001
#define UDF_FL_RW 0x0002
#define UDF_DIRTY 0x00
#define UDF_CLEAN 0x01
#define RD_CLUSTSZ(ip) ((ip)->i_udf->udf_rdclustsz)
#define WR_CLUSTSZ(ip) ((ip)->i_udf->udf_wrclustsz)
#ifdef UNDEF
#define blkroundup(fs, size) \
(((size) + (fs)->udf_lbsize - 1) & (offset_t)(fs)->udf_lbmask)
#endif
#define blkroundup(fs, size) \
(((size) + (fs)->udf_lbmask) & (offset_t)(~(fs)->udf_lbmask))
#define blksize(fs) (fs->udf_lbsize)
#define VTOI(VP) ((struct ud_inode *)(VP)->v_data)
#define ITOV(IP) ((IP)->i_vnode)
#define i_vfs i_vnode->v_vfsp
struct icb_ext {
uint16_t ib_flags;
uint16_t ib_prn;
uint32_t ib_block;
uint64_t ib_offset;
int32_t ib_count;
uint32_t ib_marker1;
uint32_t ib_marker2;
};
#define IB_UN_REC 0x1
#define IB_UN_RE_AL 0x2
#define IB_CON 0x3
#define IB_MASK 0x3
#define IB_ALLOCATED(flags) \
(((flags) & IB_MASK) != IB_UN_RE_AL)
#define EXT_PER_MALLOC 8
struct ud_inode {
struct ud_inode *i_forw;
struct ud_inode *i_back;
struct ud_inode *i_freef;
struct ud_inode *i_freeb;
struct vnode *i_vnode;
struct vnode *i_devvp;
struct udf_vfs *i_udf;
krwlock_t i_rwlock;
krwlock_t i_contents;
dev_t i_dev;
u_offset_t i_diroff;
daddr_t i_icb_lbano;
uint16_t i_icb_prn;
kcondvar_t i_wrcv;
uint32_t i_flag;
uint32_t i_icb_block;
int16_t i_astrat;
int16_t i_desc_type;
int32_t i_ext_count;
int32_t i_ext_used;
struct icb_ext *i_ext;
kmutex_t i_con_lock;
struct icb_ext *i_con;
int32_t i_con_count;
int32_t i_con_used;
int32_t i_con_read;
uint32_t i_cur_max_ext;
vtype_t i_type;
uint16_t i_char;
uint16_t i_perm;
uid_t i_uid;
gid_t i_gid;
uint32_t i_nlink;
uint32_t i_maxent;
u_offset_t i_size;
uint64_t i_lbr;
uint64_t i_uniqid;
timespec32_t i_atime;
timespec32_t i_mtime;
timespec32_t i_ctime;
size_t i_delaylen;
offset_t i_delayoff;
offset_t i_nextrio;
uint64_t i_writes;
kmutex_t i_tlock;
major_t i_major;
minor_t i_minor;
uint32_t i_marker1;
uint32_t i_seq;
offset_t i_nextr;
long i_mapcnt;
int *i_map;
dev_t i_rdev;
uint32_t i_marker2;
uint32_t i_data_off;
uint32_t i_max_emb;
uint32_t i_marker3;
};
#ifndef __lint
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_astrat))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_desc_type))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_ext_count))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_ext_used))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_ext))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_type))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_char))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_perm))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_uid))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_gid))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_nlink))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_size))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_lbr))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_uniqid))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_major))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents, ud_inode::i_minor))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_atime))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_mtime))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_ctime))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_delayoff))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_delaylen))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_nextrio))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_writes))
_NOTE(MUTEX_PROTECTS_DATA(ud_inode::i_tlock, ud_inode::i_flag))
_NOTE(RWLOCK_PROTECTS_DATA(ud_inode::i_contents,
icb_ext::ib_flags icb_ext::ib_prn
icb_ext::ib_block
icb_ext::ib_count icb_ext::ib_offset))
#endif
#define IUPD 0x0001
#define IACC 0x0002
#define IMOD 0x0004
#define ICHG 0x0008
#define INOACC 0x0010
#define IMODTIME 0x0020
#define IREF 0x0040
#define ISYNC 0x0080
#define IMODACC 0x0200
#define IATTCHG 0x0400
#define IBDWRITE 0x0800
#define ISUID VSUID
#define ISGID VSGID
#define ISVTX VSVTX
#define IEXEC 0x0400
#define IWRITE 0x0800
#define IREAD 0x1000
#define IATTR 0x2000
#define IDELE 0x4000
#define UP_MASK 0x1CE7
#define VA2UD_PERM(perm) \
(((perm) & 0x7) | (((perm) & 0x38) << 2) | (((perm) & 0x1C0) << 4))
#define UD2VA_PERM(perm) \
(((perm) & 0x7) | (((perm) & 0xE0) >> 2) | (((perm) & 0x1C00) >> 4))
#define UD_DPERM2UPERM(dperm) ((((dperm) >> 4) & 0x1C0) | \
(((dperm) >> 2) & 0x38) | \
((dperm) & 0x7))
#define UD_UPERM2DPERM(uperm) ((((uperm) & 0x1C0) << 4) | \
(((uperm) & 0x38) << 2) | \
((uperm) & 0x7))
#define I_SYNC 1
#define I_DSYNC 2
#define I_ASYNC 0
#define UD_HASH_SZ 512
#if ((UD_HASH_SZ & (UD_HASH_SZ - 1)) == 0)
#define UD_INOHASH(dev, bno) (hash2ints((int)dev, (int)bno) & UD_HASH_SZ - 1)
#else
#define UD_INOHASH(dev, bno) (hash2ints((int)dev, (int)bno) % UD_HASH_SZ)
#endif
union ihead {
union ihead *ih_head[2];
struct ud_inode *ih_chain[2];
};
#define IMARK(ip) ud_imark(ip)
#define ITIMES_NOLOCK(ip) ud_itimes_nolock(ip)
#define ITIMES(ip) { \
mutex_enter(&(ip)->i_tlock); \
ITIMES_NOLOCK(ip); \
mutex_exit(&(ip)->i_tlock); \
}
#define ESAME (-1)
#define UDF_HOLE (daddr32_t)-1
extern int32_t ud_trace;
#define ud_printf(xyz) \
if (ud_trace) { \
cmn_err(CE_NOTE, xyz); \
}
#ifndef __lint
_NOTE(SCHEME_PROTECTS_DATA("Unshared data",
buf
dirent64
fid
flock64
statvfs64
timespec32
udf_fid
uio
vattr
vfs
vnode))
_NOTE(SCHEME_PROTECTS_DATA("Unshared data",
file_entry
file_id
icb_tag
indirect_entry
log_vol_int_desc
long_ad
lvid_iu
regid
short_ad
tag
tstamp))
_NOTE(LOCK_ORDER(ud_inode::i_rwlock
ud_inode::i_contents
ud_inode::i_tlock))
#endif
void ud_update_superblock(struct vfs *);
int32_t ud_rdwri(enum uio_rw, int32_t, struct ud_inode *, caddr_t,
int32_t, offset_t, enum uio_seg, int32_t *,
struct cred *cr);
int32_t ud_putapage(struct vnode *, page_t *, u_offset_t *,
size_t *, int32_t, struct cred *);
int32_t ud_iget(struct vfs *, uint16_t, uint32_t, struct ud_inode **,
struct buf *, struct cred *);
void ud_iinactive(struct ud_inode *, struct cred *);
void ud_iupdat(struct ud_inode *, int32_t);
int32_t ud_itrunc(struct ud_inode *, u_offset_t, int32_t, struct cred *);
int32_t ud_iaccess(struct ud_inode *, int32_t, struct cred *, int dolock);
int32_t ud_iflush(struct vfs *);
void ud_imark(struct ud_inode *);
void ud_itimes_nolock(struct ud_inode *);
void ud_delcache(struct ud_inode *);
void ud_idrop(struct ud_inode *);
void ud_init_inodes(void);
int32_t ud_alloc_space(struct vfs *, uint16_t, uint32_t,
uint32_t, uint32_t *, uint32_t *, int32_t, int32_t);
void ud_free_space(struct vfs *, uint16_t, uint32_t, uint32_t);
int32_t ud_ialloc(struct ud_inode *, struct ud_inode **,
struct vattr *, struct cred *);
void ud_ifree(struct ud_inode *, vtype_t);
int32_t ud_freesp(struct vnode *, struct flock64 *, int32_t,
struct cred *);
int32_t ud_alloc_from_cache(struct udf_vfs *, struct ud_part *,
uint32_t *);
int32_t ud_release_cache(struct udf_vfs *);
void ud_vfs_add(struct udf_vfs *);
void ud_vfs_remove(struct udf_vfs *);
daddr_t ud_xlate_to_daddr(struct udf_vfs *, uint16_t,
uint32_t, int32_t, uint32_t *);
int32_t ud_ip_off2bno(struct ud_inode *, uint32_t, uint32_t *);
void ud_dtime2utime(struct timespec32 *, struct tstamp const *);
void ud_utime2dtime(struct timespec32 const *, struct tstamp *);
int32_t ud_syncip(struct ud_inode *, int32_t, int32_t);
void ud_update(int32_t);
int32_t ud_fbwrite(struct fbuf *, struct ud_inode *);
void ud_sbwrite(struct udf_vfs *);
int32_t ud_sync_indir(struct ud_inode *);
void ud_update_regid(struct regid *);
int32_t ud_read_icb_till_off(struct ud_inode *, u_offset_t);
void ud_make_tag(struct udf_vfs *, struct tag *,
uint16_t, uint32_t, uint16_t);
int32_t ud_make_dev_spec_ear(struct dev_spec_ear *, major_t, minor_t);
int32_t ud_make_ftimes_ear(struct ftimes_ear *,
int32_t, struct timespec32 *);
int32_t ud_get_next_fid(struct ud_inode *, struct fbuf **, uint32_t,
struct file_id **, uint8_t **, uint8_t *);
int32_t ud_verify_tag_and_desc(struct tag *, uint16_t, uint32_t,
int32_t, int32_t);
uint16_t ud_crc(uint8_t *, int32_t);
int32_t ud_compressunicode(int32_t, int32_t, uint16_t *, uint8_t *);
uint32_t ud_check_te_unrec(struct udf_vfs *, caddr_t, uint32_t);
int32_t ud_compress(int32_t, int32_t *, uint8_t *, uint8_t *);
int32_t ud_uncompress(int32_t, int32_t *, uint8_t *, uint8_t *);
struct buf *ud_bread(dev_t, daddr_t, long);
int ud_sticky_remove_access(struct ud_inode *, struct ud_inode *,
struct cred *);
int32_t ud_dirlook(struct ud_inode *,
char *, struct ud_inode **, struct cred *, int32_t);
int32_t ud_direnter(struct ud_inode *, char *, enum de_op,
struct ud_inode *, struct ud_inode *, struct vattr *,
struct ud_inode **, struct cred *, caller_context_t *);
int32_t ud_dirremove(struct ud_inode *,
char *, struct ud_inode *, struct vnode *,
enum dr_op, struct cred *, caller_context_t *);
int32_t ud_bmap_has_holes(struct ud_inode *);
int32_t ud_bmap_write(struct ud_inode *, u_offset_t,
int, int32_t, struct cred *);
int32_t ud_bmap_read(struct ud_inode *, u_offset_t,
daddr_t *, int32_t *);
void ud_insert_new_ext(struct ud_inode *,
int32_t, struct icb_ext *);
int32_t ud_alloc_and_make_ext(struct ud_inode *, int32_t);
int32_t ud_create_new_icb(struct ud_inode *);
void ud_append_new_ext(struct ud_inode *, uint16_t,
u_offset_t, uint32_t, uint16_t, uint32_t);
#ifdef __cplusplus
}
#endif
#endif