~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/fs/nfs/blocklayout/blocklayout.h

Version: ~ [ linux-5.2-rc6 ] ~ [ linux-5.1.15 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.56 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.130 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.183 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.183 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.69 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ linux-2.6.39.4 ] ~ [ linux-2.6.38.8 ] ~ [ linux-2.6.37.6 ] ~ [ linux-2.6.36.4 ] ~ [ linux-2.6.35.14 ] ~ [ linux-2.6.34.15 ] ~ [ linux-2.6.33.20 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  *  linux/fs/nfs/blocklayout/blocklayout.h
  3  *
  4  *  Module for the NFSv4.1 pNFS block layout driver.
  5  *
  6  *  Copyright (c) 2006 The Regents of the University of Michigan.
  7  *  All rights reserved.
  8  *
  9  *  Andy Adamson <andros@citi.umich.edu>
 10  *  Fred Isaman <iisaman@umich.edu>
 11  *
 12  * permission is granted to use, copy, create derivative works and
 13  * redistribute this software and such derivative works for any purpose,
 14  * so long as the name of the university of michigan is not used in
 15  * any advertising or publicity pertaining to the use or distribution
 16  * of this software without specific, written prior authorization.  if
 17  * the above copyright notice or any other identification of the
 18  * university of michigan is included in any copy of any portion of
 19  * this software, then the disclaimer below must also be included.
 20  *
 21  * this software is provided as is, without representation from the
 22  * university of michigan as to its fitness for any purpose, and without
 23  * warranty by the university of michigan of any kind, either express
 24  * or implied, including without limitation the implied warranties of
 25  * merchantability and fitness for a particular purpose.  the regents
 26  * of the university of michigan shall not be liable for any damages,
 27  * including special, indirect, incidental, or consequential damages,
 28  * with respect to any claim arising out or in connection with the use
 29  * of the software, even if it has been or is hereafter advised of the
 30  * possibility of such damages.
 31  */
 32 #ifndef FS_NFS_NFS4BLOCKLAYOUT_H
 33 #define FS_NFS_NFS4BLOCKLAYOUT_H
 34 
 35 #include <linux/device-mapper.h>
 36 #include <linux/nfs_fs.h>
 37 #include <linux/sunrpc/rpc_pipe_fs.h>
 38 
 39 #include "../nfs4_fs.h"
 40 #include "../pnfs.h"
 41 #include "../netns.h"
 42 
 43 #define PAGE_CACHE_SECTORS (PAGE_SIZE >> SECTOR_SHIFT)
 44 #define PAGE_CACHE_SECTOR_SHIFT (PAGE_SHIFT - SECTOR_SHIFT)
 45 #define SECTOR_SIZE (1 << SECTOR_SHIFT)
 46 
 47 struct pnfs_block_dev;
 48 
 49 #define PNFS_BLOCK_MAX_UUIDS    4
 50 #define PNFS_BLOCK_MAX_DEVICES  64
 51 
 52 /*
 53  * Random upper cap for the uuid length to avoid unbounded allocation.
 54  * Not actually limited by the protocol.
 55  */
 56 #define PNFS_BLOCK_UUID_LEN     128
 57 
 58 struct pnfs_block_volume {
 59         enum pnfs_block_volume_type     type;
 60         union {
 61                 struct {
 62                         int             len;
 63                         int             nr_sigs;
 64                         struct {
 65                                 u64             offset;
 66                                 u32             sig_len;
 67                                 u8              sig[PNFS_BLOCK_UUID_LEN];
 68                         } sigs[PNFS_BLOCK_MAX_UUIDS];
 69                 } simple;
 70                 struct {
 71                         u64             start;
 72                         u64             len;
 73                         u32             volume;
 74                 } slice;
 75                 struct {
 76                         u32             volumes_count;
 77                         u32             volumes[PNFS_BLOCK_MAX_DEVICES];
 78                 } concat;
 79                 struct {
 80                         u64             chunk_size;
 81                         u32             volumes_count;
 82                         u32             volumes[PNFS_BLOCK_MAX_DEVICES];
 83                 } stripe;
 84                 struct {
 85                         enum scsi_code_set              code_set;
 86                         enum scsi_designator_type       designator_type;
 87                         int                             designator_len;
 88                         u8                              designator[256];
 89                         u64                             pr_key;
 90                 } scsi;
 91         };
 92 };
 93 
 94 struct pnfs_block_dev_map {
 95         sector_t                        start;
 96         sector_t                        len;
 97 
 98         sector_t                        disk_offset;
 99         struct block_device             *bdev;
100 };
101 
102 struct pnfs_block_dev {
103         struct nfs4_deviceid_node       node;
104 
105         u64                             start;
106         u64                             len;
107 
108         u32                             nr_children;
109         struct pnfs_block_dev           *children;
110         u64                             chunk_size;
111 
112         struct block_device             *bdev;
113         u64                             disk_offset;
114 
115         u64                             pr_key;
116         bool                            pr_registered;
117 
118         bool (*map)(struct pnfs_block_dev *dev, u64 offset,
119                         struct pnfs_block_dev_map *map);
120 };
121 
122 /* sector_t fields are all in 512-byte sectors */
123 struct pnfs_block_extent {
124         union {
125                 struct rb_node  be_node;
126                 struct list_head be_list;
127         };
128         struct nfs4_deviceid_node *be_device;
129         sector_t        be_f_offset;    /* the starting offset in the file */
130         sector_t        be_length;      /* the size of the extent */
131         sector_t        be_v_offset;    /* the starting offset in the volume */
132         enum pnfs_block_extent_state be_state;  /* the state of this extent */
133 #define EXTENT_WRITTEN          1
134 #define EXTENT_COMMITTING       2
135         unsigned int    be_tag;
136 };
137 
138 struct pnfs_block_layout {
139         struct pnfs_layout_hdr  bl_layout;
140         struct rb_root          bl_ext_rw;
141         struct rb_root          bl_ext_ro;
142         spinlock_t              bl_ext_lock;   /* Protects list manipulation */
143         bool                    bl_scsi_layout;
144 };
145 
146 static inline struct pnfs_block_layout *
147 BLK_LO2EXT(struct pnfs_layout_hdr *lo)
148 {
149         return container_of(lo, struct pnfs_block_layout, bl_layout);
150 }
151 
152 static inline struct pnfs_block_layout *
153 BLK_LSEG2EXT(struct pnfs_layout_segment *lseg)
154 {
155         return BLK_LO2EXT(lseg->pls_layout);
156 }
157 
158 struct bl_pipe_msg {
159         struct rpc_pipe_msg msg;
160         wait_queue_head_t *bl_wq;
161 };
162 
163 struct bl_msg_hdr {
164         u8  type;
165         u16 totallen; /* length of entire message, including hdr itself */
166 };
167 
168 #define BL_DEVICE_UMOUNT               0x0 /* Umount--delete devices */
169 #define BL_DEVICE_MOUNT                0x1 /* Mount--create devices*/
170 #define BL_DEVICE_REQUEST_INIT         0x0 /* Start request */
171 #define BL_DEVICE_REQUEST_PROC         0x1 /* User level process succeeds */
172 #define BL_DEVICE_REQUEST_ERR          0x2 /* User level process fails */
173 
174 /* dev.c */
175 struct nfs4_deviceid_node *bl_alloc_deviceid_node(struct nfs_server *server,
176                 struct pnfs_device *pdev, gfp_t gfp_mask);
177 void bl_free_deviceid_node(struct nfs4_deviceid_node *d);
178 
179 /* extent_tree.c */
180 int ext_tree_insert(struct pnfs_block_layout *bl,
181                 struct pnfs_block_extent *new);
182 int ext_tree_remove(struct pnfs_block_layout *bl, bool rw, sector_t start,
183                 sector_t end);
184 int ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
185                 sector_t len);
186 bool ext_tree_lookup(struct pnfs_block_layout *bl, sector_t isect,
187                 struct pnfs_block_extent *ret, bool rw);
188 int ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg);
189 void ext_tree_mark_committed(struct nfs4_layoutcommit_args *arg, int status);
190 
191 /* rpc_pipefs.c */
192 dev_t bl_resolve_deviceid(struct nfs_server *server,
193                 struct pnfs_block_volume *b, gfp_t gfp_mask);
194 int __init bl_init_pipefs(void);
195 void bl_cleanup_pipefs(void);
196 
197 #endif /* FS_NFS_NFS4BLOCKLAYOUT_H */
198 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp