Beispiel #1
0
static int _pvsegs_sub_single(struct cmd_context *cmd, struct volume_group *vg,
			      struct pv_segment *pvseg, void *handle)
{
	int consistent = 0;
	struct physical_volume *pv = pvseg->pv;
	int ret = ECMD_PROCESSED;

	if (!lock_vol(cmd, pv_vg_name(pv), LCK_VG_READ)) {
		log_error("Can't lock %s: skipping", pv_vg_name(pv));
		return ECMD_FAILED;
	}

	if (!(vg = vg_read(cmd, pv_vg_name(pv), NULL, &consistent))) {
		log_error("Can't read %s: skipping", pv_vg_name(pv));
		goto out;
	}

	if (!vg_check_status(vg, CLUSTERED)) {
		ret = ECMD_FAILED;
		goto out;
	}

	if (!report_object(handle, vg, NULL, pv, NULL, pvseg))
		ret = ECMD_FAILED;

out:
	unlock_vg(cmd, pv_vg_name(pv));
	return ret;
}
Beispiel #2
0
ssize_t
parser_fill (Parser *parser)
{
	unsigned char *inbuf, *inptr, *inend;
	ssize_t nread;
	size_t inlen;
	
	inbuf = parser->inbuf;
	inptr = parser->inptr;
	inend = parser->inend;
	inlen = inend - inptr;
	
	g_assert (inptr <= inend);
	
	/* attempt to align 'inend' with realbuf + PARSER_SCAN_HEAD */
	if (inptr >= inbuf) {
		inbuf -= inlen < PARSER_SCAN_HEAD ? inlen : PARSER_SCAN_HEAD;
		memmove (inbuf, inptr, inlen);
		inptr = inbuf;
		inbuf += inlen;
	} else if (inptr > parser->realbuf) {
		size_t shift;
		
		shift = MIN (inptr - parser->realbuf, inend - inbuf);
		memmove (inptr - shift, inptr, inlen);
		inptr -= shift;
		inbuf = inptr + inlen;
	} else {
		/* we can't shift... */
		inbuf = inend;
	}
	
	parser->inptr = inptr;
	parser->inend = inbuf;
	inend = parser->realbuf + PARSER_SCAN_HEAD + PARSER_SCAN_BUF - 1;
	
	if ((nread = vg_read (parser->fd, inbuf, inend - inbuf)) == -1)
		return -1;
	
	parser->inend += nread;
	
	return parser->inend - parser->inptr;
}