Пример #1
0
/*
 * NAME: getDummyInode
 *
 * FUNCTION: Allocates & initializes dummy inode which is used by called I/O
 *	     routines
 *
 * PARAMETERS:
 *	vfsp	- vfsp for filesystem - may not be fully mounted
 *
 * RETURNS: pointer to properly-initialized dummy inode
 */
inode_t	*getDummyInode(
struct vfs	*vfsp)
{
	inode_t *dummy_inode;

	DASD_LOCK();
	if (FreeDummyInodes == 0) {
		assert (FreeDummyInodes = (inode_t *)xmalloc(sizeof(inode_t),
							     0, pinned_heap));
		bzero(FreeDummyInodes, sizeof(inode_t));
	}
	dummy_inode = FreeDummyInodes;
	FreeDummyInodes = dummy_inode->i_flnext;
	DASD_UNLOCK();

	/* Initialize only the fields used by rawRead/Write & dioRead/Write
	 */
	dummy_inode->i_dev = vfsp->vfs_vpfsi->vpi_unit;
	dummy_inode->i_ipmnt = dummy_inode;
	dummy_inode->i_Strategy2 = vfsp->vfs_strat2p;
	dummy_inode->i_Strategy3 = vfsp->vfs_strat3p;
	dummy_inode->i_pbsize = vfsp->vfs_bsize;
	dummy_inode->i_l2pbsize = log2shift(vfsp->vfs_bsize);

	return dummy_inode;
}
Пример #2
0
/******************************************************************
 * NAME: 	OpenFilSys
 *
 * FUNCTION: 	Read the superblock into a buffer.  
 *		Extract various pieces of information.
 *		Release the buffer.
 *
 * PARAMETERS:	none
 *
 * NOTES:
 *
 * RETURNS:
 *      success: 0
 *      failure: something else
 */
int32 OpenFilSys( void )
{
	int32			rc;
	struct superblock	*sb;
	buf_t			*bp;

	/*
	 *	validate and retrieve fs parameters from superblock
	 */
	/* try to read the primary superblock */
	rc = bRawRead(LVHandle, (int64)SUPER1_OFF, (int32)PAGESIZE, &bp);
	if (rc != 0)  {
		/* try to read the secondary superblock */
		rc = bRawRead(LVHandle, (int64)SUPER2_OFF, (int32)PAGESIZE, &bp);
		if (rc != 0)  {
#ifdef _JFS_DEBUG
	printf("OpenFilSys: i/o error: rc=%d\n", rc);
#endif
			return CBBL_CANTREADSBLKS;
			}
		}

	sb = (struct superblock *)bp->b_data;

	/* check magic/version number */
	if (strncmp(sb->s_magic,JFS_MAGIC,(unsigned)strlen(JFS_MAGIC))
	 || (sb->s_version != JFS_VERSION))  {
		return CBBL_INVALMAGORVERS;
		}

	if (sb->s_state & FM_DIRTY)  {
		return CBBL_FSDIRTY;
		}

	fsMount->bsize = sb->s_bsize;
	fsMount->l2bsize = sb->s_l2bsize;
	fsMount->l2bfactor = sb->s_l2bfactor;
	fsMount->nbperpage = PAGESIZE >> fsMount->l2bsize;
	fsMount->l2nbperpage = log2shift(fsMount->nbperpage);

	fsMount->FSSize = sb->s_size >> sb->s_l2bfactor;
	
	fsMount->AGSize = sb->s_agsize;
#ifdef _JFS_DEBUG
	printf("superblock: attribute:0x%08x state:0x%08x\n",
		 sb->s_flag, sb->s_state);
	printf("superblock: bsize:%d FSSize:%lld\n",
		fsMount->bsize, fsMount->FSSize);
#endif
	agg_recptr->fs_blksize = sb->s_bsize;	/* aggregate block size */
	agg_recptr->lv_blksize = sb->s_pbsize;	/* device block size	*/
	agg_recptr->fs_lv_ratio = sb->s_bsize / sb->s_pbsize;
	agg_recptr->fs_last_metablk = addressPXD( &sb->s_aim2 ) +
					lengthPXD( &sb->s_aim2);  
	agg_recptr->fs_first_wspblk = addressPXD( &sb->s_fsckpxd );

	bRelease(bp);

	return rc;
}						/* end OpenFilSys() */
Пример #3
0
/*
 * NAME: ujfs_init_superblock
 *
 * FUNCTION: Initialize primary and secondary aggregate superblock and write to
 *      disk
 *
 * PRE CONDITIONS:
 *
 * POST CONDITIONS:
 *
 * PARAMETERS:
 *      aggr_superblock         - structure to be filled in with superblock
 *                                information.
 *      dev_ptr                 - open port for device to write superblock to
 *      volume_label            - Volume label for superblock
 *      number_of_blocks        - Number of blocks for aggregate
 *      compress                - Whether this is a compressed aggregate
 *      fs_block_size           - block size for aggregate
 *      phys_block_size         - physical block size for device
 *      type_jfs                - JFS type to create; s_flag field of superblock
 *      secondary_ait_address   - block offset of first extent of secondary
 *                                aggregate inode table
 *      secondary_ait_length    - number of blocks of first extent of secondary
 *                                aggregate inode table
 *      fsck_svclog_length      - number of blocks of fsck_wspace_length is
 *                                intended for the fsck service log.
 *      ag_size                 - AG size
 *      fsck_wspace_address     - block offset of start of fsck working space
 *      fsck_wspace_length      - number of blocks of fsck working space
 *      logloc                  - block offset of start of log in aggr.
 *      logsize                 - number of blocks of log in aggr.
 *      secondary_aim_address   - block offset of first extent of secondary
 *                                aggregate inode map
 *      secondary_aim_length    - number of blocks of first extent of secondary
 *                                aggregate inode map
 *
 * RETURNS:
 *      0: success
 *      Any other return value indicates failure
 */
