From patchwork Mon Aug 2 08:42:00 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Donggeun Kim X-Patchwork-Id: 116463 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.4/8.14.3) with ESMTP id o728ji31027792 for ; Mon, 2 Aug 2010 08:45:44 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753029Ab0HBIpl (ORCPT ); Mon, 2 Aug 2010 04:45:41 -0400 Received: from mailout1.samsung.com ([203.254.224.24]:48417 "EHLO mailout1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751660Ab0HBIpl (ORCPT ); Mon, 2 Aug 2010 04:45:41 -0400 Received: from epmmp1 (mailout1.samsung.com [203.254.224.24]) by mailout1.samsung.com (Sun Java(tm) System Messaging Server 7u3-15.01 64bit (built Feb 12 2010)) with ESMTP id <0L6I00LYGO66RE30@mailout1.samsung.com> for linux-btrfs@vger.kernel.org; Mon, 02 Aug 2010 17:42:06 +0900 (KST) Received: from TNRNDGASPAPP1.tn.corp.samsungelectronics.net ([165.213.149.150]) by mmp1.samsung.com (iPlanet Messaging Server 5.2 Patch 2 (built Jul 14 2004)) with ESMTPA id <0L6I00BIBO665F@mmp1.samsung.com> for linux-btrfs@vger.kernel.org; Mon, 02 Aug 2010 17:42:06 +0900 (KST) Received: from [10.89.53.115] ([10.89.53.115]) by TNRNDGASPAPP1.tn.corp.samsungelectronics.net with Microsoft SMTPSVC(6.0.3790.4675); Mon, 02 Aug 2010 17:42:06 +0900 Date: Mon, 02 Aug 2010 17:42:00 +0900 From: Donggeun Kim Subject: [PATCH] btrfs: Add a new mount option to grow the FS to the limit of the device To: linux-btrfs@vger.kernel.org Cc: chris.mason@oracle.com, kyungmin.park@samsung.com Message-id: <4C5684D8.4080702@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-transfer-encoding: 7BIT User-Agent: Thunderbird 2.0.0.24 (X11/20100411) X-OriginalArrivalTime: 02 Aug 2010 08:42:06.0210 (UTC) FILETIME=[964B0E20:01CB321E] Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 02 Aug 2010 08:45:44 +0000 (UTC) diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index e9bf864..ee71964 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h @@ -1192,6 +1192,7 @@ struct btrfs_root { #define BTRFS_MOUNT_NOSSD (1 << 9) #define BTRFS_MOUNT_DISCARD (1 << 10) #define BTRFS_MOUNT_FORCE_COMPRESS (1 << 11) +#define BTRFS_MOUNT_MAXSIZE (1 << 12) #define btrfs_clear_opt(o, opt) ((o) &= ~BTRFS_MOUNT_##opt) #define btrfs_set_opt(o, opt) ((o) |= BTRFS_MOUNT_##opt) diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c index 34f7c37..a1abf7c 100644 --- a/fs/btrfs/disk-io.c +++ b/fs/btrfs/disk-io.c @@ -1533,6 +1533,9 @@ struct btrfs_root *open_ctree(struct super_block *sb, u32 stripesize; u64 generation; u64 features; + u64 dev_max_size; + u64 dev_old_size; + u64 devid; struct btrfs_key location; struct buffer_head *bh; struct btrfs_root *extent_root = kzalloc(sizeof(struct btrfs_root), @@ -1554,6 +1557,9 @@ struct btrfs_root *open_ctree(struct super_block *sb, struct btrfs_super_block *disk_super; + struct btrfs_trans_handle *trans; + struct btrfs_device *device; + if (!extent_root || !tree_root || !fs_info || !chunk_root || !dev_root || !csum_root) { err = -ENOMEM; @@ -1928,6 +1934,30 @@ struct btrfs_root *open_ctree(struct super_block *sb, btrfs_set_opt(fs_info->mount_opt, SSD); } + if (btrfs_test_opt(tree_root, MAXSIZE)) { + devid = fs_devices->latest_devid; + device = btrfs_find_device(tree_root, devid, NULL, NULL); + if (!device) { + printk(KERN_WARNING "resizer unable to " + "find device %llu\n", + (unsigned long long)devid); + goto fail_trans_kthread; + } + dev_max_size = device->bdev->bd_inode->i_size; + dev_old_size = device->total_bytes; + if (dev_max_size > dev_old_size) { + trans = btrfs_start_transaction(tree_root, 0); + ret = btrfs_grow_device(trans, device, dev_max_size); + if (ret) + printk(KERN_INFO "unable to resize for %s\n", + device->name); + else + printk(KERN_INFO "new size for %s is %llu\n", + device->name, dev_max_size); + btrfs_commit_transaction(trans, tree_root); + } + } + if (btrfs_super_log_root(disk_super) != 0) { u64 bytenr = btrfs_super_log_root(disk_super); diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c index 859ddaa..d6b8cf2 100644 --- a/fs/btrfs/super.c +++ b/fs/btrfs/super.c @@ -68,7 +68,7 @@ enum { Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress, Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit, - Opt_discard, Opt_err, + Opt_discard, Opt_maxsize, Opt_err, }; static match_table_t tokens = { @@ -92,6 +92,7 @@ static match_table_t tokens = { {Opt_flushoncommit, "flushoncommit"}, {Opt_ratio, "metadata_ratio=%d"}, {Opt_discard, "discard"}, + {Opt_maxsize, "maxsize"}, {Opt_err, NULL}, }; @@ -235,6 +236,9 @@ int btrfs_parse_options(struct btrfs_root *root, char *options) case Opt_discard: btrfs_set_opt(info->mount_opt, DISCARD); break; + case Opt_maxsize: + btrfs_set_opt(info->mount_opt, MAXSIZE); + break; case Opt_err: printk(KERN_INFO "btrfs: unrecognized mount option " "'%s'\n", p); @@ -541,6 +545,8 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs) seq_puts(seq, ",flushoncommit"); if (btrfs_test_opt(root, DISCARD)) seq_puts(seq, ",discard"); + if (btrfs_test_opt(root, MAXSIZE)) + seq_puts(seq, ",maxsize"); if (!(root->fs_info->sb->s_flags & MS_POSIXACL)) seq_puts(seq, ",noacl"); return 0;