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

« back to all changes in this revision

Viewing changes to fs/nfs/nfs4filelayout.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
 *  NFSv4 file layout driver data structures.
 
3
 *
 
4
 *  Copyright (c) 2002
 
5
 *  The Regents of the University of Michigan
 
6
 *  All Rights Reserved
 
7
 *
 
8
 *  Dean Hildebrand <dhildebz@umich.edu>
 
9
 *
 
10
 *  Permission is granted to use, copy, create derivative works, and
 
11
 *  redistribute this software and such derivative works for any purpose,
 
12
 *  so long as the name of the University of Michigan is not used in
 
13
 *  any advertising or publicity pertaining to the use or distribution
 
14
 *  of this software without specific, written prior authorization. If
 
15
 *  the above copyright notice or any other identification of the
 
16
 *  University of Michigan is included in any copy of any portion of
 
17
 *  this software, then the disclaimer below must also be included.
 
18
 *
 
19
 *  This software is provided as is, without representation or warranty
 
20
 *  of any kind either express or implied, including without limitation
 
21
 *  the implied warranties of merchantability, fitness for a particular
 
22
 *  purpose, or noninfringement.  The Regents of the University of
 
23
 *  Michigan shall not be liable for any damages, including special,
 
24
 *  indirect, incidental, or consequential damages, with respect to any
 
25
 *  claim arising out of or in connection with the use of the software,
 
26
 *  even if it has been or is hereafter advised of the possibility of
 
27
 *  such damages.
 
28
 */
 
29
 
 
30
#ifndef FS_NFS_NFS4FILELAYOUT_H
 
31
#define FS_NFS_NFS4FILELAYOUT_H
 
32
 
 
33
#include "pnfs.h"
 
34
 
 
35
/*
 
36
 * Field testing shows we need to support up to 4096 stripe indices.
 
37
 * We store each index as a u8 (u32 on the wire) to keep the memory footprint
 
38
 * reasonable. This in turn means we support a maximum of 256
 
39
 * RFC 5661 multipath_list4 structures.
 
40
 */
 
41
#define NFS4_PNFS_MAX_STRIPE_CNT 4096
 
42
#define NFS4_PNFS_MAX_MULTI_CNT  256 /* 256 fit into a u8 stripe_index */
 
43
 
 
44
enum stripetype4 {
 
45
        STRIPE_SPARSE = 1,
 
46
        STRIPE_DENSE = 2
 
47
};
 
48
 
 
49
/* Individual ip address */
 
50
struct nfs4_pnfs_ds_addr {
 
51
        struct sockaddr_storage da_addr;
 
52
        size_t                  da_addrlen;
 
53
        struct list_head        da_node;  /* nfs4_pnfs_dev_hlist dev_dslist */
 
54
        char                    *da_remotestr;  /* human readable addr+port */
 
55
};
 
56
 
 
57
struct nfs4_pnfs_ds {
 
58
        struct list_head        ds_node;  /* nfs4_pnfs_dev_hlist dev_dslist */
 
59
        char                    *ds_remotestr;  /* comma sep list of addrs */
 
60
        struct list_head        ds_addrs;
 
61
        struct nfs_client       *ds_clp;
 
62
        atomic_t                ds_count;
 
63
};
 
64
 
 
65
/* nfs4_file_layout_dsaddr flags */
 
66
#define NFS4_DEVICE_ID_NEG_ENTRY        0x00000001
 
67
 
 
68
struct nfs4_file_layout_dsaddr {
 
69
        struct nfs4_deviceid_node       id_node;
 
70
        unsigned long                   flags;
 
71
        u32                             stripe_count;
 
72
        u8                              *stripe_indices;
 
73
        u32                             ds_num;
 
74
        struct nfs4_pnfs_ds             *ds_list[1];
 
75
};
 
76
 
 
77
struct nfs4_filelayout_segment {
 
78
        struct pnfs_layout_segment generic_hdr;
 
79
        u32 stripe_type;
 
80
        u32 commit_through_mds;
 
81
        u32 stripe_unit;
 
82
        u32 first_stripe_index;
 
83
        u64 pattern_offset;
 
84
        struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */
 
85
        unsigned int num_fh;
 
86
        struct nfs_fh **fh_array;
 
87
        struct list_head *commit_buckets; /* Sort commits to ds */
 
88
        int number_of_buckets;
 
89
};
 
90
 
 
91
static inline struct nfs4_filelayout_segment *
 
92
FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg)
 
93
{
 
94
        return container_of(lseg,
 
95
                            struct nfs4_filelayout_segment,
 
96
                            generic_hdr);
 
97
}
 
98
 
 
99
static inline struct nfs4_deviceid_node *
 
100
FILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg)
 
101
{
 
102
        return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node;
 
103
}
 
104
 
 
105
extern struct nfs_fh *
 
106
nfs4_fl_select_ds_fh(struct pnfs_layout_segment *lseg, u32 j);
 
107
 
 
108
extern void print_ds(struct nfs4_pnfs_ds *ds);
 
109
u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset);
 
110
u32 nfs4_fl_calc_ds_index(struct pnfs_layout_segment *lseg, u32 j);
 
111
struct nfs4_pnfs_ds *nfs4_fl_prepare_ds(struct pnfs_layout_segment *lseg,
 
112
                                        u32 ds_idx);
 
113
extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
 
114
extern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
 
115
struct nfs4_file_layout_dsaddr *
 
116
get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id, gfp_t gfp_flags);
 
117
 
 
118
#endif /* FS_NFS_NFS4FILELAYOUT_H */