int32 ujfs_init_superblock( struct superblock   *aggr_superblock,
                            HFILE               dev_ptr,
                            char                *volume_label,
                            int64               number_of_blocks,
                            uint32              compress,
                            int32               fs_block_size,
                            int32               phys_block_size,
                            uint32              type_jfs,
                            int64               secondary_ait_address,
                            int32               secondary_ait_length,
                            int32               ag_size,
                            int64               fsck_wspace_address,
                            int32               fsck_wspace_length,
                            int32               fsck_svclog_length,
                            int64               logloc,
                            int32               logsize,
                            int64               secondary_aim_address,
                            int32               secondary_aim_length )
{
    int32       rc;

    /*
     * Initialize all of the fields of the superblock
     */
    strncpy(aggr_superblock->s_magic, JFS_MAGIC, strlen(JFS_MAGIC));
    aggr_superblock->s_version = JFS_VERSION;
    aggr_superblock->s_logdev = 0;
    aggr_superblock->s_logserial = 0;
    aggr_superblock->s_size = (number_of_blocks * fs_block_size) /
                              phys_block_size;
    aggr_superblock->s_bsize = fs_block_size;
    aggr_superblock->s_l2bsize = log2shift( aggr_superblock->s_bsize );
    aggr_superblock->s_l2bfactor = log2shift( aggr_superblock->s_bsize /
                                              phys_block_size );
    aggr_superblock->s_pbsize = phys_block_size;
    aggr_superblock->s_l2pbsize = log2shift( aggr_superblock->s_pbsize );
    aggr_superblock->s_agsize = ag_size;
    aggr_superblock->s_flag = type_jfs;
    aggr_superblock->s_compress = compress;
    aggr_superblock->s_state = FM_CLEAN;
    strncpy(aggr_superblock->s_fpack, volume_label, LV_NAME_SIZE );

    PXDaddress( &(aggr_superblock->s_ait2), secondary_ait_address );
    PXDlength( &(aggr_superblock->s_ait2), secondary_ait_length );

    PXDaddress( &(aggr_superblock->s_aim2), secondary_aim_address );
    PXDlength( &(aggr_superblock->s_aim2), secondary_aim_length );

    PXDaddress( &(aggr_superblock->s_fsckpxd), fsck_wspace_address );
    PXDlength( &(aggr_superblock->s_fsckpxd), fsck_wspace_length );
    aggr_superblock->s_fscklog = 0;
    aggr_superblock->s_fsckloglen = fsck_svclog_length;

    PXDaddress( &(aggr_superblock->s_logpxd), logloc );
    PXDlength( &(aggr_superblock->s_logpxd), logsize );

#ifdef	_JFS_DFS_LFS
    aggr_superblock->s_attach = 0;
    aggr_superblock->totalUsable = (aggr_superblock->s_size
                                        << aggr_superblock->s_l2pbsize) >> 10;
    aggr_superblock->minFree = 0;
    aggr_superblock->realFree = 0;
#endif	/* _JFS_DFS_LFS */
    aggr_superblock->s_time.tv_sec = (uint32) time( NULL );

    /*
     * Write both the primary and secondary superblocks to disk if valid
     */
    rc = ujfs_validate_super( aggr_superblock );
    if( rc != 0 ) {
        return rc;
    }
    rc = ujfs_put_superblk( dev_ptr, aggr_superblock, 1 );
    if( rc != 0 ) return rc;

    rc = ujfs_put_superblk( dev_ptr, aggr_superblock, 0 );

    return( rc );
}