From mboxrd@z Thu Jan 1 00:00:00 1970 From: rpeterso@sourceware.org Date: 12 Feb 2007 18:55:30 -0000 Subject: [Cluster-devel] cluster/gfs2/libgfs2 fs_ops.c libgfs2.h struct ... Message-ID: <20070212185530.27485.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Changes by: rpeterso at sourceware.org 2007-02-12 18:55:29 Modified files: gfs2/libgfs2 : fs_ops.c libgfs2.h structures.c Log message: Resolves: bz 222308: mkfs and journal addition for GFS2 should produce contiguous journals. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/fs_ops.c.diff?cvsroot=cluster&r1=1.4&r2=1.5 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/libgfs2.h.diff?cvsroot=cluster&r1=1.9&r2=1.10 http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/libgfs2/structures.c.diff?cvsroot=cluster&r1=1.6&r2=1.7 --- cluster/gfs2/libgfs2/fs_ops.c 2006/06/12 20:38:27 1.4 +++ cluster/gfs2/libgfs2/fs_ops.c 2007/02/12 18:55:29 1.5 @@ -209,7 +209,7 @@ ip->i_di.di_height = 1; } -static unsigned int calc_tree_height(struct gfs2_inode *ip, uint64_t size) +unsigned int calc_tree_height(struct gfs2_inode *ip, uint64_t size) { struct gfs2_sbd *sdp = ip->i_sbd; uint64_t *arr; @@ -233,7 +233,7 @@ return height; } -static void build_height(struct gfs2_inode *ip, int height) +void build_height(struct gfs2_inode *ip, int height) { struct gfs2_sbd *sdp = ip->i_sbd; struct gfs2_buffer_head *bh; @@ -335,7 +335,7 @@ } void block_map(struct gfs2_inode *ip, uint64_t lblock, int *new, - uint64_t *dblock, uint32_t *extlen) + uint64_t *dblock, uint32_t *extlen, int prealloc) { struct gfs2_sbd *sdp = ip->i_sbd; struct gfs2_buffer_head *bh; @@ -395,7 +395,8 @@ bh = bread(sdp, *dblock); } - lookup_block(ip, bh, end_of_metadata, mp, create, new, dblock); + if (!prealloc) + lookup_block(ip, bh, end_of_metadata, mp, create, new, dblock); if (extlen && *dblock) { *extlen = 1; @@ -480,7 +481,7 @@ amount = sdp->bsize - o; if (!extlen) - block_map(ip, lblock, ¬_new, &dblock, &extlen); + block_map(ip, lblock, ¬_new, &dblock, &extlen, FALSE); if (dblock) { bh = bread(sdp, dblock); @@ -552,7 +553,7 @@ if (!extlen) { new = TRUE; - block_map(ip, lblock, &new, &dblock, &extlen); + block_map(ip, lblock, &new, &dblock, &extlen, FALSE); } if (new) { @@ -583,7 +584,8 @@ return copied; } -struct gfs2_buffer_head *get_file_buf(struct gfs2_inode *ip, uint64_t lbn) +struct gfs2_buffer_head *get_file_buf(struct gfs2_inode *ip, uint64_t lbn, + int prealloc) { struct gfs2_sbd *sdp = ip->i_sbd; uint64_t dbn; @@ -592,11 +594,11 @@ if (inode_is_stuffed(ip)) unstuff_dinode(ip); - block_map(ip, lbn, &new, &dbn, NULL); + block_map(ip, lbn, &new, &dbn, NULL, prealloc); if (!dbn) die("get_file_buf\n"); - if (new && + if (!prealloc && new && ip->i_di.di_size < (lbn + 1) << sdp->bsize_shift) ip->i_di.di_size = (lbn + 1) << sdp->bsize_shift; --- cluster/gfs2/libgfs2/libgfs2.h 2007/01/23 19:23:06 1.9 +++ cluster/gfs2/libgfs2/libgfs2.h 2007/02/12 18:55:29 1.10 @@ -391,7 +391,8 @@ uint64_t offset, unsigned int size); int gfs2_writei(struct gfs2_inode *ip, void *buf, uint64_t offset, unsigned int size); -struct gfs2_buffer_head *get_file_buf(struct gfs2_inode *ip, uint64_t lbn); +struct gfs2_buffer_head *get_file_buf(struct gfs2_inode *ip, uint64_t lbn, + int prealloc); struct gfs2_buffer_head *init_dinode(struct gfs2_sbd *sdp, struct gfs2_inum *inum, unsigned int mode, uint32_t flags, @@ -408,7 +409,7 @@ int gfs2_dirent_del(struct gfs2_inode *dip, struct gfs2_buffer_head *bh, const char *filename, int filename_len); void block_map(struct gfs2_inode *ip, uint64_t lblock, int *new, - uint64_t *dblock, uint32_t *extlen); + uint64_t *dblock, uint32_t *extlen, int prealloc); void gfs2_get_leaf_nr(struct gfs2_inode *dip, uint32_t index, uint64_t *leaf_out); int gfs2_freedi(struct gfs2_sbd *sdp, uint64_t block); @@ -418,6 +419,10 @@ struct gfs2_dirent **dent); int gfs2_dirent_next(struct gfs2_inode *dip, struct gfs2_buffer_head *bh, struct gfs2_dirent **dent); +void build_height(struct gfs2_inode *ip, int height); +unsigned int calc_tree_height(struct gfs2_inode *ip, uint64_t size); +void write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip, unsigned int j, + unsigned int blocks); /** * device_size - figure out a device's size --- cluster/gfs2/libgfs2/structures.c 2006/11/22 18:39:38 1.6 +++ cluster/gfs2/libgfs2/structures.c 2007/02/12 18:55:29 1.7 @@ -83,20 +83,19 @@ } } -void build_journal(struct gfs2_inode *jindex, unsigned int j) +void write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip, unsigned int j, + unsigned int blocks) { - struct gfs2_sbd *sdp = jindex->i_sbd; - char name[256]; - struct gfs2_inode *ip; struct gfs2_log_header lh; - unsigned int blocks = sdp->jsize << 20 >> sdp->bsize_shift; unsigned int x; uint64_t seq = RANDOM(blocks); uint32_t hash; + unsigned int height; - sprintf(name, "journal%u", j); - ip = createi(jindex, name, S_IFREG | 0600, - GFS2_DIF_SYSTEM); + /* Build the height up so our journal blocks will be contiguous and */ + /* not broken up by indirect block pages. */ + height = calc_tree_height(ip, (blocks + 1) * sdp->bsize); + build_height(ip, height); memset(&lh, 0, sizeof(struct gfs2_log_header)); lh.lh_header.mh_magic = GFS2_MAGIC; @@ -105,9 +104,15 @@ lh.lh_flags = GFS2_LOG_HEAD_UNMOUNT; for (x = 0; x < blocks; x++) { - struct gfs2_buffer_head *bh = get_file_buf(ip, ip->i_di.di_size >> sdp->bsize_shift); + struct gfs2_buffer_head *bh = get_file_buf(ip, x, TRUE); + if (!bh) + die("write_journal\n"); + brelse(bh, updated); + } + for (x = 0; x < blocks; x++) { + struct gfs2_buffer_head *bh = get_file_buf(ip, x, FALSE); if (!bh) - die("build_journals\n"); + die("write_journal\n"); lh.lh_sequence = seq; lh.lh_blkno = x; @@ -125,8 +130,6 @@ printf("\nJournal %u:\n", j); gfs2_dinode_print(&ip->i_di); } - - inode_put(ip, updated); } void @@ -138,8 +141,15 @@ jindex = createi(sdp->master_dir, "jindex", S_IFDIR | 0700, GFS2_DIF_SYSTEM); - for (j = 0; j < sdp->md.journals; j++) - build_journal(jindex, j); + for (j = 0; j < sdp->md.journals; j++) { + char name[256]; + struct gfs2_inode *ip; + + sprintf(name, "journal%u", j); + ip = createi(jindex, name, S_IFREG | 0600, GFS2_DIF_SYSTEM); + write_journal(sdp, ip, j, sdp->jsize << 20 >> sdp->bsize_shift); + inode_put(ip, updated); + } if (sdp->debug) { printf("\nJindex:\n"); @@ -209,7 +219,7 @@ GFS2_DIF_SYSTEM); for (x = 0; x < blocks; x++) { - struct gfs2_buffer_head *bh = get_file_buf(ip, ip->i_di.di_size >> sdp->bsize_shift); + struct gfs2_buffer_head *bh = get_file_buf(ip, ip->i_di.di_size >> sdp->bsize_shift, FALSE); if (!bh) die("build_quota_change\n");