2018-06-06 05:42:14 +03:00
// SPDX-License-Identifier: GPL-2.0
2005-04-17 02:20:36 +04:00
/*
* Copyright ( c ) 2000 - 2001 Silicon Graphics , Inc . All Rights Reserved .
*/
# ifndef __XFS_ITABLE_H__
# define __XFS_ITABLE_H__
2019-07-02 19:39:40 +03:00
/* In-memory representation of a userspace request for batch inode data. */
struct xfs_ibulk {
struct xfs_mount * mp ;
2021-01-21 16:19:58 +03:00
struct user_namespace * mnt_userns ;
2019-07-02 19:39:40 +03:00
void __user * ubuffer ; /* user output buffer */
xfs_ino_t startino ; /* start with this inode */
unsigned int icount ; /* number of elements in ubuffer */
unsigned int ocount ; /* number of records returned */
2019-07-04 06:36:28 +03:00
unsigned int flags ; /* see XFS_IBULK_FLAG_* */
2019-07-02 19:39:40 +03:00
} ;
2019-07-04 06:36:28 +03:00
/* Only iterate within the same AG as startino */
2022-03-09 15:34:04 +03:00
# define XFS_IBULK_SAME_AG (1U << 0)
2019-07-04 06:36:28 +03:00
2022-03-09 15:58:37 +03:00
/* Fill out the bs_extents64 field if set. */
# define XFS_IBULK_NREXT64 (1U << 1)
2005-04-17 02:20:36 +04:00
/*
2019-07-02 19:39:40 +03:00
* Advance the user buffer pointer by one record of the given size . If the
* buffer is now full , return the appropriate error code .
2005-04-17 02:20:36 +04:00
*/
2019-07-02 19:39:40 +03:00
static inline int
xfs_ibulk_advance (
struct xfs_ibulk * breq ,
size_t bytes )
{
char __user * b = breq - > ubuffer ;
breq - > ubuffer = b + bytes ;
breq - > ocount + + ;
2019-08-29 00:37:57 +03:00
return breq - > ocount = = breq - > icount ? - ECANCELED : 0 ;
2019-07-02 19:39:40 +03:00
}
2005-04-17 02:20:36 +04:00
/*
* Return stat information in bulk ( by - inode ) for the filesystem .
*/
2007-07-11 05:10:19 +04:00
2019-08-29 00:37:57 +03:00
/*
* Return codes for the formatter function are 0 to continue iterating , and
* non - zero to stop iterating . Any non - zero value will be passed up to the
* bulkstat / inumbers caller . The special value - ECANCELED can be used to stop
* iteration , as neither bulkstat nor inumbers will ever generate that error
* code on their own .
*/
2019-07-02 19:39:40 +03:00
typedef int ( * bulkstat_one_fmt_pf ) ( struct xfs_ibulk * breq ,
2019-07-04 06:36:26 +03:00
const struct xfs_bulkstat * bstat ) ;
2008-11-26 06:20:11 +03:00
2019-07-02 19:39:40 +03:00
int xfs_bulkstat_one ( struct xfs_ibulk * breq , bulkstat_one_fmt_pf formatter ) ;
int xfs_bulkstat ( struct xfs_ibulk * breq , bulkstat_one_fmt_pf formatter ) ;
2019-07-04 06:36:26 +03:00
void xfs_bulkstat_to_bstat ( struct xfs_mount * mp , struct xfs_bstat * bs1 ,
const struct xfs_bulkstat * bstat ) ;
2005-04-17 02:20:36 +04:00
2019-07-02 19:39:43 +03:00
typedef int ( * inumbers_fmt_pf ) ( struct xfs_ibulk * breq ,
2019-07-04 06:36:27 +03:00
const struct xfs_inumbers * igrp ) ;
2007-07-11 05:10:19 +04:00
2019-07-02 19:39:43 +03:00
int xfs_inumbers ( struct xfs_ibulk * breq , inumbers_fmt_pf formatter ) ;
2019-07-04 06:36:27 +03:00
void xfs_inumbers_to_inogrp ( struct xfs_inogrp * ig1 ,
const struct xfs_inumbers * ig ) ;
2005-04-17 02:20:36 +04:00
# endif /* __XFS_ITABLE_H__ */