cregit-Linux how code gets into the kernel

Release 4.10 fs/gfs2/rgrp.c

Directory: fs/gfs2
/*
 * Copyright (C) Sistina Software, Inc.  1997-2003 All rights reserved.
 * Copyright (C) 2004-2008 Red Hat, Inc.  All rights reserved.
 *
 * This copyrighted material is made available to anyone wishing to use,
 * modify, copy, or redistribute it subject to the terms and conditions
 * of the GNU General Public License version 2.
 */


#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

#include <linux/slab.h>
#include <linux/spinlock.h>
#include <linux/completion.h>
#include <linux/buffer_head.h>
#include <linux/fs.h>
#include <linux/gfs2_ondisk.h>
#include <linux/prefetch.h>
#include <linux/blkdev.h>
#include <linux/rbtree.h>
#include <linux/random.h>

#include "gfs2.h"
#include "incore.h"
#include "glock.h"
#include "glops.h"
#include "lops.h"
#include "meta_io.h"
#include "quota.h"
#include "rgrp.h"
#include "super.h"
#include "trans.h"
#include "util.h"
#include "log.h"
#include "inode.h"
#include "trace_gfs2.h"


#define BFITNOENT ((u32)~0)

#define NO_BLOCK ((u64)~0)

#if BITS_PER_LONG == 32

#define LBITMASK   (0x55555555UL)

#define LBITSKIP55 (0x55555555UL)

#define LBITSKIP00 (0x00000000UL)
#else

#define LBITMASK   (0x5555555555555555UL)

#define LBITSKIP55 (0x5555555555555555UL)

#define LBITSKIP00 (0x0000000000000000UL)
#endif

/*
 * These routines are used by the resource group routines (rgrp.c)
 * to keep track of block allocation.  Each block is represented by two
 * bits.  So, each byte represents GFS2_NBBY (i.e. 4) blocks.
 *
 * 0 = Free
 * 1 = Used (not metadata)
 * 2 = Unlinked (still in use) inode
 * 3 = Used (metadata)
 */


struct gfs2_extent {
	
struct gfs2_rbm rbm;
	
u32 len;
};


static const char valid_change[16] = {
	        /* current */
	/* n */ 0, 1, 1, 1,
	/* e */ 1, 0, 0, 0,
	/* w */ 0, 0, 0, 1,
	        1, 0, 0, 0
};

static int gfs2_rbm_find(struct gfs2_rbm *rbm, u8 state, u32 *minext,
			 const struct gfs2_inode *ip, bool nowrap);


/**
 * gfs2_setbit - Set a bit in the bitmaps
 * @rbm: The position of the bit to set
 * @do_clone: Also set the clone bitmap, if it exists
 * @new_state: the new state of the block
 *
 */


static inline void gfs2_setbit(const struct gfs2_rbm *rbm, bool do_clone, unsigned char new_state) { unsigned char *byte1, *byte2, *end, cur_state; struct gfs2_bitmap *bi = rbm_bi(rbm); unsigned int buflen = bi->bi_len; const unsigned int bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; byte1 = bi->bi_bh->b_data + bi->bi_offset + (rbm->offset / GFS2_NBBY); end = bi->bi_bh->b_data + bi->bi_offset + buflen; BUG_ON(byte1 >= end); cur_state = (*byte1 >> bit) & GFS2_BIT_MASK; if (unlikely(!valid_change[new_state * 4 + cur_state])) { pr_warn("buf_blk = 0x%x old_state=%d, new_state=%d\n", rbm->offset, cur_state, new_state); pr_warn("rgrp=0x%llx bi_start=0x%x\n", (unsigned long long)rbm->rgd->rd_addr, bi->bi_start); pr_warn("bi_offset=0x%x bi_len=0x%x\n", bi->bi_offset, bi->bi_len); dump_stack(); gfs2_consist_rgrpd(rbm->rgd); return; } *byte1 ^= (cur_state ^ new_state) << bit; if (do_clone && bi->bi_clone) { byte2 = bi->bi_clone + bi->bi_offset + (rbm->offset / GFS2_NBBY); cur_state = (*byte2 >> bit) & GFS2_BIT_MASK; *byte2 ^= (cur_state ^ new_state) << bit; } }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse17167.59%440.00%
robert s. petersonrobert s. peterson7630.04%440.00%
joe perchesjoe perches31.19%110.00%
fabian frederickfabian frederick31.19%110.00%
Total253100.00%10100.00%

