Logo Search packages:      
Sourcecode: dmraid version File versions  Download package

log_ops.c

/*
 * Copyright (C) 2006 Darrick Wong, IBM
 *                    All rights reserved.
 *
 * Copyright (C) 2006 Heinz Mauelshagen, Red Hat GmbH
 *                All rights reserved.
 *
 * See file LICENSE at the top of this source tree for license information.
 */
#include "internal.h"

void end_log(struct lib_context *lc, struct list_head *log)
{
      struct list_head *pos, *tmp;

      list_for_each_safe(pos, tmp, log) {
            list_del(pos);
            dbg_free(list_entry(pos, struct change, changes));
      }
}

int revert_log(struct lib_context *lc, struct list_head *log)
{
      int writes_started = 0, ret = 0;
      struct change *entry;
      struct raid_dev *rd;

      list_for_each_entry(entry, log, changes) {
            if (writes_started && entry->type != WRITE_METADATA) {
                  log_err(lc, "%s: State change after metadata write?",
                        __func__);
                  ret = -EINVAL;
                  break;
            }

            if (entry->type == ADD_TO_SET) {
                  rd = entry->rd;
                  rd->type = t_spare;
                  list_del_init(&entry->rd->devs);
            } else if (entry->type == WRITE_METADATA) {
                  writes_started = 1;
                  rd = entry->rd;
                  ret = write_dev(lc, rd, 0);
                  if (ret) {
                        log_err(lc, "%s: Error while reverting "
                                  "metadata.", __func__);
                        break;
                  }
            }
      }

      end_log(lc, log);
      return ret;
}

Generated by  Doxygen 1.6.0   Back to index