[Ocfs2-tools-commits] smushran commits r437 - in trunk: libocfs2
tunefs.ocfs2
svn-commits at oss.oracle.com
svn-commits at oss.oracle.com
Tue Nov 23 15:12:01 CST 2004
Author: smushran
Date: 2004-11-23 15:11:59 -0600 (Tue, 23 Nov 2004)
New Revision: 437
Modified:
trunk/libocfs2/expanddir.c
trunk/libocfs2/extend_file.c
trunk/tunefs.ocfs2/tunefs.c
Log:
ocfs2_extend_allocation plugged into tunefs
Modified: trunk/libocfs2/expanddir.c
===================================================================
--- trunk/libocfs2/expanddir.c 2004-11-23 00:41:10 UTC (rev 436)
+++ trunk/libocfs2/expanddir.c 2004-11-23 21:11:59 UTC (rev 437)
@@ -64,10 +64,6 @@
if (ret)
goto bail;
- ret = ocfs2_extent_map_init(fs, cinode);
- if (ret)
- goto bail;
-
inode = cinode->ci_inode;
/* This relies on the fact that i_size of a directory is a
* multiple of blocksize */
@@ -76,11 +72,22 @@
totl_blks = ocfs2_clusters_to_blocks(fs, inode->i_clusters);
if (used_blks >= totl_blks) {
- /* TODO file needs to be extended */
- ret = OCFS2_ET_EXPAND_DIR_ERR;
- goto bail;
+ ocfs2_free_cached_inode(fs, cinode);
+
+ /* extend the directory */
+ ret = ocfs2_extend_allocation(fs, dir, 1);
+ if (ret)
+ goto bail;
+
+ ret = ocfs2_read_cached_inode(fs, dir, &cinode);
+ if (ret)
+ goto bail;
}
+ ret = ocfs2_extent_map_init(fs, cinode);
+ if (ret)
+ goto bail;
+
/* get the next free block */
ret = ocfs2_extent_map_get_blocks(cinode, used_blks, 1,
&new_blk, &contig);
Modified: trunk/libocfs2/extend_file.c
===================================================================
--- trunk/libocfs2/extend_file.c 2004-11-23 00:41:10 UTC (rev 436)
+++ trunk/libocfs2/extend_file.c 2004-11-23 21:11:59 UTC (rev 437)
@@ -298,6 +298,10 @@
errcode_t ocfs2_extend_allocation(ocfs2_filesys *fs, uint64_t ino,
uint64_t new_clusters)
{
+ errcode_t ret = 0;
+ uint64_t n_clusters = 0;
+ uint64_t clustno;
+
/*
* This should be, in essence:
*
@@ -308,5 +312,24 @@
* }
*/
- return 0;
+ if (!(fs->fs_flags & OCFS2_FLAG_RW))
+ return OCFS2_ET_RO_FILESYS;
+
+ while (new_clusters) {
+ /*n_clusters = ocfs2_new_clusters(); */
+
+ if (n_clusters == 0) {
+ ret = OCFS2_ET_NO_SPACE;
+ goto bail;
+ }
+
+ ret = ocfs2_insert_extent(fs, ino, clustno, n_clusters);
+ if (ret)
+ goto bail;
+
+ new_clusters -= n_clusters;
+ }
+
+bail:
+ return ret;
}
Modified: trunk/tunefs.ocfs2/tunefs.c
===================================================================
--- trunk/tunefs.ocfs2/tunefs.c 2004-11-23 00:41:10 UTC (rev 436)
+++ trunk/tunefs.ocfs2/tunefs.c 2004-11-23 21:11:59 UTC (rev 437)
@@ -221,16 +221,6 @@
ret = get_number(optarg, &val);
if (ret)
exit(1);
-
-// if (ret || val > MAX_VOL_SIZE) {
-// com_err(opts.progname, 0,
-// "Invalid device size %s: must be "
-// "between %d and %"PRIu64" bytes",
-// optarg,
-// BOO, MAX_VOL_SIZE);
-// exit(1);
-// }
-
opts.vol_size = val;
break;
@@ -316,6 +306,45 @@
}
/*
+ * get_default_journal_size()
+ *
+ */
+static errcode_t get_default_journal_size(ocfs2_filesys *fs, uint64_t *jrnl_size)
+{
+ errcode_t ret;
+ char jrnl_node0[40];
+ uint64_t blkno;
+ char *buf = NULL;
+ ocfs2_dinode *di;
+
+ snprintf (jrnl_node0, sizeof(jrnl_node0),
+ sysfile_info[JOURNAL_SYSTEM_INODE].name, 0);
+
+ ret = ocfs2_lookup(fs, fs->fs_sysdir_blkno, jrnl_node0,
+ strlen(jrnl_node0), NULL, &blkno);
+ if (ret)
+ goto bail;
+
+
+ ret = ocfs2_malloc_block(fs->fs_io, &buf);
+ if (ret)
+ return ret;
+
+ ret = ocfs2_read_inode(fs, blkno, buf);
+ if (ret)
+ goto bail;
+
+ di = (ocfs2_dinode *)buf;
+ *jrnl_size = (di->i_clusters <<
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits);
+bail:
+ if (buf)
+ ocfs2_free(&buf);
+
+ return ret;
+}
+
+/*
* update_volume_label()
*
*/
@@ -353,7 +382,65 @@
*/
static errcode_t update_journal_size(ocfs2_filesys *fs, int *changed)
{
- return 0;
+ errcode_t ret = 0;
+ char jrnl_file[40];
+ uint64_t blkno;
+ int i;
+ uint16_t max_nodes = OCFS2_RAW_SB(fs->fs_super)->s_max_nodes;
+ uint64_t num_clusters;
+ char *buf = NULL;
+ ocfs2_dinode *di;
+
+ num_clusters = opts.jrnl_size >>
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+
+ ret = ocfs2_malloc_block(fs->fs_io, &buf);
+ if (ret)
+ return ret;
+
+ for (i = 0; i < max_nodes; ++i) {
+ snprintf (jrnl_file, sizeof(jrnl_file),
+ sysfile_info[JOURNAL_SYSTEM_INODE].name, i);
+
+ ret = ocfs2_lookup(fs, fs->fs_sysdir_blkno, jrnl_file,
+ strlen(jrnl_file), NULL, &blkno);
+ if (ret)
+ goto bail;
+
+
+ ret = ocfs2_read_inode(fs, blkno, buf);
+ if (ret)
+ goto bail;
+
+ di = (ocfs2_dinode *)buf;
+ if (num_clusters <= di->i_clusters)
+ continue;
+
+ ret = ocfs2_extend_allocation(fs, blkno,
+ (num_clusters - di->i_clusters));
+ if (ret)
+ goto bail;
+
+ ret = ocfs2_read_inode(fs, blkno, buf);
+ if (ret)
+ goto bail;
+
+ di = (ocfs2_dinode *)buf;
+ di->i_size = di->i_clusters <<
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+
+ ret = ocfs2_write_inode(fs, blkno, buf);
+ if (ret)
+ goto bail;
+
+ break;
+ }
+
+bail:
+ if (buf)
+ ocfs2_free(&buf);
+
+ return ret;
}
/*
@@ -362,6 +449,7 @@
*/
static errcode_t update_volume_size(ocfs2_filesys *fs, int *changed)
{
+ printf("TODO: update_volume_size\n");
return 0;
}
@@ -373,8 +461,14 @@
{
errcode_t ret = 0;
ocfs2_filesys *fs = NULL;
- int write_super = 0;
+ int upd_label = 0;
+ int upd_nodes = 0;
+ int upd_jrnls = 0;
+ int upd_vsize = 0;
uint16_t tmp;
+ uint64_t def_jrnl_size = 0;
+ uint64_t num_clusters;
+ uint64_t vol_size = 0;
initialize_ocfs_error_table();
@@ -418,14 +512,36 @@
/* validate journal size */
if (opts.jrnl_size) {
-// printf("Changing journal size %"PRIu64" to %"PRIu64"\n",
-// s->journal_size_in_bytes, opts.jrnl_size);
+ ret = get_default_journal_size(fs, &def_jrnl_size);
+ if (ret)
+ goto bail;
+
+ num_clusters = (opts.jrnl_size + fs->fs_clustersize - 1) >>
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+
+ opts.jrnl_size = num_clusters <<
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+
+ if (opts.jrnl_size > def_jrnl_size)
+ printf("Changing journal size %"PRIu64" to %"PRIu64"\n",
+ def_jrnl_size, opts.jrnl_size);
+ else {
+ printf("ERROR: Journal size %"PRIu64" has to be larger "
+ "than %"PRIu64"\n", opts.jrnl_size, def_jrnl_size);
+ goto bail;
+ }
}
/* validate volume size */
if (opts.vol_size) {
- uint64_t vol_size = fs->fs_clusters <<
- OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+ num_clusters = (opts.vol_size + fs->fs_clustersize - 1) >>
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+ opts.vol_size = num_clusters <<
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+
+ vol_size = fs->fs_clusters <<
+ OCFS2_RAW_SB(fs->fs_super)->s_clustersize_bits;
+
printf("Changing volume size %"PRIu64" to %"PRIu64"\n",
vol_size, opts.vol_size);
}
@@ -438,39 +554,48 @@
}
/* update volume label */
- if (opts.vol_label)
- update_volume_label(fs, &write_super);
+ if (opts.vol_label) {
+ update_volume_label(fs, &upd_label);
+ if (upd_label)
+ printf("Changed volume label\n");
+ }
/* update number of nodes */
if (opts.num_nodes) {
- ret = update_nodes(fs, &write_super);
+ ret = update_nodes(fs, &upd_nodes);
if (ret) {
com_err(opts.progname, ret, "while updating nodes");
goto bail;
}
+ if (upd_nodes)
+ printf("Added nodes\n");
}
/* update journal size */
if (opts.jrnl_size) {
- ret = update_journal_size(fs, &write_super);
+ ret = update_journal_size(fs, &upd_jrnls);
if (ret) {
com_err(opts.progname, ret, "while updating journal size");
goto bail;
}
+ if (upd_jrnls)
+ printf("Resized journals\n");
}
/* update volume size */
if (opts.vol_size) {
- ret = update_volume_size(fs, &write_super);
+ ret = update_volume_size(fs, &upd_vsize);
if (ret) {
com_err(opts.progname, ret, "while updating volume size");
goto bail;
}
+ if (upd_vsize)
+ printf("Resized volume\n");
}
/* write superblock */
- if (write_super) {
+ if (upd_label || upd_nodes || upd_vsize) {
ret = ocfs2_write_super(fs);
if (ret) {
com_err(opts.progname, ret, "while writing superblock");
More information about the Ocfs2-tools-commits
mailing list