2011-05-22 20:50:20 +04:00
/*
* Data types and function declerations for interfacing with the
* pNFS standard object layout driver .
*
* Copyright ( C ) 2007 Panasas Inc . [ year of first publication ]
* All rights reserved .
*
* Benny Halevy < bhalevy @ panasas . com >
2014-10-19 20:38:58 +04:00
* Boaz Harrosh < ooo @ electrozaur . com >
2011-05-22 20:50:20 +04:00
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2
* See the file COPYING included with this distribution for more details .
*
* Redistribution and use in source and binary forms , with or without
* modification , are permitted provided that the following conditions
* are met :
*
* 1. Redistributions of source code must retain the above copyright
* notice , this list of conditions and the following disclaimer .
* 2. Redistributions in binary form must reproduce the above copyright
* notice , this list of conditions and the following disclaimer in the
* documentation and / or other materials provided with the distribution .
* 3. Neither the name of the Panasas company nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission .
*
* THIS SOFTWARE IS PROVIDED ` ` AS IS ' ' AND ANY EXPRESS OR IMPLIED
* WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED . IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR
* CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR
* BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT ( INCLUDING
* NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef _OBJLAYOUT_H
# define _OBJLAYOUT_H
# include <linux/nfs_fs.h>
# include <linux/pnfs_osd_xdr.h>
# include "../pnfs.h"
2011-05-22 20:51:48 +04:00
/*
* per - inode layout
*/
struct objlayout {
struct pnfs_layout_hdr pnfs_layout ;
2011-05-26 22:49:46 +04:00
2011-05-22 20:54:13 +04:00
/* for layout_commit */
enum osd_delta_space_valid_enum {
OBJ_DSU_INIT = 0 ,
OBJ_DSU_VALID ,
OBJ_DSU_INVALID ,
} delta_space_valid ;
s64 delta_space_used ; /* consumed by write ops */
2011-05-26 22:49:46 +04:00
/* for layout_return */
spinlock_t lock ;
struct list_head err_list ;
2011-05-22 20:51:48 +04:00
} ;
static inline struct objlayout *
OBJLAYOUT ( struct pnfs_layout_hdr * lo )
{
return container_of ( lo , struct objlayout , pnfs_layout ) ;
}
2011-05-22 20:52:19 +04:00
/*
* per - I / O operation state
* embedded in objects provider io_state data structure
*/
2011-11-01 02:03:35 +04:00
struct objlayout_io_res {
2011-11-01 01:47:32 +04:00
struct objlayout * objlay ;
2011-05-22 20:52:19 +04:00
void * rpcdata ;
int status ; /* res */
int committed ; /* res */
2011-05-26 22:49:46 +04:00
/* Error reporting (layout_return) */
struct list_head err_list ;
unsigned num_comps ;
/* Pointer to array of error descriptors of size num_comps.
* It should contain as many entries as devices in the osd_layout
* that participate in the I / O . It is up to the io_engine to allocate
* needed space and set num_comps .
*/
struct pnfs_osd_ioerr * ioerrs ;
2011-05-22 20:52:19 +04:00
} ;
2011-11-01 01:47:32 +04:00
static inline
2011-11-01 02:03:35 +04:00
void objlayout_init_ioerrs ( struct objlayout_io_res * oir , unsigned num_comps ,
2011-11-01 01:47:32 +04:00
struct pnfs_osd_ioerr * ioerrs , void * rpcdata ,
struct pnfs_layout_hdr * pnfs_layout_type )
{
oir - > objlay = OBJLAYOUT ( pnfs_layout_type ) ;
oir - > rpcdata = rpcdata ;
INIT_LIST_HEAD ( & oir - > err_list ) ;
oir - > num_comps = num_comps ;
oir - > ioerrs = ioerrs ;
}
2011-05-22 20:50:20 +04:00
/*
* Raid engine I / O API
*/
extern int objio_alloc_lseg ( struct pnfs_layout_segment * * outp ,
struct pnfs_layout_hdr * pnfslay ,
struct pnfs_layout_range * range ,
struct xdr_stream * xdr ,
gfp_t gfp_flags ) ;
extern void objio_free_lseg ( struct pnfs_layout_segment * lseg ) ;
2013-04-08 21:06:50 +04:00
/* objio_free_result will free these @oir structs received from
2011-11-01 02:03:35 +04:00
* objlayout_ { read , write } _done
*/
extern void objio_free_result ( struct objlayout_io_res * oir ) ;
2011-05-22 20:52:19 +04:00
2014-06-09 19:48:35 +04:00
extern int objio_read_pagelist ( struct nfs_pgio_header * rdata ) ;
extern int objio_write_pagelist ( struct nfs_pgio_header * wdata , int how ) ;
2011-05-22 20:52:19 +04:00
2011-05-26 22:45:34 +04:00
/*
* callback API
*/
2011-11-01 02:03:35 +04:00
extern void objlayout_io_set_result ( struct objlayout_io_res * oir ,
2011-05-26 22:49:46 +04:00
unsigned index , struct pnfs_osd_objid * pooid ,
int osd_error , u64 offset , u64 length , bool is_write ) ;
2011-05-22 20:54:13 +04:00
static inline void
2011-11-01 01:47:32 +04:00
objlayout_add_delta_space_used ( struct objlayout * objlay , s64 space_used )
2011-05-22 20:54:13 +04:00
{
/* If one of the I/Os errored out and the delta_space_used was
* invalid we render the complete report as invalid . Protocol mandate
* the DSU be accurate or not reported .
*/
spin_lock ( & objlay - > lock ) ;
if ( objlay - > delta_space_valid ! = OBJ_DSU_INVALID ) {
objlay - > delta_space_valid = OBJ_DSU_VALID ;
objlay - > delta_space_used + = space_used ;
}
spin_unlock ( & objlay - > lock ) ;
}
2011-11-01 02:03:35 +04:00
extern void objlayout_read_done ( struct objlayout_io_res * oir ,
2011-05-22 20:52:19 +04:00
ssize_t status , bool sync ) ;
2011-11-01 02:03:35 +04:00
extern void objlayout_write_done ( struct objlayout_io_res * oir ,
2011-05-22 20:52:19 +04:00
ssize_t status , bool sync ) ;
2011-05-22 20:50:20 +04:00
/*
* exported generic objects function vectors
*/
2011-05-22 20:51:48 +04:00
extern struct pnfs_layout_hdr * objlayout_alloc_layout_hdr ( struct inode * , gfp_t gfp_flags ) ;
extern void objlayout_free_layout_hdr ( struct pnfs_layout_hdr * ) ;
2011-05-22 20:50:20 +04:00
extern struct pnfs_layout_segment * objlayout_alloc_lseg (
struct pnfs_layout_hdr * ,
struct nfs4_layoutget_res * ,
gfp_t gfp_flags ) ;
extern void objlayout_free_lseg ( struct pnfs_layout_segment * ) ;
2011-05-22 20:52:19 +04:00
extern enum pnfs_try_status objlayout_read_pagelist (
2014-06-09 19:48:35 +04:00
struct nfs_pgio_header * ) ;
2011-05-22 20:52:19 +04:00
extern enum pnfs_try_status objlayout_write_pagelist (
2014-06-09 19:48:35 +04:00
struct nfs_pgio_header * ,
2011-05-22 20:52:19 +04:00
int how ) ;
2011-05-22 20:54:13 +04:00
extern void objlayout_encode_layoutcommit (
struct pnfs_layout_hdr * ,
struct xdr_stream * ,
const struct nfs4_layoutcommit_args * ) ;
2011-05-26 22:49:46 +04:00
extern void objlayout_encode_layoutreturn (
struct xdr_stream * ,
const struct nfs4_layoutreturn_args * ) ;
2012-03-20 07:47:58 +04:00
extern int objlayout_autologin ( struct pnfs_osd_deviceaddr * deviceaddr ) ;
2011-05-22 20:50:20 +04:00
# endif /* _OBJLAYOUT_H */