| 1 | /***************************************************************************** |
| 2 | |
| 3 | Copyright (c) 1995, 2016, Oracle and/or its affiliates. All Rights Reserved. |
| 4 | Copyright (c) 2013, 2017, MariaDB Corporation. |
| 5 | |
| 6 | This program is free software; you can redistribute it and/or modify it under |
| 7 | the terms of the GNU General Public License as published by the Free Software |
| 8 | Foundation; version 2 of the License. |
| 9 | |
| 10 | This program is distributed in the hope that it will be useful, but WITHOUT |
| 11 | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| 12 | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. |
| 13 | |
| 14 | You should have received a copy of the GNU General Public License along with |
| 15 | this program; if not, write to the Free Software Foundation, Inc., |
| 16 | 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA |
| 17 | |
| 18 | *****************************************************************************/ |
| 19 | |
| 20 | /**************************************************//** |
| 21 | @file include/fsp0fsp.ic |
| 22 | File space management |
| 23 | |
| 24 | Created 12/18/1995 Heikki Tuuri |
| 25 | *******************************************************/ |
| 26 | |
| 27 | #ifndef UNIV_INNOCHECKSUM |
| 28 | |
| 29 | /** Checks if a page address is an extent descriptor page address. |
| 30 | @param[in] page_id page id |
| 31 | @param[in] page_size page size |
| 32 | @return TRUE if a descriptor page */ |
| 33 | UNIV_INLINE |
| 34 | ibool |
| 35 | fsp_descr_page( |
| 36 | const page_id_t& page_id, |
| 37 | const page_size_t& page_size) |
| 38 | { |
| 39 | return((page_id.page_no() & (page_size.physical() - 1)) |
| 40 | == FSP_XDES_OFFSET); |
| 41 | } |
| 42 | |
| 43 | /** Calculates the descriptor index within a descriptor page. |
| 44 | @param[in] page_size page size |
| 45 | @param[in] offset page offset |
| 46 | @return descriptor index */ |
| 47 | UNIV_INLINE |
| 48 | ulint |
| 49 | xdes_calc_descriptor_index( |
| 50 | const page_size_t& page_size, |
| 51 | ulint offset) |
| 52 | { |
| 53 | return(ut_2pow_remainder(offset, page_size.physical()) |
| 54 | / FSP_EXTENT_SIZE); |
| 55 | } |
| 56 | #endif /*!UNIV_INNOCHECKSUM */ |
| 57 | |
| 58 | /**********************************************************************//** |
| 59 | Gets a descriptor bit of a page. |
| 60 | @return TRUE if free */ |
| 61 | UNIV_INLINE |
| 62 | ibool |
| 63 | xdes_get_bit( |
| 64 | /*=========*/ |
| 65 | const xdes_t* descr, /*!< in: descriptor */ |
| 66 | ulint bit, /*!< in: XDES_FREE_BIT or XDES_CLEAN_BIT */ |
| 67 | ulint offset) /*!< in: page offset within extent: |
| 68 | 0 ... FSP_EXTENT_SIZE - 1 */ |
| 69 | { |
| 70 | ut_ad(offset < FSP_EXTENT_SIZE); |
| 71 | ut_ad(bit == XDES_FREE_BIT || bit == XDES_CLEAN_BIT); |
| 72 | |
| 73 | ulint index = bit + XDES_BITS_PER_PAGE * offset; |
| 74 | |
| 75 | ulint bit_index = index % 8; |
| 76 | ulint byte_index = index / 8; |
| 77 | |
| 78 | return(ut_bit_get_nth( |
| 79 | mach_read_ulint(descr + XDES_BITMAP + byte_index, |
| 80 | MLOG_1BYTE), |
| 81 | bit_index)); |
| 82 | } |
| 83 | |
| 84 | #ifndef UNIV_INNOCHECKSUM |
| 85 | /** Calculates the page where the descriptor of a page resides. |
| 86 | @param[in] page_size page size |
| 87 | @param[in] offset page offset |
| 88 | @return descriptor page offset */ |
| 89 | UNIV_INLINE |
| 90 | ulint |
| 91 | xdes_calc_descriptor_page( |
| 92 | const page_size_t& page_size, |
| 93 | ulint offset) |
| 94 | { |
| 95 | compile_time_assert(UNIV_PAGE_SIZE_MAX > XDES_ARR_OFFSET |
| 96 | + (UNIV_PAGE_SIZE_MAX / FSP_EXTENT_SIZE_MAX) |
| 97 | * XDES_SIZE_MAX); |
| 98 | compile_time_assert(UNIV_PAGE_SIZE_MIN > XDES_ARR_OFFSET |
| 99 | + (UNIV_PAGE_SIZE_MIN / FSP_EXTENT_SIZE_MIN) |
| 100 | * XDES_SIZE_MIN); |
| 101 | |
| 102 | ut_ad(srv_page_size > XDES_ARR_OFFSET |
| 103 | + (srv_page_size / FSP_EXTENT_SIZE) |
| 104 | * XDES_SIZE); |
| 105 | ut_ad(UNIV_ZIP_SIZE_MIN > XDES_ARR_OFFSET |
| 106 | + (UNIV_ZIP_SIZE_MIN / FSP_EXTENT_SIZE) |
| 107 | * XDES_SIZE); |
| 108 | |
| 109 | #ifdef UNIV_DEBUG |
| 110 | if (page_size.is_compressed()) { |
| 111 | ut_a(page_size.physical() > XDES_ARR_OFFSET |
| 112 | + (page_size.physical() / FSP_EXTENT_SIZE) * XDES_SIZE); |
| 113 | } |
| 114 | #endif /* UNIV_DEBUG */ |
| 115 | |
| 116 | return(ut_2pow_round(offset, page_size.physical())); |
| 117 | } |
| 118 | #endif /* !UNIV_INNOCHECKSUM */ |
| 119 | |