Skip to content

Commit

Permalink
[GFS2] Change ondisk format (hopefully for the last time)
Browse files Browse the repository at this point in the history
There were one or two fields in structures which didn't get changed
last time back to their gfs1 sizes and alignments. One or two constants
have also changed back to their original values which were missed the
first time.

Its possible that indirect pointer blocks might need to change. If
they don't we'll have to rewrite them all on upgrade due to a change
in the amount of padding that they use.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Steven Whitehouse committed Feb 13, 2006
1 parent 7359a19 commit fc69d0d
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 38 deletions.
36 changes: 19 additions & 17 deletions fs/gfs2/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -397,11 +397,11 @@ static int dirent_next(struct gfs2_inode *dip, struct buffer_head *bh,
{
struct gfs2_dirent *tmp, *cur;
char *bh_end;
uint32_t cur_rec_len;
uint16_t cur_rec_len;

cur = *dent;
bh_end = bh->b_data + bh->b_size;
cur_rec_len = be32_to_cpu(cur->de_rec_len);
cur_rec_len = be16_to_cpu(cur->de_rec_len);

if ((char *)cur + cur_rec_len >= bh_end) {
if ((char *)cur + cur_rec_len > bh_end) {
Expand All @@ -413,7 +413,7 @@ static int dirent_next(struct gfs2_inode *dip, struct buffer_head *bh,

tmp = (struct gfs2_dirent *)((char *)cur + cur_rec_len);

if ((char *)tmp + be32_to_cpu(tmp->de_rec_len) > bh_end) {
if ((char *)tmp + be16_to_cpu(tmp->de_rec_len) > bh_end) {
gfs2_consist_inode(dip);
return -EIO;
}
Expand All @@ -440,7 +440,7 @@ static int dirent_next(struct gfs2_inode *dip, struct buffer_head *bh,
static void dirent_del(struct gfs2_inode *dip, struct buffer_head *bh,
struct gfs2_dirent *prev, struct gfs2_dirent *cur)
{
uint32_t cur_rec_len, prev_rec_len;
uint16_t cur_rec_len, prev_rec_len;

if (!cur->de_inum.no_addr) {
gfs2_consist_inode(dip);
Expand All @@ -460,16 +460,16 @@ static void dirent_del(struct gfs2_inode *dip, struct buffer_head *bh,

/* Combine this dentry with the previous one. */

prev_rec_len = be32_to_cpu(prev->de_rec_len);
cur_rec_len = be32_to_cpu(cur->de_rec_len);
prev_rec_len = be16_to_cpu(prev->de_rec_len);
cur_rec_len = be16_to_cpu(cur->de_rec_len);

if ((char *)prev + prev_rec_len != (char *)cur)
gfs2_consist_inode(dip);
if ((char *)cur + cur_rec_len > bh->b_data + bh->b_size)
gfs2_consist_inode(dip);

prev_rec_len += cur_rec_len;
prev->de_rec_len = cpu_to_be32(prev_rec_len);
prev->de_rec_len = cpu_to_be16(prev_rec_len);
}

/**
Expand Down Expand Up @@ -513,17 +513,18 @@ int gfs2_dirent_alloc(struct gfs2_inode *dip, struct buffer_head *bh,
gfs2_trans_add_bh(dip->i_gl, bh, 1);

dent->de_rec_len = bh->b_size - offset;
dent->de_rec_len = cpu_to_be32(dent->de_rec_len);
dent->de_rec_len = cpu_to_be16(dent->de_rec_len);
dent->de_name_len = name_len;

*dent_out = dent;
return 0;
}

do {
uint32_t cur_rec_len, cur_name_len;
uint16_t cur_rec_len;
uint32_t cur_name_len;

cur_rec_len = be32_to_cpu(dent->de_rec_len);
cur_rec_len = be16_to_cpu(dent->de_rec_len);
cur_name_len = dent->de_name_len;

if ((!dent->de_inum.no_addr && cur_rec_len >= rec_len) ||
Expand All @@ -536,11 +537,11 @@ int gfs2_dirent_alloc(struct gfs2_inode *dip, struct buffer_head *bh,
memset(new, 0, sizeof(struct gfs2_dirent));

new->de_rec_len = cur_rec_len - GFS2_DIRENT_SIZE(cur_name_len);
new->de_rec_len = cpu_to_be32(new->de_rec_len);
new->de_rec_len = cpu_to_be16(new->de_rec_len);
new->de_name_len = name_len;

dent->de_rec_len = cur_rec_len - be32_to_cpu(new->de_rec_len);
dent->de_rec_len = cpu_to_be32(dent->de_rec_len);
dent->de_rec_len = cur_rec_len - be16_to_cpu(new->de_rec_len);
dent->de_rec_len = cpu_to_be16(dent->de_rec_len);

*dent_out = new;
return 0;
Expand Down Expand Up @@ -589,9 +590,10 @@ static int dirent_fits(struct gfs2_inode *dip, struct buffer_head *bh,
return 1;

do {
uint32_t cur_rec_len, cur_name_len;
uint16_t cur_rec_len;
uint32_t cur_name_len;

cur_rec_len = be32_to_cpu(dent->de_rec_len);
cur_rec_len = be16_to_cpu(dent->de_rec_len);
cur_name_len = dent->de_name_len;

if ((!dent->de_inum.no_addr && cur_rec_len >= rec_len) ||
Expand Down Expand Up @@ -832,10 +834,10 @@ static int dir_make_exhash(struct gfs2_inode *dip)
/* Adjust the last dirent's record length
(Remember that dent still points to the last entry.) */

dent->de_rec_len = be32_to_cpu(dent->de_rec_len) +
dent->de_rec_len = be16_to_cpu(dent->de_rec_len) +
sizeof(struct gfs2_dinode) -
sizeof(struct gfs2_leaf);
dent->de_rec_len = cpu_to_be32(dent->de_rec_len);
dent->de_rec_len = cpu_to_be16(dent->de_rec_len);

brelse(bh);

Expand Down
42 changes: 21 additions & 21 deletions include/linux/gfs2_ondisk.h
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
/*
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
* Copyright (C) 2004-2005 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 v.2.
*/
* Copyright (C) Sistina Software, Inc. 1997-2003 All rights reserved.
* Copyright (C) 2004-2005 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 v.2.
*/

#ifndef __GFS2_ONDISK_DOT_H__
#define __GFS2_ONDISK_DOT_H__
Expand Down Expand Up @@ -34,14 +34,14 @@
#define GFS2_FORMAT_LH 800
#define GFS2_FORMAT_LD 900
#define GFS2_FORMAT_LB 1000
#define GFS2_FORMAT_EA 1100
#define GFS2_FORMAT_ED 1200
#define GFS2_FORMAT_EA 1600
#define GFS2_FORMAT_ED 1700
#define GFS2_FORMAT_UT 1300
#define GFS2_FORMAT_QC 1400
/* These are format numbers for entities contained in files */
#define GFS2_FORMAT_RI 1500
#define GFS2_FORMAT_DE 1600
#define GFS2_FORMAT_QU 1700
#define GFS2_FORMAT_RI 1100
#define GFS2_FORMAT_DE 1200
#define GFS2_FORMAT_QU 1500
/* These are part of the superblock */
#define GFS2_FORMAT_FS 1801
#define GFS2_FORMAT_MULTI 1900
Expand Down Expand Up @@ -74,9 +74,9 @@ struct gfs2_inum {
#define GFS2_METATYPE_JD 7
#define GFS2_METATYPE_LH 8
#define GFS2_METATYPE_LD 9
#define GFS2_METATYPE_LB 10
#define GFS2_METATYPE_EA 11
#define GFS2_METATYPE_ED 12
#define GFS2_METATYPE_LB 12
#define GFS2_METATYPE_EA 10
#define GFS2_METATYPE_ED 11
#define GFS2_METATYPE_UT 13
#define GFS2_METATYPE_QC 14

Expand Down Expand Up @@ -181,6 +181,7 @@ struct gfs2_quota {
__be64 qu_limit;
__be64 qu_warn;
__be64 qu_value;
__u8 qu_reserved[64];
};

/*
Expand Down Expand Up @@ -260,11 +261,10 @@ struct gfs2_dinode {
struct gfs2_dirent {
struct gfs2_inum de_inum;
__be32 de_hash;
__be32 de_rec_len;
__u8 de_name_len;
__u8 de_type;
__u16 __pad1;
__u32 __pad2;
__be16 de_rec_len;
__be16 de_name_len;
__be16 de_type;
__u8 __pad[14];
};

/*
Expand All @@ -279,7 +279,7 @@ struct gfs2_leaf {
__be32 lf_dirent_format; /* Format of the dirents */
__be64 lf_next; /* Next leaf, if overflow */

__u8 lf_reserved[32];
__u8 lf_reserved[64];
};

/*
Expand Down

0 comments on commit fc69d0d

Please sign in to comment.