[Ocfs2-devel] [PATCH 5/7] ocfs2: De-magic the in-memory slot map.
Mark Fasheh
mark.fasheh at oracle.com
Mon Dec 31 17:09:29 PST 2007
On Thu, Dec 06, 2007 at 09:19:45PM -0800, Joel Becker wrote:
> The in-memory slot map uses the same magic as the on-disk one. There is
> a special value to mark a slot as invalid. It relies on the size of
> certain types and so on.
>
> Write a new in-memory map that keeps validity as a separate field. Outside
> of the I/O functions, OCFS2_INVALID_SLOT now means what it is supposed to.
> It also is no longer tied to the type size.
>
> This also means that only the I/O functions refer to 16bit quantities.
>
> Signed-off-by: Joel Becker <joel.becker at oracle.com>
> ---
> fs/ocfs2/journal.c | 2 +-
> fs/ocfs2/ocfs2.h | 6 +-
> fs/ocfs2/slot_map.c | 131 ++++++++++++++++++++++++++++-----------------------
> fs/ocfs2/slot_map.h | 2 +-
> 4 files changed, 77 insertions(+), 64 deletions(-)
>
> diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c
> index 89c275e..884ebd9 100644
> --- a/fs/ocfs2/journal.c
> +++ b/fs/ocfs2/journal.c
> @@ -71,7 +71,7 @@ static int ocfs2_commit_thread(void *arg);
> */
>
> struct ocfs2_recovery_map {
> - int rm_used;
> + unsigned int rm_used;
> unsigned int *rm_entries;
> };
>
> diff --git a/fs/ocfs2/ocfs2.h b/fs/ocfs2/ocfs2.h
> index dcb9120..5bb5b07 100644
> --- a/fs/ocfs2/ocfs2.h
> +++ b/fs/ocfs2/ocfs2.h
> @@ -214,10 +214,10 @@ struct ocfs2_super
> unsigned long s_mount_opt;
> unsigned int s_atime_quantum;
>
> - u16 max_slots;
> + unsigned int max_slots;
> s16 node_num;
> - s16 slot_num;
> - s16 preferred_slot;
> + int slot_num;
> + int preferred_slot;
> int s_sectsize_bits;
> int s_clustersize;
> int s_clustersize_bits;
> diff --git a/fs/ocfs2/slot_map.c b/fs/ocfs2/slot_map.c
> index fd08592..b7d592a 100644
> --- a/fs/ocfs2/slot_map.c
> +++ b/fs/ocfs2/slot_map.c
> @@ -42,6 +42,12 @@
>
> #include "buffer_head_io.h"
>
> +
> +struct ocfs2_slot {
> + int sl_valid;
> + unsigned int sl_node_num;
> +};
> +
> struct ocfs2_slot_info_real {
> spinlock_t si_lock;
>
> @@ -49,8 +55,7 @@ struct ocfs2_slot_info_real {
> unsigned int si_blocks;
> struct buffer_head **si_bh;
> unsigned int si_num_slots;
> - unsigned int si_size;
> - s16 si_global_node_nums[OCFS2_MAX_SLOTS];
> + struct ocfs2_slot *si_slots;
> };
>
> static inline struct ocfs2_slot_info_real *to_slot_info(struct ocfs2_super *osb)
> @@ -59,11 +64,26 @@ static inline struct ocfs2_slot_info_real *to_slot_info(struct ocfs2_super *osb)
> }
>
>
> -static s16 __ocfs2_node_num_to_slot(struct ocfs2_slot_info_real *si,
> - s16 global);
> -static void __ocfs2_fill_slot(struct ocfs2_slot_info_real *si,
> - s16 slot_num,
> - s16 node_num);
> +static int __ocfs2_node_num_to_slot(struct ocfs2_slot_info_real *si,
> + unsigned int node_num);
> +
> +static void ocfs2_invalidate_slot(struct ocfs2_slot_info_real *si,
> + int slot_num)
> +{
> + BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots));
> + si->si_slots[slot_num].sl_valid = 0;
> +}
> +
> +static void ocfs2_set_slot(struct ocfs2_slot_info_real *si,
> + int slot_num, unsigned int node_num)
> +{
> + BUG_ON((slot_num < 0) || (slot_num >= si->si_num_slots));
> + BUG_ON((node_num == O2NM_INVALID_NODE_NUM) ||
> + (node_num >= O2NM_MAX_NODES));
> +
> + si->si_slots[slot_num].sl_valid = 1;
> + si->si_slots[slot_num].sl_node_num = node_num;
> +}
>
> /* post the slot information on disk into our slot_info struct. */
> static void ocfs2_update_slot_info(struct ocfs2_slot_info_real *si)
> @@ -76,8 +96,12 @@ static void ocfs2_update_slot_info(struct ocfs2_slot_info_real *si)
> spin_lock(&si->si_lock);
> disk_info = (__le16 *) si->si_bh[0]->b_data;
>
> - for (i = 0; i < si->si_size; i++)
> - si->si_global_node_nums[i] = le16_to_cpu(disk_info[i]);
> + for (i = 0; i < si->si_num_slots; i++) {
> + if (le16_to_cpu(disk_info[i]) == (u16)OCFS2_INVALID_SLOT)
> + ocfs2_invalidate_slot(si, i);
> + else
> + ocfs2_set_slot(si, i, le16_to_cpu(disk_info[i]));
> + }
>
> spin_unlock(&si->si_lock);
> }
> @@ -118,8 +142,13 @@ static int ocfs2_update_disk_slots(struct ocfs2_super *osb,
> __le16 *disk_info = (__le16 *) si->si_bh[0]->b_data;
>
> spin_lock(&si->si_lock);
> - for (i = 0; i < si->si_size; i++)
> - disk_info[i] = cpu_to_le16(si->si_global_node_nums[i]);
> + for (i = 0; i < si->si_num_slots; i++) {
> + if (si->si_slots[i].sl_valid)
> + disk_info[i] =
> + cpu_to_le16(si->si_slots[i].sl_node_num);
> + else
> + disk_info[i] = cpu_to_le16(OCFS2_INVALID_SLOT);
> + }
> spin_unlock(&si->si_lock);
>
> status = ocfs2_write_block(osb, si->si_bh[0], si->si_inode);
> @@ -140,7 +169,7 @@ static int ocfs2_slot_map_physical_size(struct ocfs2_super *osb,
> unsigned long long bytes_needed;
>
> bytes_needed = osb->max_slots * sizeof(__le16);
> - if (bytes_needed < i_size_read(inode)) {
> + if (bytes_needed > i_size_read(inode)) {
Why wasn't this just fixed in the previous patch?
--Mark
--
Mark Fasheh
Principal Software Developer, Oracle
mark.fasheh at oracle.com
More information about the Ocfs2-devel
mailing list