if (!rl) { ntfs_error(sb, "Cannot read attribute list since runlist is " "missing."); goto err_out; } 
int load_attribute_list(ntfs_volume *vol, runlist *runlist, u8 *al_start,		const s64 size, const s64 initialized_size){	LCN lcn;	u8 *al = al_start;	u8 *al_end = al + initialized_size;	runlist_element *rl;	struct buffer_head *bh;	struct super_block *sb;	unsigned long block_size;	unsigned long block, max_block;	int err = 0;	unsigned char block_size_bits;	ntfs_debug("Entering.");	if (!vol || !runlist || !al || size <= 0 || initialized_size < 0 ||			initialized_size > size)		return -EINVAL;	if (!initialized_size) {		memset(al, 0, size);		return 0;	}	sb = vol->sb;	block_size = sb->s_blocksize;	block_size_bits = sb->s_blocksize_bits;	down_read(&runlist->lock);	rl = runlist->rl;	/* Read all clusters specified by the runlist one run at a time. */	while (rl->length) {		lcn = ntfs_rl_vcn_to_lcn(rl, rl->vcn);		ntfs_debug("Reading vcn = 0x%llx, lcn = 0x%llx.",				(unsigned long long)rl->vcn,				(unsigned long long)lcn);		/* The attribute list cannot be sparse. */		if (lcn < 0) {			ntfs_error(sb, "ntfs_rl_vcn_to_lcn() failed.  Cannot "					"read attribute list.");			goto err_out;		}		block = lcn << vol->cluster_size_bits >> block_size_bits;		/* Read the run from device in chunks of block_size bytes. */		max_block = block + (rl->length << vol->cluster_size_bits >>				block_size_bits);		ntfs_debug("max_block = 0x%lx.", max_block);		do {			ntfs_debug("Reading block = 0x%lx.", block);			bh = sb_bread(sb, block);			if (!bh) {				ntfs_error(sb, "sb_bread() failed. Cannot "						"read attribute list.");				goto err_out;			}			if (al + block_size >= al_end)				goto do_final;			memcpy(al, bh->b_data, block_size);			brelse(bh);			al += block_size;		} while (++block < max_block);		rl++;	}	if (initialized_size < size) {initialize:		memset(al_start + initialized_size, 0, size - initialized_size);	}done:	up_read(&runlist->lock);	return err;do_final:	if (al < al_end) {		/*		 * Partial block.		 *		 * Note: The attribute list can be smaller than its allocation		 * by multiple clusters.  This has been encountered by at least		 * two people running Windows XP, thus we cannot do any		 * truncation sanity checking here. (AIA)		 */		memcpy(al, bh->b_data, al_end - al);		brelse(bh);		if (initialized_size < size)			goto initialize;		goto done;	}	brelse(bh);	/* Real overflow! */	ntfs_error(sb, "Attribute list buffer overflow. Read attribute list "			"is truncated.");err_out:	err = -EIO;	goto done;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/2983d1bd1a596e88cdddc0c2d45b9e97728f3f41/attrib.c/clean/fs/ntfs/attrib.c