/* diskfilter.h - On disk structures for RAID. */
/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2006,2007,2008,2010  Free Software Foundation, Inc.
 *
 *  GRUB is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  GRUB is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GRUB_DISKFILTER_H
#define GRUB_DISKFILTER_H	1

#include <grub/types.h>
#include <grub/list.h>

enum
  {
    GRUB_RAID_LAYOUT_RIGHT_MASK	= 1,
    GRUB_RAID_LAYOUT_SYMMETRIC_MASK = 2,
    GRUB_RAID_LAYOUT_MUL_FROM_POS = 4,

    GRUB_RAID_LAYOUT_LEFT_ASYMMETRIC = 0,
    GRUB_RAID_LAYOUT_RIGHT_ASYMMETRIC = GRUB_RAID_LAYOUT_RIGHT_MASK,
    GRUB_RAID_LAYOUT_LEFT_SYMMETRIC = GRUB_RAID_LAYOUT_SYMMETRIC_MASK,
    GRUB_RAID_LAYOUT_RIGHT_SYMMETRIC = (GRUB_RAID_LAYOUT_RIGHT_MASK
					| GRUB_RAID_LAYOUT_SYMMETRIC_MASK)
  };


struct grub_diskfilter_vg {
  char *uuid;
  grub_size_t uuid_len;
  /* Optional.  */
  char *name;
  grub_uint64_t extent_size;
  struct grub_diskfilter_pv *pvs;
  struct grub_diskfilter_lv *lvs;
  struct grub_diskfilter_vg *next;

#ifdef GRUB_UTIL
  struct grub_diskfilter *driver;
#endif
};

struct grub_diskfilter_pv_id {
  union
  {
    char *uuid;
    int id;
  };
  grub_size_t uuidlen;
};

struct grub_diskfilter_pv {
  struct grub_diskfilter_pv_id id;
  /* Optional.  */
  char *name;
  grub_disk_t disk;
  grub_disk_addr_t part_start;
  grub_disk_addr_t part_size;
  grub_disk_addr_t start_sector; /* Sector number where the data area starts. */
  struct grub_diskfilter_pv *next;
  /* Optional.  */
  grub_uint8_t *internal_id;
#ifdef GRUB_UTIL
  char **partmaps;
#endif
};

struct grub_diskfilter_lv {
  /* Name used for disk.  */
  char *fullname;
  char *idname;
  /* Optional.  */
  char *name;
  int number;
  unsigned int segment_count;
  grub_size_t segment_alloc;
  grub_uint64_t size;
  int became_readable_at;
  int scanned;
  int visible;

  /* Pointer to segment_count segments. */
  struct grub_diskfilter_segment *segments;
  struct grub_diskfilter_vg *vg;
  struct grub_diskfilter_lv *next;

  /* Optional.  */
  char *internal_id;
};

struct grub_diskfilter_segment {
  grub_uint64_t start_extent;
  grub_uint64_t extent_count;
  enum 
    {
      GRUB_DISKFILTER_STRIPED = 0,
      GRUB_DISKFILTER_MIRROR = 1,
      GRUB_DISKFILTER_RAID4 = 4,
      GRUB_DISKFILTER_RAID5 = 5,      
      GRUB_DISKFILTER_RAID6 = 6,
      GRUB_DISKFILTER_RAID10 = 10,
  } type;
  int layout;
  /* valid only for raid10.  */
  grub_uint64_t raid_member_size;

  unsigned int node_count;
  unsigned int node_alloc;
  struct grub_diskfilter_node *nodes;

  unsigned int stripe_size;
};

struct grub_diskfilter_node {
  grub_disk_addr_t start;
  /* Optional.  */
  char *name;
  struct grub_diskfilter_pv *pv;
  struct grub_diskfilter_lv *lv;
};

struct grub_diskfilter_vg *
grub_diskfilter_get_vg_by_uuid (grub_size_t uuidlen, char *uuid);

struct grub_diskfilter
{
  struct grub_diskfilter *next;
  struct grub_diskfilter **prev;

  const char *name;

  struct grub_diskfilter_vg * (*detect) (grub_disk_t disk,
					 struct grub_diskfilter_pv_id *id,
					 grub_disk_addr_t *start_sector);
};
typedef struct grub_diskfilter *grub_diskfilter_t;

extern grub_diskfilter_t grub_diskfilter_list;
static inline void
grub_diskfilter_register_front (grub_diskfilter_t diskfilter)
{
  grub_list_push (GRUB_AS_LIST_P (&grub_diskfilter_list),
		  GRUB_AS_LIST (diskfilter));
}

static inline void
grub_diskfilter_register_back (grub_diskfilter_t diskfilter)
{
  grub_diskfilter_t p, *q;
  for (q = &grub_diskfilter_list, p = *q; p; q = &p->next, p = *q);
  diskfilter->next = NULL;
  diskfilter->prev = q;
  *q = diskfilter;
}
static inline void
grub_diskfilter_unregister (grub_diskfilter_t diskfilter)
{
  grub_list_remove (GRUB_AS_LIST (diskfilter));
}

struct grub_diskfilter_vg *
grub_diskfilter_make_raid (grub_size_t uuidlen, char *uuid, int nmemb,
			   const char *name, grub_uint64_t disk_size,
			   grub_uint64_t stripe_size,
			   int layout, int level);

typedef grub_err_t (*grub_raid5_recover_func_t) (struct grub_diskfilter_segment *array,
                                                 int disknr, char *buf,
                                                 grub_disk_addr_t sector,
                                                 grub_size_t size);

typedef grub_err_t (*grub_raid6_recover_func_t) (struct grub_diskfilter_segment *array,
                                                 int disknr, int p, char *buf,
                                                 grub_disk_addr_t sector,
                                                 grub_size_t size);

extern grub_raid5_recover_func_t grub_raid5_recover_func;
extern grub_raid6_recover_func_t grub_raid6_recover_func;

grub_err_t grub_diskfilter_vg_register (struct grub_diskfilter_vg *vg);

grub_err_t
grub_diskfilter_read_node (const struct grub_diskfilter_node *node,
			   grub_disk_addr_t sector,
			   grub_size_t size, char *buf);

#ifdef GRUB_UTIL
struct grub_diskfilter_pv *
grub_diskfilter_get_pv_from_disk (grub_disk_t disk,
				  struct grub_diskfilter_vg **vg);
void
grub_diskfilter_get_partmap (grub_disk_t disk,
			     void (*cb) (const char *val, void *data),
			     void *data);
#endif

#endif /* ! GRUB_RAID_H */
