* $Id: isofs_vnops.c,v 1.5 1993/07/19 13:40:10 cgd Exp $
isofs_open(vp
, mode
, cred
, p
)
* Update the times on the inode on writeable file systems.
isofs_close(vp
, fflag
, cred
, p
)
* Check mode permission on inode pointer. Mode is READ, WRITE or EXEC.
* The mode is shifted to select the owner/group/other fields. The
* super user is granted all permissions.
isofs_access(vp
, mode
, cred
, p
)
isofs_getattr(vp
, vap
, cred
, p
)
register struct vattr
*vap
;
register struct iso_node
*ip
= VTOI(vp
);
vap
->va_fsid
= ip
->i_dev
;
vap
->va_fileid
= ip
->i_number
;
vap
->va_mode
= ip
->inode
.iso_mode
;
vap
->va_uid
= ip
->inode
.iso_uid
;
vap
->va_gid
= ip
->inode
.iso_gid
;
vap
->va_atime
= ip
->inode
.iso_atime
;
vap
->va_mtime
= ip
->inode
.iso_mtime
;
vap
->va_ctime
= ip
->inode
.iso_ctime
;
vap
->va_size
= ip
->i_size
;
vap
->va_blocksize
= ip
->i_mnt
->logical_block_size
;
vap
->va_bytes
= ip
->i_size
;
vap
->va_type
= vp
->v_type
;
isofs_read(vp
, uio
, ioflag
, cred
)
register struct uio
*uio
;
register struct iso_node
*ip
= VTOI(vp
);
register struct iso_mnt
*imp
;
daddr_t lbn
, bn
, rablock
;
int size
, diff
, error
= 0;
if (uio
->uio_rw
!= UIO_READ
)
panic("isofs_read mode");
type
= ip
->i_mode
& IFMT
;
if (type
!= IFDIR
&& type
!= IFREG
&& type
!= IFLNK
)
panic("isofs_read type");
lbn
= iso_lblkno(imp
, uio
->uio_offset
);
on
= iso_blkoff(imp
, uio
->uio_offset
);
n
= MIN((unsigned)(imp
->im_bsize
- on
), uio
->uio_resid
);
diff
= ip
->i_size
- uio
->uio_offset
;
size
= iso_blksize(imp
, ip
, lbn
);
if (vp
->v_lastr
+ 1 == lbn
&&
iso_lblktosize(imp
, rablock
) < ip
->i_size
)
error
= breada(ITOV(ip
), lbn
, size
, rablock
,
iso_blksize(imp
, ip
, rablock
), NOCRED
, &bp
);
error
= bread(ITOV(ip
), lbn
, size
, NOCRED
, &bp
);
n
= MIN(n
, size
- bp
->b_resid
);
error
= uiomove(bp
->b_un
.b_addr
+ on
, (int)n
, uio
);
if (n
+ on
== imp
->im_bsize
|| uio
->uio_offset
== ip
->i_size
)
} while (error
== 0 && uio
->uio_resid
> 0 && n
!= 0);
isofs_ioctl(vp
, com
, data
, fflag
, cred
, p
)
isofs_select(vp
, which
, fflags
, cred
, p
)
* We should really check to see if I/O is possible.
* NB Currently unsupported.
isofs_mmap(vp
, fflags
, cred
, p
)
* Nothing to do, so just return.
isofs_seek(vp
, oldoff
, newoff
, cred
)
isofs_readdir(vp
, uio
, cred
, eofflagp
)
register struct uio
*uio
;
struct iso_directory_record
*ep
;
iso_offset
= uio
->uio_offset
;
entryoffsetinblock
= iso_blkoff(imp
, iso_offset
);
if (entryoffsetinblock
!= 0) {
if (error
= iso_blkatoff(ip
, iso_offset
, (char **)0, &bp
))
while (iso_offset
< endsearch
&& uio
->uio_resid
> 0) {
* If offset is on a block boundary,
* read the next directory block.
* Release previous if it exists.
if (iso_blkoff(imp
, iso_offset
) == 0) {
if (error
= iso_blkatoff(ip
, iso_offset
,
* Get pointer to next entry.
ep
= (struct iso_directory_record
*)
(bp
->b_un
.b_addr
+ entryoffsetinblock
);
reclen
= isonum_711 (ep
->length
);
/* skip to next block, if any */
iso_offset
= roundup (iso_offset
,
imp
->logical_block_size
);
if (reclen
< sizeof (struct iso_directory_record
))
/* illegal entry, stop */
/* 10 Aug 92*/ if (entryoffsetinblock
+ reclen
-1 >= imp
->logical_block_size
)
/* illegal directory, so stop looking */
dirent
.d_fileno
= isonum_733 (ep
->extent
);
dirent
.d_namlen
= isonum_711 (ep
->name_len
);
if (reclen
< sizeof (struct iso_directory_record
)
/* illegal entry, stop */
switch ( imp
->iso_ftype
) {
isofs_rrip_getname( ep
, dirent
.d_name
, &dirent
.d_namlen
);
isofntrans(ep
->name
, dirent
.d_namlen
, dirent
.d_name
, &dirent
.d_namlen
);
dirent
.d_name
[dirent
.d_namlen
] = 0;
dirent
.d_reclen
= DIRSIZ (&dirent
);
if (uio
->uio_resid
< dirent
.d_reclen
)
if (error
= uiomove (&dirent
, dirent
.d_reclen
, uio
))
entryoffsetinblock
+= reclen
;
if (end_flag
|| (VTOI(vp
)->i_size
- iso_offset
) <= 0)
uio
->uio_offset
= iso_offset
;
* Return target name of a symbolic link
typedef struct iso_directory_record ISODIR
;
typedef struct iso_node ISONODE
;
typedef struct iso_mnt ISOMNT
;
int isofs_readlink(vp
, uio
, cred
)
* Get parents directory record block that this inode included.
error
= bread( imp
->im_devvp
,
(daddr_t
)(( ip
->iso_parent_ext
+ (ip
->iso_parent
>> 11 ) )
* imp
->im_bsize
/ DEV_BSIZE
),
* Setup the directory pointer for this inode
dirp
= (ISODIR
*)(bp
->b_un
.b_addr
+ ( ip
->iso_parent
& 0x7ff ) );
printf("lbn=%d[base=%d,off=%d,bsize=%d,DEV_BSIZE=%d], dirp= %08x, b_addr=%08x, offset=%08x(%08x)\n",
(daddr_t
)(( ip
->iso_parent_ext
+ (ip
->iso_parent
>> 12 ) ) * imp
->im_bsize
/ DEV_BSIZE
),
ip
->iso_parent
& 0x7ff );
* Just make sure, we have a right one....
* 1: Check not cross boundary on block
* 2: Check number of inode
if ( (ip
->iso_parent
& 0x7ff) + isonum_711( dirp
->length
) >=
if ( isonum_733(dirp
->extent
) != ip
->i_number
) {
* Ok, we just gathering a Symbolick name in SL record.
if ( isofs_rrip_getsymname( vp
, dirp
, symname
, &symlen
) == 0 ) {
* Don't forget before you leave from home ;-)
* return with the Symbolick name to caller's.
return ( uiomove( symname
, symlen
, uio
) );
* Ufs abort op, called after namei() when a CREATE/DELETE isn't actually
* done. If a buffer has been saved in anticipation of a CREATE, delete it.
if ((ndp
->ni_nameiop
& (HASBUF
| SAVESTART
)) == HASBUF
)
FREE(ndp
->ni_pnbuf
, M_NAMEI
);
register struct iso_node
*ip
= VTOI(vp
);
register struct iso_node
*ip
= VTOI(vp
);
if (!(ip
->i_flag
& ILOCKED
))
panic("isofs_unlock NOT LOCKED");
* Check for a locked inode.
if (VTOI(vp
)->i_flag
& ILOCKED
)
* Calculate the logical to physical mapping if not done already,
* then call the device strategy routine.
register struct iso_node
*ip
= VTOI(bp
->b_vp
);
if (bp
->b_vp
->v_type
== VBLK
|| bp
->b_vp
->v_type
== VCHR
)
panic("isofs_strategy: spec");
if (bp
->b_blkno
== bp
->b_lblkno
) {
if (error
= iso_bmap(ip
, bp
->b_lblkno
, &bp
->b_blkno
))
if ((long)bp
->b_blkno
== -1)
if ((long)bp
->b_blkno
== -1) {
(*(vp
->v_op
->vop_strategy
))(bp
);
* Print out the contents of an inode.
printf ("tag VT_ISOFS, isofs vnode\n");
* Global vfs data structures for isofs
struct vnodeops isofs_vnodeops
= {
isofs_lookup
, /* lookup */
(void *)enodev
, /* create */
(void *)enodev
, /* mknod */
isofs_access
, /* access */
isofs_getattr
, /* getattr */
(void *)enodev
, /* setattr */
(void *)enodev
, /* write */
isofs_select
, /* select */
(void *)nullop
, /* fsync */
(void *)enodev
, /* remove */
(void *)enodev
, /* link */
(void *)enodev
, /* rename */
(void *)enodev
, /* mkdir */
(void *)enodev
, /* rmdir */
(void *)enodev
, /* symlink */
isofs_readdir
, /* readdir */
isofs_readlink
, /* readlink */
isofs_abortop
, /* abortop */
isofs_inactive
, /* inactive */
isofs_reclaim
, /* reclaim */
isofs_unlock
, /* unlock */
(void *)enodev
, /* bmap */
isofs_strategy
, /* strategy */
isofs_islocked
, /* islocked */
(void *)enodev
, /* advlock */