/** * find_journal_block - figure out where a journal starts, given the name * Returns: journal block number, changes j_size to the journal size */ uint64_t find_journal_block(const char *journal, uint64_t *j_size) { int journal_num; uint64_t jindex_block, jblock = 0; int amtread; struct gfs2_buffer_head *jindex_bh, *j_bh; char jbuf[sbd.bsize]; journal_num = atoi(journal + 7); if (journal_num < 0) return 0; /* Figure out the block of the jindex file */ if (sbd.gfs1) jindex_block = sbd1->sb_jindex_di.no_addr; else jindex_block = masterblock("jindex"); /* read in the block */ jindex_bh = bread(&sbd, jindex_block); /* get the dinode data from it. */ gfs2_dinode_in(&di, jindex_bh); /* parse disk inode to struct*/ if (!sbd.gfs1) do_dinode_extended(&di, jindex_bh); /* parse dir. */ if (sbd.gfs1) { struct gfs2_inode *jiinode; struct gfs_jindex ji; jiinode = lgfs2_inode_get(&sbd, jindex_bh); if (jiinode == NULL) return 0; amtread = gfs2_readi(jiinode, (void *)&jbuf, journal_num * sizeof(struct gfs_jindex), sizeof(struct gfs_jindex)); if (amtread) { gfs_jindex_in(&ji, jbuf); jblock = ji.ji_addr; *j_size = ji.ji_nsegment * 0x10; } inode_put(&jiinode); } else { struct gfs2_dinode jdi; if (journal_num > indirect->ii[0].dirents - 2) return 0; jblock = indirect->ii[0].dirent[journal_num + 2].block; j_bh = bread(&sbd, jblock); gfs2_dinode_in(&jdi, j_bh);/* parse dinode to struct */ *j_size = jdi.di_size; brelse(j_bh); } brelse(jindex_bh); return jblock; }
int gfs2_inode_refresh(struct gfs2_inode *ip) { struct buffer_head *dibh; int error; error = gfs2_meta_inode_buffer(ip, &dibh); if (error) return error; error = gfs2_dinode_in(ip, dibh->b_data); brelse(dibh); clear_bit(GIF_INVALID, &ip->i_flags); return error; }
int gfs2_inode_refresh(struct gfs2_inode *ip) { struct buffer_head *dibh; int error; error = gfs2_meta_inode_buffer(ip, &dibh); if (error) return error; if (gfs2_metatype_check(GFS2_SB(&ip->i_inode), dibh, GFS2_METATYPE_DI)) { brelse(dibh); return -EIO; } error = gfs2_dinode_in(ip, dibh->b_data); brelse(dibh); clear_bit(GIF_INVALID, &ip->i_flags); return error; }