From patchwork Tue Apr 26 08:02:41 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Philipp X-Patchwork-Id: 731832 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3Q83V2D031264 for ; Tue, 26 Apr 2011 08:03:31 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758568Ab1DZIDZ (ORCPT ); Tue, 26 Apr 2011 04:03:25 -0400 Received: from mail-ww0-f42.google.com ([74.125.82.42]:50225 "EHLO mail-ww0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756318Ab1DZIDH (ORCPT ); Tue, 26 Apr 2011 04:03:07 -0400 Received: by wwk4 with SMTP id 4so1975075wwk.1 for ; Tue, 26 Apr 2011 01:03:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=/Dj4avjaFh3EPGJIGNkYCY//4ezNdjpnD9NcEk2VeYM=; b=ZwwA3TusFKEJzBLr10XT5WfDIjIGH008WtCSLsTwcHfuFHfguFks2RpQpTQHuV/LVP Aancf75uDwBqRIN1uxPjoAn6PPLHTB9kZdvb/AkTt8xpWFkBi2n8JJ4fiM0NQwx+BlNT oqq1PS8RxwKJ5YjSE3Qdyv7NxjxRQAm35yH6I= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=eHikDgpCmwx+Tbd4KJ003ThNxwt4LFhFnQ4ilcADaof9/UzTx8FfXnWjjrVeyvge2L rIc7Q030/Q/Tfou5ZIVLFnLAajjGzf4gt/aldqmx2ydqgs08UTKlnAXph8AN4UxSkmjP C3HeI7COYFPSkrPb5qedAtkgEbG2P6nezUWyc= Received: by 10.216.6.27 with SMTP id 27mr408176wem.69.1303804984855; Tue, 26 Apr 2011 01:03:04 -0700 (PDT) Received: from localhost.localdomain (84-119-52-190.dynamic.xdsl-line.inode.at [84.119.52.190]) by mx.google.com with ESMTPS id j49sm2865644wer.38.2011.04.26.01.03.03 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 26 Apr 2011 01:03:04 -0700 (PDT) From: Andreas Philipp To: linux-btrfs@vger.kernel.org Cc: Andreas Philipp , chris.mason@oracle.com, dcrmorgado@gmail.com, kreijack@libero.it, lizf@cn.fujitsu.com Subject: [PATCH 2/5] Add support for read-only subvolumes. Date: Tue, 26 Apr 2011 10:02:41 +0200 Message-Id: <1303804964-2840-3-git-send-email-philipp.andreas@gmail.com> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1303804964-2840-1-git-send-email-philipp.andreas@gmail.com> References: <1303804964-2840-1-git-send-email-philipp.andreas@gmail.com> 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.6 (demeter1.kernel.org [140.211.167.41]); Tue, 26 Apr 2011 08:03:31 +0000 (UTC) Use BTRFS_IOC_CREATE_SNAP_V2 instead of BTRFS_IOC_CREATE_SNAP and add an option for the creation of a readonly snapshot. Signed-off-by: Andreas Philipp --- btrfs_cmds.c | 48 ++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 40 insertions(+), 8 deletions(-) diff --git a/btrfs_cmds.c b/btrfs_cmds.c index 8031c58..9367bac 100644 --- a/btrfs_cmds.c +++ b/btrfs_cmds.c @@ -43,7 +43,7 @@ #ifdef __CHECKER__ #define BLKGETSIZE64 0 -#define BTRFS_IOC_SNAP_CREATE 0 +#define BTRFS_IOC_SNAP_CREATE_V2 0 #define BTRFS_VOL_NAME_MAX 255 struct btrfs_ioctl_vol_args { char name[BTRFS_VOL_NAME_MAX]; }; static inline int ioctl(int fd, int define, void *arg) { return 0; } @@ -310,13 +310,38 @@ int do_subvol_list(int argc, char **argv) int do_clone(int argc, char **argv) { char *subvol, *dst; - int res, fd, fddst, len; + int res, fd, fddst, len, optind = 0, readonly = 0; char *newname; char *dstdir; + struct btrfs_ioctl_vol_args_v2 args; - subvol = argv[1]; - dst = argv[2]; - struct btrfs_ioctl_vol_args args; + memset(&args, 0, sizeof(args)); + + while (1) { + int c = getopt(argc, argv, "r"); + + if (c < 0) + break; + switch (c) { + case 'r': + optind++; + readonly = 1; + break; + default: + fprintf(stderr, + "Invalid arguments for subvolume snapshot\n"); + free(argv); + return 1; + } + } + if (argc - optind < 2) { + fprintf(stderr, "Invalid arguments for subvolume snapshot\n"); + free(argv); + return 1; + } + + subvol = argv[optind+1]; + dst = argv[optind+2]; res = test_issubvolume(subvol); if(res<0){ @@ -372,11 +397,18 @@ int do_clone(int argc, char **argv) return 12; } - printf("Create a snapshot of '%s' in '%s/%s'\n", - subvol, dstdir, newname); + if (readonly) { + args.flags |= BTRFS_SUBVOL_RDONLY; + printf("Create a readonly snapshot of '%s' in '%s/%s'\n", + subvol, dstdir, newname); + } else { + printf("Create a snapshot of '%s' in '%s/%s'\n", + subvol, dstdir, newname); + } + args.fd = fd; strcpy(args.name, newname); - res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE, &args); + res = ioctl(fddst, BTRFS_IOC_SNAP_CREATE_V2, &args); close(fd); close(fddst);