[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