2011-07-31 08:52:39 +08:00
|
|
|
/*
|
|
|
|
* linux/fs/nfs/blocklayout/blocklayout.h
|
|
|
|
*
|
|
|
|
* Module for the NFSv4.1 pNFS block layout driver.
|
|
|
|
*
|
|
|
|
* Copyright (c) 2006 The Regents of the University of Michigan.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* Andy Adamson <andros@citi.umich.edu>
|
|
|
|
* Fred Isaman <iisaman@umich.edu>
|
|
|
|
*
|
|
|
|
* permission is granted to use, copy, create derivative works and
|
|
|
|
* redistribute this software and such derivative works for any purpose,
|
|
|
|
* so long as the name of the university of michigan is not used in
|
|
|
|
* any advertising or publicity pertaining to the use or distribution
|
|
|
|
* of this software without specific, written prior authorization. if
|
|
|
|
* the above copyright notice or any other identification of the
|
|
|
|
* university of michigan is included in any copy of any portion of
|
|
|
|
* this software, then the disclaimer below must also be included.
|
|
|
|
*
|
|
|
|
* this software is provided as is, without representation from the
|
|
|
|
* university of michigan as to its fitness for any purpose, and without
|
|
|
|
* warranty by the university of michigan of any kind, either express
|
|
|
|
* or implied, including without limitation the implied warranties of
|
|
|
|
* merchantability and fitness for a particular purpose. the regents
|
|
|
|
* of the university of michigan shall not be liable for any damages,
|
|
|
|
* including special, indirect, incidental, or consequential damages,
|
|
|
|
* with respect to any claim arising out or in connection with the use
|
|
|
|
* of the software, even if it has been or is hereafter advised of the
|
|
|
|
* possibility of such damages.
|
|
|
|
*/
|
|
|
|
#ifndef FS_NFS_NFS4BLOCKLAYOUT_H
|
|
|
|
#define FS_NFS_NFS4BLOCKLAYOUT_H
|
|
|
|
|
|
|
|
#include <linux/device-mapper.h>
|
|
|
|
#include <linux/nfs_fs.h>
|
2011-07-31 08:52:42 +08:00
|
|
|
#include <linux/sunrpc/rpc_pipe_fs.h>
|
|
|
|
|
2013-11-14 01:29:08 +08:00
|
|
|
#include "../nfs4_fs.h"
|
2011-07-31 08:52:39 +08:00
|
|
|
#include "../pnfs.h"
|
2012-01-10 21:04:24 +08:00
|
|
|
#include "../netns.h"
|
2011-07-31 08:52:39 +08:00
|
|
|
|
mm, fs: get rid of PAGE_CACHE_* and page_cache_{get,release} macros
PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} macros were introduced *long* time
ago with promise that one day it will be possible to implement page
cache with bigger chunks than PAGE_SIZE.
This promise never materialized. And unlikely will.
We have many places where PAGE_CACHE_SIZE assumed to be equal to
PAGE_SIZE. And it's constant source of confusion on whether
PAGE_CACHE_* or PAGE_* constant should be used in a particular case,
especially on the border between fs and mm.
Global switching to PAGE_CACHE_SIZE != PAGE_SIZE would cause to much
breakage to be doable.
Let's stop pretending that pages in page cache are special. They are
not.
The changes are pretty straight-forward:
- <foo> << (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>;
- <foo> >> (PAGE_CACHE_SHIFT - PAGE_SHIFT) -> <foo>;
- PAGE_CACHE_{SIZE,SHIFT,MASK,ALIGN} -> PAGE_{SIZE,SHIFT,MASK,ALIGN};
- page_cache_get() -> get_page();
- page_cache_release() -> put_page();
This patch contains automated changes generated with coccinelle using
script below. For some reason, coccinelle doesn't patch header files.
I've called spatch for them manually.
The only adjustment after coccinelle is revert of changes to
PAGE_CAHCE_ALIGN definition: we are going to drop it later.
There are few places in the code where coccinelle didn't reach. I'll
fix them manually in a separate patch. Comments and documentation also
will be addressed with the separate patch.
virtual patch
@@
expression E;
@@
- E << (PAGE_CACHE_SHIFT - PAGE_SHIFT)
+ E
@@
expression E;
@@
- E >> (PAGE_CACHE_SHIFT - PAGE_SHIFT)
+ E
@@
@@
- PAGE_CACHE_SHIFT
+ PAGE_SHIFT
@@
@@
- PAGE_CACHE_SIZE
+ PAGE_SIZE
@@
@@
- PAGE_CACHE_MASK
+ PAGE_MASK
@@
expression E;
@@
- PAGE_CACHE_ALIGN(E)
+ PAGE_ALIGN(E)
@@
expression E;
@@
- page_cache_get(E)
+ get_page(E)
@@
expression E;
@@
- page_cache_release(E)
+ put_page(E)
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
Acked-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2016-04-01 20:29:47 +08:00
|
|
|
#define PAGE_CACHE_SECTORS (PAGE_SIZE >> SECTOR_SHIFT)
|
|
|
|
#define PAGE_CACHE_SECTOR_SHIFT (PAGE_SHIFT - SECTOR_SHIFT)
|
2012-08-24 00:27:51 +08:00
|
|
|
#define SECTOR_SIZE (1 << SECTOR_SHIFT)
|
2011-07-31 08:52:49 +08:00
|
|
|
|
2014-09-11 08:37:27 +08:00
|
|
|
struct pnfs_block_dev;
|
|
|
|
|
|
|
|
#define PNFS_BLOCK_MAX_UUIDS 4
|
|
|
|
#define PNFS_BLOCK_MAX_DEVICES 64
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Random upper cap for the uuid length to avoid unbounded allocation.
|
|
|
|
* Not actually limited by the protocol.
|
|
|
|
*/
|
|
|
|
#define PNFS_BLOCK_UUID_LEN 128
|
|
|
|
|
|
|
|
struct pnfs_block_volume {
|
|
|
|
enum pnfs_block_volume_type type;
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
int len;
|
|
|
|
int nr_sigs;
|
|
|
|
struct {
|
|
|
|
u64 offset;
|
|
|
|
u32 sig_len;
|
|
|
|
u8 sig[PNFS_BLOCK_UUID_LEN];
|
|
|
|
} sigs[PNFS_BLOCK_MAX_UUIDS];
|
|
|
|
} simple;
|
|
|
|
struct {
|
|
|
|
u64 start;
|
|
|
|
u64 len;
|
|
|
|
u32 volume;
|
|
|
|
} slice;
|
|
|
|
struct {
|
|
|
|
u32 volumes_count;
|
|
|
|
u32 volumes[PNFS_BLOCK_MAX_DEVICES];
|
|
|
|
} concat;
|
|
|
|
struct {
|
|
|
|
u64 chunk_size;
|
|
|
|
u32 volumes_count;
|
|
|
|
u32 volumes[PNFS_BLOCK_MAX_DEVICES];
|
|
|
|
} stripe;
|
2016-03-05 03:46:15 +08:00
|
|
|
struct {
|
|
|
|
enum scsi_code_set code_set;
|
|
|
|
enum scsi_designator_type designator_type;
|
|
|
|
int designator_len;
|
|
|
|
u8 designator[256];
|
|
|
|
u64 pr_key;
|
|
|
|
} scsi;
|
2014-09-11 08:37:27 +08:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
struct pnfs_block_dev_map {
|
2018-01-25 22:36:25 +08:00
|
|
|
u64 start;
|
|
|
|
u64 len;
|
|
|
|
u64 disk_offset;
|
2014-09-11 08:37:27 +08:00
|
|
|
struct block_device *bdev;
|
|
|
|
};
|
|
|
|
|
2011-07-31 08:52:42 +08:00
|
|
|
struct pnfs_block_dev {
|
2014-09-11 08:37:27 +08:00
|
|
|
struct nfs4_deviceid_node node;
|
|
|
|
|
|
|
|
u64 start;
|
|
|
|
u64 len;
|
|
|
|
|
|
|
|
u32 nr_children;
|
|
|
|
struct pnfs_block_dev *children;
|
|
|
|
u64 chunk_size;
|
|
|
|
|
|
|
|
struct block_device *bdev;
|
|
|
|
u64 disk_offset;
|
|
|
|
|
2016-03-05 03:46:15 +08:00
|
|
|
u64 pr_key;
|
|
|
|
bool pr_registered;
|
|
|
|
|
2014-09-11 08:37:27 +08:00
|
|
|
bool (*map)(struct pnfs_block_dev *dev, u64 offset,
|
|
|
|
struct pnfs_block_dev_map *map);
|
2011-07-31 08:52:42 +08:00
|
|
|
};
|
|
|
|
|
2011-07-31 08:52:39 +08:00
|
|
|
/* sector_t fields are all in 512-byte sectors */
|
|
|
|
struct pnfs_block_extent {
|
2014-09-10 23:23:34 +08:00
|
|
|
union {
|
|
|
|
struct rb_node be_node;
|
|
|
|
struct list_head be_list;
|
|
|
|
};
|
2014-09-03 12:28:00 +08:00
|
|
|
struct nfs4_deviceid_node *be_device;
|
2011-07-31 08:52:39 +08:00
|
|
|
sector_t be_f_offset; /* the starting offset in the file */
|
|
|
|
sector_t be_length; /* the size of the extent */
|
|
|
|
sector_t be_v_offset; /* the starting offset in the volume */
|
2015-08-18 00:41:01 +08:00
|
|
|
enum pnfs_block_extent_state be_state; /* the state of this extent */
|
2014-09-10 23:23:34 +08:00
|
|
|
#define EXTENT_WRITTEN 1
|
|
|
|
#define EXTENT_COMMITTING 2
|
|
|
|
unsigned int be_tag;
|
2011-07-31 08:52:51 +08:00
|
|
|
};
|
|
|
|
|
2011-07-31 08:52:39 +08:00
|
|
|
struct pnfs_block_layout {
|
2014-09-10 23:23:34 +08:00
|
|
|
struct pnfs_layout_hdr bl_layout;
|
|
|
|
struct rb_root bl_ext_rw;
|
|
|
|
struct rb_root bl_ext_ro;
|
2011-07-31 08:52:39 +08:00
|
|
|
spinlock_t bl_ext_lock; /* Protects list manipulation */
|
2016-03-05 03:46:15 +08:00
|
|
|
bool bl_scsi_layout;
|
2016-08-23 02:11:16 +08:00
|
|
|
u64 bl_lwb;
|
2011-07-31 08:52:39 +08:00
|
|
|
};
|
|
|
|
|
2011-07-31 08:52:46 +08:00
|
|
|
static inline struct pnfs_block_layout *
|
|
|
|
BLK_LO2EXT(struct pnfs_layout_hdr *lo)
|
2011-07-31 08:52:39 +08:00
|
|
|
{
|
|
|
|
return container_of(lo, struct pnfs_block_layout, bl_layout);
|
|
|
|
}
|
|
|
|
|
2011-07-31 08:52:44 +08:00
|
|
|
static inline struct pnfs_block_layout *
|
|
|
|
BLK_LSEG2EXT(struct pnfs_layout_segment *lseg)
|
|
|
|
{
|
|
|
|
return BLK_LO2EXT(lseg->pls_layout);
|
|
|
|
}
|
|
|
|
|
2012-03-11 22:20:31 +08:00
|
|
|
struct bl_pipe_msg {
|
|
|
|
struct rpc_pipe_msg msg;
|
|
|
|
wait_queue_head_t *bl_wq;
|
|
|
|
};
|
|
|
|
|
2011-07-31 08:52:42 +08:00
|
|
|
struct bl_msg_hdr {
|
|
|
|
u8 type;
|
|
|
|
u16 totallen; /* length of entire message, including hdr itself */
|
|
|
|
};
|
|
|
|
|
|
|
|
#define BL_DEVICE_UMOUNT 0x0 /* Umount--delete devices */
|
|
|
|
#define BL_DEVICE_MOUNT 0x1 /* Mount--create devices*/
|
|
|
|
#define BL_DEVICE_REQUEST_INIT 0x0 /* Start request */
|
|
|
|
#define BL_DEVICE_REQUEST_PROC 0x1 /* User level process succeeds */
|
|
|
|
#define BL_DEVICE_REQUEST_ERR 0x2 /* User level process fails */
|
|
|
|
|
2014-09-11 08:37:27 +08:00
|
|
|
/* dev.c */
|
|
|
|
struct nfs4_deviceid_node *bl_alloc_deviceid_node(struct nfs_server *server,
|
|
|
|
struct pnfs_device *pdev, gfp_t gfp_mask);
|
|
|
|
void bl_free_deviceid_node(struct nfs4_deviceid_node *d);
|
|
|
|
|
2014-09-10 23:23:34 +08:00
|
|
|
/* extent_tree.c */
|
|
|
|
int ext_tree_insert(struct pnfs_block_layout *bl,
|
|
|
|
struct pnfs_block_extent *new);
|
|
|
|
int ext_tree_remove(struct pnfs_block_layout *bl, bool rw, sector_t start,
|
|
|
|
sector_t end);
|
|
|
|
int ext_tree_mark_written(struct pnfs_block_layout *bl, sector_t start,
|
2016-08-23 02:11:16 +08:00
|
|
|
sector_t len, u64 lwb);
|
2014-09-10 23:23:34 +08:00
|
|
|
bool ext_tree_lookup(struct pnfs_block_layout *bl, sector_t isect,
|
|
|
|
struct pnfs_block_extent *ret, bool rw);
|
2014-09-11 08:36:30 +08:00
|
|
|
int ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg);
|
|
|
|
void ext_tree_mark_committed(struct nfs4_layoutcommit_args *arg, int status);
|
2011-07-31 08:52:45 +08:00
|
|
|
|
2014-09-11 08:37:26 +08:00
|
|
|
/* rpc_pipefs.c */
|
2014-09-11 08:37:27 +08:00
|
|
|
dev_t bl_resolve_deviceid(struct nfs_server *server,
|
|
|
|
struct pnfs_block_volume *b, gfp_t gfp_mask);
|
2014-09-11 08:37:26 +08:00
|
|
|
int __init bl_init_pipefs(void);
|
2016-03-05 03:46:15 +08:00
|
|
|
void bl_cleanup_pipefs(void);
|
2014-09-11 08:37:26 +08:00
|
|
|
|
2011-07-31 08:52:39 +08:00
|
|
|
#endif /* FS_NFS_NFS4BLOCKLAYOUT_H */
|