/** * gfs2_testbit - test a bit in the bitmaps * @rbm: The bit to test * * Returns: The two bit block state of the requested bit */
static inline u8 gfs2_testbit(const struct gfs2_rbm *rbm) { struct gfs2_bitmap *bi = rbm_bi(rbm); const u8 *buffer = bi->bi_bh->b_data + bi->bi_offset; const u8 *byte; unsigned int bit; byte = buffer + (rbm->offset / GFS2_NBBY); bit = (rbm->offset % GFS2_NBBY) * GFS2_BIT_SIZE; return (*byte >> bit) & GFS2_BIT_MASK; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse7187.65%480.00%
robert s. petersonrobert s. peterson1012.35%120.00%
Total81100.00%5100.00%

/** * gfs2_bit_search * @ptr: Pointer to bitmap data * @mask: Mask to use (normally 0x55555.... but adjusted for search start) * @state: The state we are searching for * * We xor the bitmap data with a patter which is the bitwise opposite * of what we are looking for, this gives rise to a pattern of ones * wherever there is a match. Since we have two bits per entry, we * take this pattern, shift it down by one place and then and it with * the original. All the even bit positions (0,2,4, etc) then represent * successful matches, so we mask with 0x55555..... to remove the unwanted * odd bit positions. * * This allows searching of a whole u64 at once (32 blocks) with a * single test (on 64 bit arches). */
static inline u64 gfs2_bit_search(const __le64 *ptr, u64 mask, u8 state) { u64 tmp; static const u64 search[] = { [0] = 0xffffffffffffffffULL, [1] = 0xaaaaaaaaaaaaaaaaULL, [2] = 0x5555555555555555ULL, [3] = 0x0000000000000000ULL, }; tmp = le64_to_cpu(*ptr) ^ search[state]; tmp &= (tmp >> 1); tmp &= mask; return tmp; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse7795.06%266.67%
hannes ederhannes eder44.94%133.33%
Total81100.00%3100.00%

/** * rs_cmp - multi-block reservation range compare * @blk: absolute file system block number of the new reservation * @len: number of blocks in the new reservation * @rs: existing reservation to compare against * * returns: 1 if the block range is beyond the reach of the reservation * -1 if the block range is before the start of the reservation * 0 if the block range overlaps with the reservation */
static inline int rs_cmp(u64 blk, u32 len, struct gfs2_blkreserv *rs) { u64 startblk = gfs2_rbm_to_block(&rs->rs_rbm); if (blk >= startblk + rs->rs_free) return 1; if (blk + len - 1 < startblk) return -1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson5593.22%150.00%
steven whitehousesteven whitehouse46.78%150.00%
Total59100.00%2100.00%

/** * gfs2_bitfit - Search an rgrp's bitmap buffer to find a bit-pair representing * a block in a given allocation state. * @buf: the buffer that holds the bitmaps * @len: the length (in bytes) of the buffer * @goal: start search at this block's bit-pair (within @buffer) * @state: GFS2_BLKST_XXX the state of the block we're looking for. * * Scope of @goal and returned block number is only within this bitmap buffer, * not entire rgrp or filesystem. @buffer will be offset from the actual * beginning of a bitmap block buffer, skipping any header structures, but * headers are always a multiple of 64 bits long so that the buffer is * always aligned to a 64 bit boundary. * * The size of the buffer is in bytes, but is it assumed that it is * always ok to read a complete multiple of 64 bits at the end * of the block in case the end is no aligned to a natural boundary. * * Return: the block number (bitmap buffer scope) that was found */
static u32 gfs2_bitfit(const u8 *buf, const unsigned int len, u32 goal, u8 state) { u32 spoint = (goal << 1) & ((8*sizeof(u64)) - 1); const __le64 *ptr = ((__le64 *)buf) + (goal >> 5); const __le64 *end = (__le64 *)(buf + ALIGN(len, sizeof(u64))); u64 tmp; u64 mask = 0x5555555555555555ULL; u32 bit; /* Mask off bits we don't care about at the start of the search */ mask <<= spoint; tmp = gfs2_bit_search(ptr, mask, state); ptr++; while(tmp == 0 && ptr < end) { tmp = gfs2_bit_search(ptr, 0x5555555555555555ULL, state); ptr++; } /* Mask off any bits which are more than len bytes from the start */ if (ptr == end && (len & (sizeof(u64) - 1))) tmp &= (((u64)~0) >> (64 - 8*(len & (sizeof(u64) - 1)))); /* Didn't find anything, so return */ if (tmp == 0) return BFITNOENT; ptr--; bit = __ffs64(tmp); bit /= 2; /* two bits per entry in the bitmap */ return (((const unsigned char *)ptr - buf) * GFS2_NBBY) + bit; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse19481.86%555.56%
robert s. petersonrobert s. peterson4016.88%222.22%
hannes ederhannes eder31.27%222.22%
Total237100.00%9100.00%

/** * gfs2_rbm_from_block - Set the rbm based upon rgd and block number * @rbm: The rbm with rgd already set correctly * @block: The block number (filesystem relative) * * This sets the bi and offset members of an rbm based on a * resource group and a filesystem relative block number. The * resource group must be set in the rbm on entry, the bi and * offset members will be set by this function. * * Returns: 0 on success, or an error code */
static int gfs2_rbm_from_block(struct gfs2_rbm *rbm, u64 block) { u64 rblock = block - rbm->rgd->rd_data0; if (WARN_ON_ONCE(rblock > UINT_MAX)) return -EINVAL; if (block >= rbm->rgd->rd_data0 + rbm->rgd->rd_data) return -E2BIG; rbm->bii = 0; rbm->offset = (u32)(rblock); /* Check if the block is within the first block */ if (rbm->offset < rbm_bi(rbm)->bi_blocks) return 0; /* Adjust for the size diff between gfs2_meta_header and gfs2_rgrp */ rbm->offset += (sizeof(struct gfs2_rgrp) - sizeof(struct gfs2_meta_header)) * GFS2_NBBY; rbm->bii = rbm->offset / rbm->rgd->rd_sbd->sd_blocks_per_bitmap; rbm->offset -= rbm->bii * rbm->rgd->rd_sbd->sd_blocks_per_bitmap; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse7953.38%350.00%
robert s. petersonrobert s. peterson6946.62%350.00%
Total148100.00%6100.00%

/** * gfs2_rbm_incr - increment an rbm structure * @rbm: The rbm with rgd already set correctly * * This function takes an existing rbm structure and increments it to the next * viable block offset. * * Returns: If incrementing the offset would cause the rbm to go past the * end of the rgrp, true is returned, otherwise false. * */
static bool gfs2_rbm_incr(struct gfs2_rbm *rbm) { if (rbm->offset + 1 < rbm_bi(rbm)->bi_blocks) { /* in the same bitmap */ rbm->offset++; return false; } if (rbm->bii == rbm->rgd->rd_length - 1) /* at the last bitmap */ return true; rbm->offset = 0; rbm->bii++; return false; }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson69100.00%1100.00%
Total69100.00%1100.00%

/** * gfs2_unaligned_extlen - Look for free blocks which are not byte aligned * @rbm: Position to search (value/result) * @n_unaligned: Number of unaligned blocks to check * @len: Decremented for each block found (terminate on zero) * * Returns: true if a non-free block is encountered */
static bool gfs2_unaligned_extlen(struct gfs2_rbm *rbm, u32 n_unaligned, u32 *len) { u32 n; u8 res; for (n = 0; n < n_unaligned; n++) { res = gfs2_testbit(rbm); if (res != GFS2_BLKST_FREE) return true; (*len)--; if (*len == 0) return true; if (gfs2_rbm_incr(rbm)) return true; } return false; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse8398.81%150.00%
robert s. petersonrobert s. peterson11.19%150.00%
Total84100.00%2100.00%

/** * gfs2_free_extlen - Return extent length of free blocks * @rrbm: Starting position * @len: Max length to check * * Starting at the block specified by the rbm, see how many free blocks * there are, not reading more than len blocks ahead. This can be done * using memchr_inv when the blocks are byte aligned, but has to be done * on a block by block basis in case of unaligned blocks. Also this * function can cope with bitmap boundaries (although it must stop on * a resource group boundary) * * Returns: Number of free blocks in the extent */
static u32 gfs2_free_extlen(const struct gfs2_rbm *rrbm, u32 len) { struct gfs2_rbm rbm = *rrbm; u32 n_unaligned = rbm.offset & 3; u32 size = len; u32 bytes; u32 chunk_size; u8 *ptr, *start, *end; u64 block; struct gfs2_bitmap *bi; if (n_unaligned && gfs2_unaligned_extlen(&rbm, 4 - n_unaligned, &len)) goto out; n_unaligned = len & 3; /* Start is now byte aligned */ while (len > 3) { bi = rbm_bi(&rbm); start = bi->bi_bh->b_data; if (bi->bi_clone) start = bi->bi_clone; end = start + bi->bi_bh->b_size; start += bi->bi_offset; BUG_ON(rbm.offset & 3); start += (rbm.offset / GFS2_NBBY); bytes = min_t(u32, len / GFS2_NBBY, (end - start)); ptr = memchr_inv(start, 0, bytes); chunk_size = ((ptr == NULL) ? bytes : (ptr - start)); chunk_size *= GFS2_NBBY; BUG_ON(len < chunk_size); len -= chunk_size; block = gfs2_rbm_to_block(&rbm); if (gfs2_rbm_from_block(&rbm, block + chunk_size)) { n_unaligned = 0; break; } if (ptr) { n_unaligned = 3; break; } n_unaligned = len & 3; } /* Deal with any bits left over at the end */ if (n_unaligned) gfs2_unaligned_extlen(&rbm, n_unaligned, &len); out: return size - len; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse25488.81%125.00%
robert s. petersonrobert s. peterson3211.19%375.00%
Total286100.00%4100.00%

/** * gfs2_bitcount - count the number of bits in a certain state * @rgd: the resource group descriptor * @buffer: the buffer that holds the bitmaps * @buflen: the length (in bytes) of the buffer * @state: the state of the block we're looking for * * Returns: The number of bits */
static u32 gfs2_bitcount(struct gfs2_rgrpd *rgd, const u8 *buffer, unsigned int buflen, u8 state) { const u8 *byte = buffer; const u8 *end = buffer + buflen; const u8 state1 = state << 2; const u8 state2 = state << 4; const u8 state3 = state << 6; u32 count = 0; for (; byte < end; byte++) { if (((*byte) & 0x03) == state) count++; if (((*byte) & 0x0C) == state1) count++; if (((*byte) & 0x30) == state2) count++; if (((*byte) & 0xC0) == state3) count++; } return count; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse147100.00%1100.00%
Total147100.00%1100.00%

/** * gfs2_rgrp_verify - Verify that a resource group is consistent * @rgd: the rgrp * */
void gfs2_rgrp_verify(struct gfs2_rgrpd *rgd) { struct gfs2_sbd *sdp = rgd->rd_sbd; struct gfs2_bitmap *bi = NULL; u32 length = rgd->rd_length; u32 count[4], tmp; int buf, x; memset(count, 0, 4 * sizeof(u32)); /* Count # blocks in each of 4 possible allocation states */ for (buf = 0; buf < length; buf++) { bi = rgd->rd_bits + buf; for (x = 0; x < 4; x++) count[x] += gfs2_bitcount(rgd, bi->bi_bh->b_data + bi->bi_offset, bi->bi_len, x); } if (count[0] != rgd->rd_free) { if (gfs2_consist_rgrpd(rgd)) fs_err(sdp, "free data mismatch: %u != %u\n", count[0], rgd->rd_free); return; } tmp = rgd->rd_data - rgd->rd_free - rgd->rd_dinodes; if (count[1] != tmp) { if (gfs2_consist_rgrpd(rgd)) fs_err(sdp, "used data mismatch: %u != %u\n", count[1], tmp); return; } if (count[2] + count[3] != rgd->rd_dinodes) { if (gfs2_consist_rgrpd(rgd)) fs_err(sdp, "used metadata mismatch: %u != %u\n", count[2] + count[3], rgd->rd_dinodes); return; } }

Contributors

PersonTokensPropCommitsCommitProp
david teiglanddavid teigland22688.98%114.29%
steven whitehousesteven whitehouse197.48%571.43%
benjamin marzinskibenjamin marzinski93.54%114.29%
Total254100.00%7100.00%


static inline int rgrp_contains_block(struct gfs2_rgrpd *rgd, u64 block) { u64 first = rgd->rd_data0; u64 last = first + rgd->rd_data; return first <= block && block < last; }

Contributors

PersonTokensPropCommitsCommitProp
david teiglanddavid teigland3177.50%133.33%
steven whitehousesteven whitehouse922.50%266.67%
Total40100.00%3100.00%

/** * gfs2_blk2rgrpd - Find resource group for a given data/meta block number * @sdp: The GFS2 superblock * @blk: The data block number * @exact: True if this needs to be an exact match * * Returns: The resource group, or NULL if not found */
struct gfs2_rgrpd *gfs2_blk2rgrpd(struct gfs2_sbd *sdp, u64 blk, bool exact) { struct rb_node *n, *next; struct gfs2_rgrpd *cur; spin_lock(&sdp->sd_rindex_spin); n = sdp->sd_rindex_tree.rb_node; while (n) { cur = rb_entry(n, struct gfs2_rgrpd, rd_node); next = NULL; if (blk < cur->rd_addr) next = n->rb_left; else if (blk >= cur->rd_data0 + cur->rd_data) next = n->rb_right; if (next == NULL) { spin_unlock(&sdp->sd_rindex_spin); if (exact) { if (blk < cur->rd_addr) return NULL; if (blk >= cur->rd_data0 + cur->rd_data) return NULL; } return cur; } n = next; } spin_unlock(&sdp->sd_rindex_spin); return NULL; }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse6639.29%360.00%
david teiglanddavid teigland5935.12%120.00%
robert s. petersonrobert s. peterson4325.60%120.00%
Total168100.00%5100.00%

/** * gfs2_rgrpd_get_first - get the first Resource Group in the filesystem * @sdp: The GFS2 superblock * * Returns: The first rgrp in the filesystem */
struct gfs2_rgrpd *gfs2_rgrpd_get_first(struct gfs2_sbd *sdp) { const struct rb_node *n; struct gfs2_rgrpd *rgd; spin_lock(&sdp->sd_rindex_spin); n = rb_first(&sdp->sd_rindex_tree); rgd = rb_entry(n, struct gfs2_rgrpd, rd_node); spin_unlock(&sdp->sd_rindex_spin); return rgd; }

Contributors

PersonTokensPropCommitsCommitProp
david teiglanddavid teigland2539.06%133.33%
robert s. petersonrobert s. peterson2335.94%133.33%
steven whitehousesteven whitehouse1625.00%133.33%
Total64100.00%3100.00%

/** * gfs2_rgrpd_get_next - get the next RG * @rgd: the resource group descriptor * * Returns: The next rgrp */
struct gfs2_rgrpd *gfs2_rgrpd_get_next(struct gfs2_rgrpd *rgd) { struct gfs2_sbd *sdp = rgd->rd_sbd; const struct rb_node *n; spin_lock(&sdp->sd_rindex_spin); n = rb_next(&rgd->rd_node); if (n == NULL) n = rb_first(&sdp->sd_rindex_tree); if (unlikely(&rgd->rd_node == n)) { spin_unlock(&sdp->sd_rindex_spin); return NULL; } rgd = rb_entry(n, struct gfs2_rgrpd, rd_node); spin_unlock(&sdp->sd_rindex_spin); return rgd; }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson8073.39%150.00%
david teiglanddavid teigland2926.61%150.00%
Total109100.00%2100.00%


void check_and_update_goal(struct gfs2_inode *ip) { struct gfs2_sbd *sdp = GFS2_SB(&ip->i_inode); if (!ip->i_goal || gfs2_blk2rgrpd(sdp, ip->i_goal, 1) == NULL) ip->i_goal = ip->i_no_addr; }

Contributors

PersonTokensPropCommitsCommitProp
abhijith dasabhijith das51100.00%1100.00%
Total51100.00%1100.00%


void gfs2_free_clones(struct gfs2_rgrpd *rgd) { int x; for (x = 0; x < rgd->rd_length; x++) { struct gfs2_bitmap *bi = rgd->rd_bits + x; kfree(bi->bi_clone); bi->bi_clone = NULL; } }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse5398.15%150.00%
david teiglanddavid teigland11.85%150.00%
Total54100.00%2100.00%

/** * gfs2_rsqa_alloc - make sure we have a reservation assigned to the inode * plus a quota allocations data structure, if necessary * @ip: the inode for this reservation */
int gfs2_rsqa_alloc(struct gfs2_inode *ip) { return gfs2_qa_alloc(ip); }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson16100.00%4100.00%
Total16100.00%4100.00%


static void dump_rs(struct seq_file *seq, const struct gfs2_blkreserv *rs) { gfs2_print_dbg(seq, " B: n:%llu s:%llu b:%u f:%u\n", (unsigned long long)rs->rs_inum, (unsigned long long)gfs2_rbm_to_block(&rs->rs_rbm), rs->rs_rbm.offset, rs->rs_free); }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson3053.57%120.00%
steven whitehousesteven whitehouse2137.50%360.00%
david teiglanddavid teigland58.93%120.00%
Total56100.00%5100.00%

/** * __rs_deltree - remove a multi-block reservation from the rgd tree * @rs: The reservation to remove * */
static void __rs_deltree(struct gfs2_blkreserv *rs) { struct gfs2_rgrpd *rgd; if (!gfs2_rs_active(rs)) return; rgd = rs->rs_rbm.rgd; trace_gfs2_rs(rs, TRACE_RS_TREEDEL); rb_erase(&rs->rs_node, &rgd->rd_rstree); RB_CLEAR_NODE(&rs->rs_node); if (rs->rs_free) { struct gfs2_bitmap *bi = rbm_bi(&rs->rs_rbm); /* return reserved blocks to the rgrp */ BUG_ON(rs->rs_rbm.rgd->rd_reserved < rs->rs_free); rs->rs_rbm.rgd->rd_reserved -= rs->rs_free; /* The rgrp extent failure point is likely not to increase; it will only do so if the freed blocks are somehow contiguous with a span of free blocks that follows. Still, it will force the number to be recalculated later. */ rgd->rd_extfail_pt += rs->rs_free; rs->rs_free = 0; clear_bit(GBF_FULL, &bi->bi_flags); } }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson8160.00%545.45%
steven whitehousesteven whitehouse2720.00%436.36%
david teiglanddavid teigland2619.26%19.09%
michel lespinassemichel lespinasse10.74%19.09%
Total135100.00%11100.00%

/** * gfs2_rs_deltree - remove a multi-block reservation from the rgd tree * @rs: The reservation to remove * */
void gfs2_rs_deltree(struct gfs2_blkreserv *rs) { struct gfs2_rgrpd *rgd; rgd = rs->rs_rbm.rgd; if (rgd) { spin_lock(&rgd->rd_rsspin); __rs_deltree(rs); BUG_ON(rs->rs_free); spin_unlock(&rgd->rd_rsspin); } }

Contributors

PersonTokensPropCommitsCommitProp
steven whitehousesteven whitehouse3357.89%250.00%
robert s. petersonrobert s. peterson2442.11%250.00%
Total57100.00%4100.00%

/** * gfs2_rsqa_delete - delete a multi-block reservation and quota allocation * @ip: The inode for this reservation * @wcount: The inode's write count, or NULL * */
void gfs2_rsqa_delete(struct gfs2_inode *ip, atomic_t *wcount) { down_write(&ip->i_rw_mutex); if ((wcount == NULL) || (atomic_read(wcount) <= 1)) gfs2_rs_deltree(&ip->i_res); up_write(&ip->i_rw_mutex); gfs2_qa_delete(ip, wcount); }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson3861.29%457.14%
steven whitehousesteven whitehouse1625.81%228.57%
david teiglanddavid teigland812.90%114.29%
Total62100.00%7100.00%

/** * return_all_reservations - return all reserved blocks back to the rgrp. * @rgd: the rgrp that needs its space back * * We previously reserved a bunch of blocks for allocation. Now we need to * give them back. This leave the reservation structures in tact, but removes * all of their corresponding "no-fly zones". */
static void return_all_reservations(struct gfs2_rgrpd *rgd) { struct rb_node *n; struct gfs2_blkreserv *rs; spin_lock(&rgd->rd_rsspin); while ((n = rb_first(&rgd->rd_rstree))) { rs = rb_entry(n, struct gfs2_blkreserv, rs_node); __rs_deltree(rs); } spin_unlock(&rgd->rd_rsspin); }

Contributors

PersonTokensPropCommitsCommitProp
robert s. petersonrobert s. peterson5477.14%150.00%
david teiglanddavid teigland1622.86%150.00%
Total70100.00%2100.00%


void gfs2_clear_rgrpd(struct gfs2_sbd *sdp) { struct rb_node *n; struct gfs2_rgrpd *rgd; struct gfs2_glock *gl; while ((n = rb_first(&sdp->sd_rindex_tree))) { rgd = rb_entry(n, struct gfs2_rgrpd, rd_node); gl = rgd->rd_gl; rb_erase(n, &sdp->sd_rindex_tree); if (gl) { spin_lock(&gl->gl_lockref.lock); gl->gl_object = NULL; spin_unlock(&gl->gl_lockref.lock); gfs2_glock_add_to_lru(gl