[PATCH 1/2] ocfs2: Add group extend for online resize
This patch adds the ability for a userspace program to request an extend of last cluster group on an Ocfs2 file system. The request is made via ioctl, OCFS2_IOC_GROUP_EXTEND. This is derived from EXT3_IOC_GROUP_EXTEND, but is obviously Ocfs2 specific. tunefs.ocfs2 would call this for an online-resize operation if the last cluster group isn't full. Signed-off-by: Tao Ma <tao.ma@oracle.com> Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
This commit is contained in:
@@ -280,3 +280,64 @@ bail:
|
||||
mlog_exit(status);
|
||||
return status;
|
||||
}
|
||||
|
||||
/* Check whether the blkno is the super block or one of the backups. */
|
||||
static void ocfs2_check_super_or_backup(struct super_block *sb,
|
||||
sector_t blkno)
|
||||
{
|
||||
int i;
|
||||
u64 backup_blkno;
|
||||
|
||||
if (blkno == OCFS2_SUPER_BLOCK_BLKNO)
|
||||
return;
|
||||
|
||||
for (i = 0; i < OCFS2_MAX_BACKUP_SUPERBLOCKS; i++) {
|
||||
backup_blkno = ocfs2_backup_super_blkno(sb, i);
|
||||
if (backup_blkno == blkno)
|
||||
return;
|
||||
}
|
||||
|
||||
BUG();
|
||||
}
|
||||
|
||||
/*
|
||||
* Write super block and backups doesn't need to collaborate with journal,
|
||||
* so we don't need to lock ip_io_mutex and inode doesn't need to bea passed
|
||||
* into this function.
|
||||
*/
|
||||
int ocfs2_write_super_or_backup(struct ocfs2_super *osb,
|
||||
struct buffer_head *bh)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
mlog_entry_void();
|
||||
|
||||
BUG_ON(buffer_jbd(bh));
|
||||
ocfs2_check_super_or_backup(osb->sb, bh->b_blocknr);
|
||||
|
||||
if (ocfs2_is_hard_readonly(osb) || ocfs2_is_soft_readonly(osb)) {
|
||||
ret = -EROFS;
|
||||
goto out;
|
||||
}
|
||||
|
||||
lock_buffer(bh);
|
||||
set_buffer_uptodate(bh);
|
||||
|
||||
/* remove from dirty list before I/O. */
|
||||
clear_buffer_dirty(bh);
|
||||
|
||||
get_bh(bh); /* for end_buffer_write_sync() */
|
||||
bh->b_end_io = end_buffer_write_sync;
|
||||
submit_bh(WRITE, bh);
|
||||
|
||||
wait_on_buffer(bh);
|
||||
|
||||
if (!buffer_uptodate(bh)) {
|
||||
ret = -EIO;
|
||||
brelse(bh);
|
||||
}
|
||||
|
||||
out:
|
||||
mlog_exit(ret);
|
||||
return ret;
|
||||
}
|
||||
|
Reference in New Issue
Block a user