Print this page
PSARC 2008/290 lofi mount
6384817 Need persistent lofi based mounts and direct mount(1m) support for lofi
*** 17,31 ****
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
! * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
! #pragma ident "@(#)udf_vfsops.c 1.48 07/10/25 SMI"
#include <sys/types.h>
#include <sys/t_lock.h>
#include <sys/param.h>
#include <sys/time.h>
--- 17,31 ----
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
! * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
! #pragma ident "@(#)udf_vfsops.c 1.49 08/05/07 SMI"
#include <sys/types.h>
#include <sys/t_lock.h>
#include <sys/param.h>
#include <sys/time.h>
*** 181,191 ****
static int32_t
udf_mount(struct vfs *vfsp, struct vnode *mvp,
struct mounta *uap, struct cred *cr)
{
dev_t dev;
! struct vnode *bvp;
struct pathname dpn;
int32_t error;
enum whymountroot why;
int oflag, aflag;
--- 181,192 ----
static int32_t
udf_mount(struct vfs *vfsp, struct vnode *mvp,
struct mounta *uap, struct cred *cr)
{
dev_t dev;
! struct vnode *lvp = NULL;
! struct vnode *svp = NULL;
struct pathname dpn;
int32_t error;
enum whymountroot why;
int oflag, aflag;
*** 211,232 ****
if (error = pn_get(uap->dir, UIO_USERSPACE, &dpn)) {
return (error);
}
/*
! * Resolve path name of special file being mounted.
*/
if (error = lookupname(uap->spec, UIO_USERSPACE, FOLLOW, NULLVPP,
! &bvp)) {
pn_free(&dpn);
return (error);
}
! if (bvp->v_type != VBLK) {
error = ENOTBLK;
goto out;
}
! dev = bvp->v_rdev;
/*
* Ensure that this device isn't already mounted,
* unless this is a REMOUNT request
*/
--- 212,245 ----
if (error = pn_get(uap->dir, UIO_USERSPACE, &dpn)) {
return (error);
}
/*
! * Resolve path name of the file being mounted.
*/
if (error = lookupname(uap->spec, UIO_USERSPACE, FOLLOW, NULLVPP,
! &svp)) {
pn_free(&dpn);
return (error);
}
!
! error = vfs_get_lofi(vfsp, &lvp);
!
! if (error > 0) {
! if (error == ENOENT)
! error = ENODEV;
! goto out;
! } else if (error == 0) {
! dev = lvp->v_rdev;
! } else {
! dev = svp->v_rdev;
!
! if (svp->v_type != VBLK) {
error = ENOTBLK;
goto out;
}
! }
/*
* Ensure that this device isn't already mounted,
* unless this is a REMOUNT request
*/
*** 280,302 ****
aflag = VREAD;
} else {
oflag = FREAD | FWRITE;
aflag = VREAD | VWRITE;
}
! if ((error = VOP_ACCESS(bvp, aflag, 0, cr, NULL)) != 0 ||
! (error = secpolicy_spec_open(cr, bvp, oflag)) != 0) {
goto out;
- }
/*
* Mount the filesystem.
*/
error = ud_mountfs(vfsp, why, dev, dpn.pn_path, cr, 0);
out:
! VN_RELE(bvp);
pn_free(&dpn);
-
return (error);
}
--- 293,320 ----
aflag = VREAD;
} else {
oflag = FREAD | FWRITE;
aflag = VREAD | VWRITE;
}
!
! if (lvp == NULL &&
! (error = secpolicy_spec_open(cr, svp, oflag)) != 0)
goto out;
+ if ((error = VOP_ACCESS(svp, aflag, 0, cr, NULL)) != 0)
+ goto out;
+
/*
* Mount the filesystem.
*/
error = ud_mountfs(vfsp, why, dev, dpn.pn_path, cr, 0);
out:
! if (svp != NULL)
! VN_RELE(svp);
! if (lvp != NULL)
! VN_RELE(lvp);
pn_free(&dpn);
return (error);
}
*** 440,452 ****
/*
* The total number of inodes is
* the sum of files + directories + free inodes
*/
! sp->f_files = sp->f_ffree +
! udf_vfsp->udf_nfiles +
! udf_vfsp->udf_ndirs;
(void) cmpldev(&d32, vfsp->vfs_dev);
sp->f_fsid = d32;
(void) strcpy(sp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name);
sp->f_flag = vf_to_stf(vfsp->vfs_flag);
sp->f_namemax = MAXNAMLEN;
--- 458,468 ----
/*
* The total number of inodes is
* the sum of files + directories + free inodes
*/
! sp->f_files = sp->f_ffree + udf_vfsp->udf_nfiles + udf_vfsp->udf_ndirs;
(void) cmpldev(&d32, vfsp->vfs_dev);
sp->f_fsid = d32;
(void) strcpy(sp->f_basetype, vfssw[vfsp->vfs_fstype].vsw_name);
sp->f_flag = vf_to_stf(vfsp->vfs_flag);
sp->f_namemax = MAXNAMLEN;
*** 980,991 ****
* Verify it and get the location of
* Main Volume Descriptor Sequence
*/
secbp = ud_bread(dev, avd_loc << shift, ANCHOR_VOL_DESC_LEN);
if ((error = geterror(secbp)) != 0) {
! cmn_err(CE_NOTE,
! "udfs : Could not read Anchor Volume Desc %x", error);
brelse(secbp);
return (NULL);
}
avdp = (struct anch_vol_desc_ptr *)secbp->b_un.b_addr;
if (ud_verify_tag_and_desc(&avdp->avd_tag, UD_ANCH_VOL_DESC,
--- 996,1007 ----
* Verify it and get the location of
* Main Volume Descriptor Sequence
*/
secbp = ud_bread(dev, avd_loc << shift, ANCHOR_VOL_DESC_LEN);
if ((error = geterror(secbp)) != 0) {
! cmn_err(CE_NOTE, "udfs : Could not read Anchor Volume Desc %x",
! error);
brelse(secbp);
return (NULL);
}
avdp = (struct anch_vol_desc_ptr *)secbp->b_un.b_addr;
if (ud_verify_tag_and_desc(&avdp->avd_tag, UD_ANCH_VOL_DESC,
*** 1009,1020 ****
vds_loc = udf_vfsp->udf_mvds_loc;
secbp = ud_bread(dev, vds_loc << shift,
udf_vfsp->udf_mvds_len);
if ((error = geterror(secbp)) != 0) {
brelse(secbp);
! cmn_err(CE_NOTE,
! "udfs : Could not read Main Volume Desc %x", error);
vds_loc = udf_vfsp->udf_rvds_loc;
secbp = ud_bread(dev, vds_loc << shift,
udf_vfsp->udf_rvds_len);
if ((error = geterror(secbp)) != 0) {
--- 1025,1036 ----
vds_loc = udf_vfsp->udf_mvds_loc;
secbp = ud_bread(dev, vds_loc << shift,
udf_vfsp->udf_mvds_len);
if ((error = geterror(secbp)) != 0) {
brelse(secbp);
! cmn_err(CE_NOTE, "udfs : Could not read Main Volume Desc %x",
! error);
vds_loc = udf_vfsp->udf_rvds_loc;
secbp = ud_bread(dev, vds_loc << shift,
udf_vfsp->udf_rvds_len);
if ((error = geterror(secbp)) != 0) {
*** 1109,1120 ****
struct ud_part *pnew, *pold, *part;
pdesc = (struct part_desc *)ttag;
pold = udf_vfsp->udf_parts;
for (i = 0; i < udf_vfsp->udf_npart; i++) {
! if (pold->udp_number ==
SWAP_16(pdesc->pd_pnum)) {
if (SWAP_32(pdesc->pd_vdsn) >
pold->udp_seqno) {
pold->udp_seqno =
SWAP_32(pdesc->pd_vdsn);
pold->udp_access =
--- 1125,1140 ----
struct ud_part *pnew, *pold, *part;
pdesc = (struct part_desc *)ttag;
pold = udf_vfsp->udf_parts;
for (i = 0; i < udf_vfsp->udf_npart; i++) {
! if (pold->udp_number !=
SWAP_16(pdesc->pd_pnum)) {
+ pold++;
+ continue;
+ }
+
if (SWAP_32(pdesc->pd_vdsn) >
pold->udp_seqno) {
pold->udp_seqno =
SWAP_32(pdesc->pd_vdsn);
pold->udp_access =
*** 1124,1135 ****
pold->udp_length =
SWAP_32(pdesc->pd_part_length);
}
goto loop_end;
}
- pold ++;
- }
pold = udf_vfsp->udf_parts;
udf_vfsp->udf_npart++;
pnew = kmem_zalloc(udf_vfsp->udf_npart *
sizeof (struct ud_part), KM_SLEEP);
udf_vfsp->udf_parts = pnew;
--- 1144,1153 ----
*** 1262,1278 ****
typ1 = (struct pmap_typ1 *)hdr;
map = udf_vfsp->udf_maps;
udf_vfsp->udf_maps =
kmem_zalloc(sizeof (struct ud_map) *
! (udf_vfsp->udf_nmaps + 1),
! KM_SLEEP);
if (map != NULL) {
bcopy(map, udf_vfsp->udf_maps,
! sizeof (struct ud_map) * udf_vfsp->udf_nmaps);
! kmem_free(map,
! sizeof (struct ud_map) * udf_vfsp->udf_nmaps);
}
map = udf_vfsp->udf_maps + udf_vfsp->udf_nmaps;
map->udm_flags = UDM_MAP_NORM;
map->udm_vsn = SWAP_16(typ1->map1_vsn);
map->udm_pn = SWAP_16(typ1->map1_pn);
--- 1280,1296 ----
typ1 = (struct pmap_typ1 *)hdr;
map = udf_vfsp->udf_maps;
udf_vfsp->udf_maps =
kmem_zalloc(sizeof (struct ud_map) *
! (udf_vfsp->udf_nmaps + 1), KM_SLEEP);
if (map != NULL) {
bcopy(map, udf_vfsp->udf_maps,
! sizeof (struct ud_map) *
! udf_vfsp->udf_nmaps);
! kmem_free(map, sizeof (struct ud_map) *
! udf_vfsp->udf_nmaps);
}
map = udf_vfsp->udf_maps + udf_vfsp->udf_nmaps;
map->udm_flags = UDM_MAP_NORM;
map->udm_vsn = SWAP_16(typ1->map1_vsn);
map->udm_pn = SWAP_16(typ1->map1_pn);
*** 1289,1300 ****
* we donot
*/
map = udf_vfsp->udf_maps;
udf_vfsp->udf_maps =
kmem_zalloc(sizeof (struct ud_map) *
! (udf_vfsp->udf_nmaps + 1),
! KM_SLEEP);
if (map != NULL) {
bcopy(map, udf_vfsp->udf_maps,
sizeof (struct ud_map) *
udf_vfsp->udf_nmaps);
kmem_free(map,
--- 1307,1317 ----
* we donot
*/
map = udf_vfsp->udf_maps;
udf_vfsp->udf_maps =
kmem_zalloc(sizeof (struct ud_map) *
! (udf_vfsp->udf_nmaps + 1), KM_SLEEP);
if (map != NULL) {
bcopy(map, udf_vfsp->udf_maps,
sizeof (struct ud_map) *
udf_vfsp->udf_nmaps);
kmem_free(map,