tux3: Use new dleaf2_write() for map_region2()

New dleaf2_write() doesn't require to read exists extents. So, now, we
can call btree_write() without btree_read() simply.

Note, this removes overwrite mode temporary. Later patch will adds new
overwrite mode.

Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
diff --git a/fs/tux3/filemap.c b/fs/tux3/filemap.c
index 5d054fe..cd81980 100644
--- a/fs/tux3/filemap.c
+++ b/fs/tux3/filemap.c
@@ -473,17 +473,7 @@
 			goto out_unlock;
 		}
 	}
-
 	if (has_root(btree)) {
-		struct dleaf_req rq = {
-			.key = {
-				.start	= start,
-				.len	= count,
-			},
-			.seg_max	= seg_max,
-			.seg		= seg,
-		};
-
 		cursor = alloc_cursor(btree, 1); /* allows for depth increase */
 		if (!cursor) {
 			segs = -ENOMEM;
@@ -495,68 +485,59 @@
 			segs = err;
 			goto out_unlock;
 		}
-		/* Read extents from data btree */
-		err = btree_read(cursor, &rq.key);
-		if (err) {
-			segs = err;
-			goto out_unlock;
+	}
+
+	if (mode == MAP_READ) {
+		if (has_root(btree)) {
+			struct dleaf_req rq = {
+				.key = {
+					.start	= start,
+					.len	= count,
+				},
+				.seg_max	= seg_max,
+				.seg		= seg,
+			};
+
+			/* Read extents from data btree */
+			err = btree_read(cursor, &rq.key);
+			if (err) {
+				segs = err;
+				goto out_unlock;
+			}
+			segs = rq.seg_cnt;
+			/*
+			 * Read might be partial. (due to seg_max, or FIXME:
+			 * lack of read for multiple leaves)
+			 */
+		} else {
+			/* btree doesn't have root yet */
+			segs = 1;
+			seg[0].block = 0;
+			seg[0].count = count;
+			seg[0].state = BLOCK_SEG_HOLE;
 		}
-		segs = rq.seg_cnt;
-		/*
-		 * Read might be partial. (due to seg_max, or FIXME:
-		 * lack of read for multiple leaves)
-		 */
-		count = seg_total_count(seg, segs);
+		assert(segs);
 	} else {
-		assert(mode == MAP_READ);
-		/* btree doesn't have root yet */
-		segs = 1;
-		seg[0].block = 0;
-		seg[0].count = count;
-		seg[0].state = BLOCK_SEG_HOLE;
-	}
-	assert(segs);
-
-	if (mode == MAP_READ)
-		goto out_release;
-
-	if (mode == MAP_REDIRECT) {
-		/* Change the seg[] to redirect this region as one extent */
-		unsigned total = 0;
-		for (int i = 0; i < segs; i++) {
-			/* Logging overwritten extents as free */
-			if (seg[i].state != BLOCK_SEG_HOLE)
-				map_bfree(inode, seg[i].block, seg[i].count);
-			total += seg[i].count;
-		}
-		assert(total == count);
-		segs = 1;
-		seg[0].block = 0;
-		seg[0].count = total;
-		seg[0].state = BLOCK_SEG_HOLE;
+		/* Write extents from data btree */
+		struct dleaf_req rq = {
+			.key = {
+				.start	= start,
+				.len	= count,
+			},
+			.seg_max	= seg_max,
+			.seg		= seg,
+			.overwrite	= mode != MAP_REDIRECT,
+			.seg_find	= seg_find,
+			.seg_alloc	= seg_alloc,
+			.seg_free	= seg_free,
+		};
+		err = btree_write(cursor, &rq.key);
+		if (err)
+			segs = err;
+		else
+			segs = rq.seg_cnt;
 	}
 
-	/* Write extents from data btree */
-	struct dleaf_req rq = {
-		.key = {
-			.start	= start,
-			.len	= count,
-		},
-		.seg_cnt	= segs,
-		.seg_max	= seg_max,
-		.seg		= seg,
-		.seg_find	= seg_find,
-		.seg_alloc	= seg_alloc,
-		.seg_free	= seg_free,
-	};
-	err = btree_write(cursor, &rq.key);
-	if (err) {
-		segs = err;
-		goto out_release;
-	}
-	segs = rq.seg_cnt;
-
-out_release:
 	if (cursor)
 		release_cursor(cursor);
 out_unlock: