xref: /openbmc/linux/fs/gfs2/rgrp.h (revision b181f7029bd71238ac2754ce7052dffd69432085)
17336d0e6SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2b3b94faaSDavid Teigland /*
3b3b94faaSDavid Teigland  * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
4fe6c991cSBob Peterson  * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
5b3b94faaSDavid Teigland  */
6b3b94faaSDavid Teigland 
7b3b94faaSDavid Teigland #ifndef __RGRP_DOT_H__
8b3b94faaSDavid Teigland #define __RGRP_DOT_H__
9b3b94faaSDavid Teigland 
105a0e3ad6STejun Heo #include <linux/slab.h>
1166fc061bSSteven Whitehouse #include <linux/uaccess.h>
125a0e3ad6STejun Heo 
138e2e0047SBob Peterson /* Since each block in the file system is represented by two bits in the
148e2e0047SBob Peterson  * bitmap, one 64-bit word in the bitmap will represent 32 blocks.
158e2e0047SBob Peterson  * By reserving 32 blocks at a time, we can optimize / shortcut how we search
168e2e0047SBob Peterson  * through the bitmaps by looking a word at a time.
178e2e0047SBob Peterson  */
18ad899458SAndreas Gruenbacher #define RGRP_RSRV_MINBLKS 32
191a855033SBob Peterson #define RGRP_RSRV_ADDBLKS 64
208e2e0047SBob Peterson 
21f2f7ba52SSteven Whitehouse struct gfs2_rgrpd;
22f2f7ba52SSteven Whitehouse struct gfs2_sbd;
23f2f7ba52SSteven Whitehouse struct gfs2_holder;
24f2f7ba52SSteven Whitehouse 
25*d312fbf6SAndreas Gruenbacher void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd);
26b3b94faaSDavid Teigland 
27*d312fbf6SAndreas Gruenbacher struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk, bool exact);
28*d312fbf6SAndreas Gruenbacher struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp);
29*d312fbf6SAndreas Gruenbacher struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd);
30b3b94faaSDavid Teigland 
31*d312fbf6SAndreas Gruenbacher void gfs2_clear_rgrpd(struct gfs2_sbd *sdp);
32*d312fbf6SAndreas Gruenbacher int gfs2_rindex_update(struct gfs2_sbd *sdp);
33*d312fbf6SAndreas Gruenbacher void gfs2_free_clones(struct gfs2_rgrpd *rgd);
34*d312fbf6SAndreas Gruenbacher int gfs2_rgrp_go_instantiate(struct gfs2_glock *gl);
35*d312fbf6SAndreas Gruenbacher void gfs2_rgrp_brelse(struct gfs2_rgrpd *rgd);
36b3b94faaSDavid Teigland 
37*d312fbf6SAndreas Gruenbacher struct gfs2_alloc *gfs2_alloc_get(struct gfs2_inode *ip);
388e2e0047SBob Peterson 
399dbe9610SSteven Whitehouse #define GFS2_AF_ORLOV 1
40*d312fbf6SAndreas Gruenbacher int gfs2_inplace_reserve(struct gfs2_inode *ip,
4125435e5eSAbhi Das 			 struct gfs2_alloc_parms *ap);
42*d312fbf6SAndreas Gruenbacher void gfs2_inplace_release(struct gfs2_inode *ip);
43b3b94faaSDavid Teigland 
44*d312fbf6SAndreas Gruenbacher int gfs2_alloc_blocks(struct gfs2_inode *ip, u64 *bn, unsigned int *n,
45d92445b2SAndreas Gruenbacher 		      bool dinode);
46b3b94faaSDavid Teigland 
47*d312fbf6SAndreas Gruenbacher void gfs2_rs_deltree(struct gfs2_blkreserv *rs);
48*d312fbf6SAndreas Gruenbacher void gfs2_rs_delete(struct gfs2_inode *ip);
49*d312fbf6SAndreas Gruenbacher void __gfs2_free_blocks(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd,
500ddeded4SAndreas Gruenbacher 		        u64 bstart, u32 blen, int meta);
51*d312fbf6SAndreas Gruenbacher void gfs2_free_meta(struct gfs2_inode *ip, struct gfs2_rgrpd *rgd,
520ddeded4SAndreas Gruenbacher 		    u64 bstart, u32 blen);
53*d312fbf6SAndreas Gruenbacher void gfs2_free_di(struct gfs2_rgrpd *rgd, struct gfs2_inode *ip);
54*d312fbf6SAndreas Gruenbacher void gfs2_unlink_di(struct inode *inode);
55*d312fbf6SAndreas Gruenbacher int gfs2_check_blk_type(struct gfs2_sbd *sdp, u64 no_addr,
56acf7e244SSteven Whitehouse 		        unsigned int type);
57b3b94faaSDavid Teigland 
58b3b94faaSDavid Teigland struct gfs2_rgrp_list {
59b3b94faaSDavid Teigland 	unsigned int rl_rgrps;
60b3b94faaSDavid Teigland 	unsigned int rl_space;
61b3b94faaSDavid Teigland 	struct gfs2_rgrpd **rl_rgd;
62b3b94faaSDavid Teigland 	struct gfs2_holder *rl_ghs;
63b3b94faaSDavid Teigland };
64b3b94faaSDavid Teigland 
65*d312fbf6SAndreas Gruenbacher void gfs2_rlist_add(struct gfs2_inode *ip, struct gfs2_rgrp_list *rlist,
66cd915493SSteven Whitehouse 		    u64 block);
67*d312fbf6SAndreas Gruenbacher void gfs2_rlist_alloc(struct gfs2_rgrp_list *rlist,
6844dab005SAndreas Gruenbacher 		      unsigned int state, u16 flags);
69*d312fbf6SAndreas Gruenbacher void gfs2_rlist_free(struct gfs2_rgrp_list *rlist);
70*d312fbf6SAndreas Gruenbacher u64 gfs2_ri_total(struct gfs2_sbd *sdp);
71*d312fbf6SAndreas Gruenbacher void gfs2_rgrp_dump(struct seq_file *seq, struct gfs2_rgrpd *rgd,
723792ce97SBob Peterson 		    const char *fs_id_buf);
73*d312fbf6SAndreas Gruenbacher int gfs2_rgrp_send_discards(struct gfs2_sbd *sdp, u64 offset,
747c9ca621SBob Peterson 			    struct buffer_head *bh,
75*d312fbf6SAndreas Gruenbacher 			    const struct gfs2_bitmap *bi, unsigned minlen,
76*d312fbf6SAndreas Gruenbacher 			    u64 *ptrimmed);
77*d312fbf6SAndreas Gruenbacher int gfs2_fitrim(struct file *filp, void __user *argp);
78b3b94faaSDavid Teigland 
794a993fb1SSteven Whitehouse /* This is how to tell if a reservation is in the rgrp tree: */
gfs2_rs_active(const struct gfs2_blkreserv * rs)80a097dc7eSBob Peterson static inline bool gfs2_rs_active(const struct gfs2_blkreserv *rs)
818e2e0047SBob Peterson {
823d39fcd1SAndreas Gruenbacher 	return !RB_EMPTY_NODE(&rs->rs_node);
838e2e0047SBob Peterson }
848e2e0047SBob Peterson 
rgrp_contains_block(struct gfs2_rgrpd * rgd,u64 block)85d552a2b9SBob Peterson static inline int rgrp_contains_block(struct gfs2_rgrpd *rgd, u64 block)
86d552a2b9SBob Peterson {
87d552a2b9SBob Peterson 	u64 first = rgd->rd_data0;
88d552a2b9SBob Peterson 	u64 last = first + rgd->rd_data;
89d552a2b9SBob Peterson 	return first <= block && block < last;
90d552a2b9SBob Peterson }
91d552a2b9SBob Peterson 
92*d312fbf6SAndreas Gruenbacher void check_and_update_goal(struct gfs2_inode *ip);
939e514605SAndreas Gruenbacher 
94*d312fbf6SAndreas Gruenbacher void rgrp_lock_local(struct gfs2_rgrpd *rgd);
95*d312fbf6SAndreas Gruenbacher void rgrp_unlock_local(struct gfs2_rgrpd *rgd);
969e514605SAndreas Gruenbacher 
97b3b94faaSDavid Teigland #endif /* __RGRP_DOT_H__ */
98