};
static struct blkid_prval *blkid_probe_new_value(void);
-static void blkid_probe_reset_vals(blkid_probe pr);
+static void blkid_probe_reset_values(blkid_probe pr);
static void blkid_probe_reset_buffer(blkid_probe pr);
/**
pr->chains[i].enabled = chains_drvs[i]->dflt_enabled;
}
INIT_LIST_HEAD(&pr->buffers);
- INIT_LIST_HEAD(&pr->vals);
+ INIT_LIST_HEAD(&pr->values);
return pr;
}
if ((pr->flags & BLKID_FL_PRIVATE_FD) && pr->fd >= 0)
close(pr->fd);
blkid_probe_reset_buffer(pr);
+ blkid_probe_reset_values(pr);
blkid_free_probe(pr->disk_probe);
DBG(LOWPROBE, ul_debug("free probe %p", pr));
free(pr);
}
-void blkid_probe_free_val(struct blkid_prval *v)
+void blkid_probe_free_value(struct blkid_prval *v)
{
if (!v)
return;
list_del(&v->prvals);
free(v->data);
+
+ DBG(LOWPROBE, ul_debug(" free value %s", v->name));
free(v);
}
/*
* Removes chain values from probing result.
*/
-void blkid_probe_chain_reset_vals(blkid_probe pr, struct blkid_chain *chn)
+void blkid_probe_chain_reset_values(blkid_probe pr, struct blkid_chain *chn)
{
struct list_head *p, *pnext;
- if (!pr || list_empty(&pr->vals))
+ if (!pr || list_empty(&pr->values))
return;
- list_for_each_safe(p, pnext, &pr->vals) {
+ DBG(LOWPROBE, ul_debug("reseting %s values", chn->driver->name));
+
+ list_for_each_safe(p, pnext, &pr->values) {
struct blkid_prval *v = list_entry(p,
struct blkid_prval, prvals);
if (v->chain == chn)
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
}
}
chn->idx = -1;
}
-static struct blkid_prval *blkid_probe_deep_copy_val(struct blkid_prval *dest,
- struct blkid_prval *src)
+/*
+static struct blkid_prval *blkid_probe_copy_value(struct blkid_prval *src)
{
+ struct blkid_prval *dest = blkid_probe_new_value();
+
+ if (!dest)
+ return NULL;
+
memcpy(dest, src, sizeof(struct blkid_prval));
dest->data = malloc(src->len);
memcpy(dest->data, src->data, src->len);
INIT_LIST_HEAD(&dest->prvals);
-
return dest;
}
+*/
/*
- * Copies chain values from probing result to @vals.
+ * Move chain values from probing result to @vals
*/
-int blkid_probe_chain_copy_vals(blkid_probe pr, struct blkid_chain *chn,
- struct list_head *vals)
+int blkid_probe_chain_save_values(blkid_probe pr, struct blkid_chain *chn,
+ struct list_head *vals)
{
- struct list_head *p;
- struct blkid_prval *new_v, *v;
-
- list_for_each(p, &pr->vals) {
+ struct list_head *p, *pnext;
+ struct blkid_prval *v;
- v = list_entry(p, struct blkid_prval, prvals);
+ DBG(LOWPROBE, ul_debug("saving %s values", chn->driver->name));
- new_v = blkid_probe_new_value();
- if (!new_v)
- break;
+ list_for_each_safe(p, pnext, &pr->values) {
+ v = list_entry(p, struct blkid_prval, prvals);
if (v->chain != chn)
continue;
- if (!blkid_probe_deep_copy_val(new_v, v))
- break;
+ list_del(&v->prvals);
+ INIT_LIST_HEAD(&v->prvals);
- list_add_tail(&new_v->prvals, vals);
+ list_add_tail(&v->prvals, vals);
}
return 0;
}
/*
* Appends values from @vals to the probing result
*/
-void blkid_probe_append_vals(blkid_probe pr, struct list_head *vals)
+void blkid_probe_append_values_list(blkid_probe pr, struct list_head *vals)
+{
+ DBG(LOWPROBE, ul_debug("appending values"));
+
+ list_splice(vals, &pr->values);
+ INIT_LIST_HEAD(vals);
+}
+
+
+void blkid_probe_free_values_list(struct list_head *vals)
{
- list_splice(vals, &pr->vals);
+ if (!vals)
+ return;
+
+ DBG(LOWPROBE, ul_debug("freeing values list"));
+
+ while (!list_empty(vals)) {
+ struct blkid_prval *v = list_entry(vals->next, struct blkid_prval, prvals);
+ blkid_probe_free_value(v);
+ }
}
struct blkid_chain *blkid_probe_get_chain(blkid_probe pr)
if (!pr)
return;
- blkid_probe_reset_vals(pr);
+ blkid_probe_reset_values(pr);
blkid_probe_set_wiper(pr, 0, 0);
pr->cur_chain = NULL;
INIT_LIST_HEAD(&pr->buffers);
}
-static void blkid_probe_reset_vals(blkid_probe pr)
+static void blkid_probe_reset_values(blkid_probe pr)
{
- if (!pr || list_empty(&pr->vals))
+ if (!pr || list_empty(&pr->values))
return;
DBG(LOWPROBE, ul_debug("resetting results pr=%p", pr));
- while (!list_empty(&pr->vals)) {
- struct blkid_prval *v = list_entry(pr->vals.next,
+ while (!list_empty(&pr->values)) {
+ struct blkid_prval *v = list_entry(pr->values.next,
struct blkid_prval, prvals);
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
}
- INIT_LIST_HEAD(&pr->vals);
+ INIT_LIST_HEAD(&pr->values);
}
/*
v->name = name;
v->chain = pr->cur_chain;
- list_add_tail(&v->prvals, &pr->vals);
+ list_add_tail(&v->prvals, &pr->values);
DBG(LOWPROBE, ul_debug("assigning %s [%s]", name, v->chain->driver->name));
return v;
len = vasprintf((char **) &v->data, fmt, ap);
if (len <= 0) {
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return len == 0 ? -EINVAL : -ENOMEM;
}
v->len = len + 1;
if (!pr)
return -1;
- list_for_each(p, &pr->vals)
+ list_for_each(p, &pr->values)
++i;
return i;
}
struct blkid_prval *blkid_probe_last_value(blkid_probe pr)
{
- if (!pr || list_empty(&pr->vals))
+ if (!pr || list_empty(&pr->values))
return NULL;
- return list_last_entry(&pr->vals, struct blkid_prval, prvals);
+ return list_last_entry(&pr->values, struct blkid_prval, prvals);
}
if (!pr || num < 0)
return NULL;
- list_for_each(p, &pr->vals) {
+ list_for_each(p, &pr->values) {
if (i++ != num)
continue;
return list_entry(p, struct blkid_prval, prvals);
{
struct list_head *p;
- if (!pr || list_empty(&pr->vals) || !name)
+ if (!pr || list_empty(&pr->values) || !name)
return NULL;
- list_for_each(p, &pr->vals) {
+ list_for_each(p, &pr->values) {
struct blkid_prval *v = list_entry(p, struct blkid_prval,
prvals);
DBG(LOWPROBE, ul_debug("previously wiped area modified "
" -- ignore previous results"));
blkid_probe_set_wiper(pr, 0, 0);
- blkid_probe_chain_reset_vals(pr, chn);
+ blkid_probe_chain_reset_values(pr, chn);
}
}
if (!pr || chn->idx < -1)
return -EINVAL;
- blkid_probe_chain_reset_vals(pr, chn);
+ blkid_probe_chain_reset_values(pr, chn);
if (pr->flags & BLKID_FL_NOSCAN_DEV)
return BLKID_PROBE_NONE;
DBG(LOWPROBE, ul_debug("\tcall probefunc()"));
rc = id->probefunc(pr, mag);
if (rc != BLKID_PROBE_OK) {
- blkid_probe_chain_reset_vals(pr, chn);
+ blkid_probe_chain_reset_values(pr, chn);
if (rc < 0)
break;
continue;
rc = blkid_probe_set_magic(pr, off, mag->len,
(unsigned char *) mag->magic);
if (rc) {
- blkid_probe_chain_reset_vals(pr, chn);
+ blkid_probe_chain_reset_values(pr, chn);
DBG(LOWPROBE, ul_debug("failed to set result -- ignore"));
continue;
}
if (count == 1) {
/* save the first result */
- blkid_probe_chain_copy_vals(pr, chn, &vals);
+ blkid_probe_chain_save_values(pr, chn, &vals);
idx = chn->idx;
}
}
if (rc < 0)
- return rc; /* error */
+ goto done; /* error */
if (count > 1 && intol) {
DBG(LOWPROBE, ul_debug("ERROR: superblocks chain: "
"ambivalent result detected (%d filesystems)!",
count));
- return -2; /* error, ambivalent result (more FS) */
+ rc = -2; /* error, ambivalent result (more FS) */
+ goto done;
+ }
+ if (!count) {
+ rc = BLKID_PROBE_NONE;
+ goto done;
}
- if (!count)
- return BLKID_PROBE_NONE;
if (idx != -1) {
/* restore the first result */
- blkid_probe_chain_reset_vals(pr, chn);
- blkid_probe_append_vals(pr, &vals);
+ blkid_probe_chain_reset_values(pr, chn);
+ blkid_probe_append_values_list(pr, &vals);
chn->idx = idx;
}
if (chn->idx >= 0 && idinfos[chn->idx]->usage & BLKID_USAGE_RAID)
pr->prob_flags |= BLKID_PROBE_FL_IGNORE_PT;
- return BLKID_PROBE_OK;
+ rc = BLKID_PROBE_OK;
+done:
+ blkid_probe_free_values_list(&vals);
+ return rc;
}
int blkid_probe_set_version(blkid_probe pr, const char *version)
return 0;
}
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return rc;
}
return 0;
}
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return rc;
}
return 0;
}
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return rc;
}
return 0;
}
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return rc;
}
return 0;
}
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return rc;
}
return 0;
}
- blkid_probe_free_val(v);
+ blkid_probe_free_value(v);
return rc;
}