~ubuntu-branches/ubuntu/precise/linux-lowlatency/precise

« back to all changes in this revision

Viewing changes to fs/exofs/ore_raid.h

  • Committer: Package Import Robot
  • Author(s): Alessio Igor Bogani
  • Date: 2011-10-26 11:13:05 UTC
  • Revision ID: package-import@ubuntu.com-20111026111305-tz023xykf0i6eosh
Tags: upstream-3.2.0
ImportĀ upstreamĀ versionĀ 3.2.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) from 2011
 
3
 * Boaz Harrosh <bharrosh@panasas.com>
 
4
 *
 
5
 * This file is part of the objects raid engine (ore).
 
6
 *
 
7
 * It is free software; you can redistribute it and/or modify
 
8
 * it under the terms of the GNU General Public License version 2 as published
 
9
 * by the Free Software Foundation.
 
10
 *
 
11
 * You should have received a copy of the GNU General Public License
 
12
 * along with "ore". If not, write to the Free Software Foundation, Inc:
 
13
 *      "Free Software Foundation <info@fsf.org>"
 
14
 */
 
15
 
 
16
#include <scsi/osd_ore.h>
 
17
 
 
18
#define ORE_ERR(fmt, a...) printk(KERN_ERR "ore: " fmt, ##a)
 
19
 
 
20
#ifdef CONFIG_EXOFS_DEBUG
 
21
#define ORE_DBGMSG(fmt, a...) \
 
22
        printk(KERN_NOTICE "ore @%s:%d: " fmt, __func__, __LINE__, ##a)
 
23
#else
 
24
#define ORE_DBGMSG(fmt, a...) \
 
25
        do { if (0) printk(fmt, ##a); } while (0)
 
26
#endif
 
27
 
 
28
/* u64 has problems with printk this will cast it to unsigned long long */
 
29
#define _LLU(x) (unsigned long long)(x)
 
30
 
 
31
#define ORE_DBGMSG2(M...) do {} while (0)
 
32
/* #define ORE_DBGMSG2 ORE_DBGMSG */
 
33
 
 
34
/* Calculate the component order in a stripe. eg the logical data unit
 
35
 * address within the stripe of @dev given the @par_dev of this stripe.
 
36
 */
 
37
static inline unsigned _dev_order(unsigned devs_in_group, unsigned mirrors_p1,
 
38
                                  unsigned par_dev, unsigned dev)
 
39
{
 
40
        unsigned first_dev = dev - dev % devs_in_group;
 
41
 
 
42
        dev -= first_dev;
 
43
        par_dev -= first_dev;
 
44
 
 
45
        if (devs_in_group == par_dev) /* The raid 0 case */
 
46
                return dev / mirrors_p1;
 
47
        /* raid4/5/6 case */
 
48
        return ((devs_in_group + dev - par_dev - mirrors_p1) % devs_in_group) /
 
49
               mirrors_p1;
 
50
}
 
51
 
 
52
/* ios_raid.c stuff needed by ios.c */
 
53
int _ore_post_alloc_raid_stuff(struct ore_io_state *ios);
 
54
void _ore_free_raid_stuff(struct ore_io_state *ios);
 
55
 
 
56
void _ore_add_sg_seg(struct ore_per_dev_state *per_dev, unsigned cur_len,
 
57
                 bool not_last);
 
58
int _ore_add_parity_unit(struct ore_io_state *ios, struct ore_striping_info *si,
 
59
                     struct ore_per_dev_state *per_dev, unsigned cur_len);
 
60
void _ore_add_stripe_page(struct __stripe_pages_2d *sp2d,
 
61
                       struct ore_striping_info *si, struct page *page);
 
62
static inline void _add_stripe_page(struct __stripe_pages_2d *sp2d,
 
63
                                struct ore_striping_info *si, struct page *page)
 
64
{
 
65
        if (!sp2d) /* Inline the fast path */
 
66
                return; /* Hay no raid stuff */
 
67
        _ore_add_stripe_page(sp2d, si, page);
 
68
}
 
69
 
 
70
/* ios.c stuff needed by ios_raid.c */
 
71
int  _ore_get_io_state(struct ore_layout *layout,
 
72
                        struct ore_components *oc, unsigned numdevs,
 
73
                        unsigned sgs_per_dev, unsigned num_par_pages,
 
74
                        struct ore_io_state **pios);
 
75
int _ore_add_stripe_unit(struct ore_io_state *ios,  unsigned *cur_pg,
 
76
                unsigned pgbase, struct page **pages,
 
77
                struct ore_per_dev_state *per_dev, int cur_len);
 
78
int _ore_read_mirror(struct ore_io_state *ios, unsigned cur_comp);
 
79
int ore_io_execute(struct ore_io_state *ios);