# HG changeset patch # User nr123932 # Date 1176224345 25200 # Node ID 4d632d6bcf854a227027d8bc638892a3f74a3df2 # Parent 282750a23d974a97a7070cccb9c69c8fead85e76 6446158 Invalid I/O error can be happened due to wrong cast to nfs_fh4_fmt_t diff -r 282750a23d97 -r 4d632d6bcf85 usr/src/uts/common/fs/nfs/nfs4_state.c --- a/usr/src/uts/common/fs/nfs/nfs4_state.c Mon Apr 09 19:26:23 2007 -0700 +++ b/usr/src/uts/common/fs/nfs/nfs4_state.c Tue Apr 10 09:59:05 2007 -0700 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -3648,9 +3648,14 @@ { rfs4_lo_state_t *lsp = (rfs4_lo_state_t *)u_entry; struct exportinfo *exi = (struct exportinfo *)e; - nfs_fh4_fmt_t *exi_fhp, *finfo_fhp; - - exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh; + nfs_fh4_fmt_t fhfmt4, *exi_fhp, *finfo_fhp; + fhandle_t *efhp; + + efhp = (fhandle_t *)&exi->exi_fh; + exi_fhp = (nfs_fh4_fmt_t *)&fhfmt4; + + FH_TO_FMT4(efhp, exi_fhp); + finfo_fhp = (nfs_fh4_fmt_t *)lsp->state->finfo->filehandle.nfs_fh4_val; @@ -3677,9 +3682,14 @@ { rfs4_state_t *sp = (rfs4_state_t *)u_entry; struct exportinfo *exi = (struct exportinfo *)e; - nfs_fh4_fmt_t *exi_fhp, *finfo_fhp; - - exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh; + nfs_fh4_fmt_t fhfmt4, *exi_fhp, *finfo_fhp; + fhandle_t *efhp; + + efhp = (fhandle_t *)&exi->exi_fh; + exi_fhp = (nfs_fh4_fmt_t *)&fhfmt4; + + FH_TO_FMT4(efhp, exi_fhp); + finfo_fhp = (nfs_fh4_fmt_t *)sp->finfo->filehandle.nfs_fh4_val; @@ -3705,9 +3715,14 @@ { rfs4_deleg_state_t *dsp = (rfs4_deleg_state_t *)u_entry; struct exportinfo *exi = (struct exportinfo *)e; - nfs_fh4_fmt_t *exi_fhp, *finfo_fhp; - - exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh; + nfs_fh4_fmt_t fhfmt4, *exi_fhp, *finfo_fhp; + fhandle_t *efhp; + + efhp = (fhandle_t *)&exi->exi_fh; + exi_fhp = (nfs_fh4_fmt_t *)&fhfmt4; + + FH_TO_FMT4(efhp, exi_fhp); + finfo_fhp = (nfs_fh4_fmt_t *)dsp->finfo->filehandle.nfs_fh4_val; @@ -3731,9 +3746,14 @@ { rfs4_file_t *fp = (rfs4_file_t *)u_entry; struct exportinfo *exi = (struct exportinfo *)e; - nfs_fh4_fmt_t *exi_fhp, *finfo_fhp; - - exi_fhp = (nfs_fh4_fmt_t *)&exi->exi_fh; + nfs_fh4_fmt_t fhfmt4, *exi_fhp, *finfo_fhp; + fhandle_t *efhp; + + efhp = (fhandle_t *)&exi->exi_fh; + exi_fhp = (nfs_fh4_fmt_t *)&fhfmt4; + + FH_TO_FMT4(efhp, exi_fhp); + finfo_fhp = (nfs_fh4_fmt_t *)fp->filehandle.nfs_fh4_val; if (EQFSID(&finfo_fhp->fh4_fsid, &exi_fhp->fh4_fsid) && diff -r 282750a23d97 -r 4d632d6bcf85 usr/src/uts/common/nfs/nfs4.h --- a/usr/src/uts/common/nfs/nfs4.h Mon Apr 09 19:26:23 2007 -0700 +++ b/usr/src/uts/common/nfs/nfs4.h Tue Apr 10 09:59:05 2007 -0700 @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -1005,6 +1005,22 @@ #define NFS_FH4_LEN sizeof (nfs_fh4_fmt_t) +/* + * Copy fields from external (fhandle_t) to in-memory (nfs_fh4_fmt_t) + * format to support export info checking. It does not copy over + * the complete filehandle, just the fsid, xlen and xdata. It may + * need to be changed to be used in other places. + * + * NOTE: The macro expects the space to be pre-allocated for + * the contents of nfs_fh4_fmt_t. + */ +#define FH_TO_FMT4(exifh, nfs_fmt) { \ + bzero((nfs_fmt), NFS_FH4_LEN); \ + (nfs_fmt)->fh4_fsid = (exifh)->fh_fsid; \ + (nfs_fmt)->fh4_xlen = (exifh)->fh_xlen; \ + bcopy((exifh)->fh_xdata, (nfs_fmt)->fh4_xdata, \ + (exifh)->fh_xlen); \ +} /* * A few definitions of repeatedly used constructs for nfsv4