From: Amir Goldstein <amir73il@users.sf.net>
To: Theodore Tso <tytso@mit.edu>
Cc: linux-ext4@vger.kernel.org, Amir Goldstein <amir73il@users.sf.net>
Subject: [PATCH 4/8] e2fsprogs: Next3 snapshot control with chattr/lsattr -X.
Date: Wed, 05 May 2010 21:28:52 +0300 [thread overview]
Message-ID: <1273084136-6286-5-git-send-email-amir73il@users.sf.net> (raw)
In-Reply-To: <1273084136-6286-1-git-send-email-amir73il@users.sf.net>
Set/clear snapshots parent directory with chattr +/-x.
Take/delete snapshot with chattr -X +/-S.
Enable/disable snapshot with chattr -X +/-n.
View snapshot status with lsattr -X.
Signed-off-by: Amir Goldstein <amir73il@users.sf.net>
---
lib/e2p/e2p.h | 1 +
lib/e2p/pf.c | 17 ++++++++++++++++-
lib/ext2fs/ext2_fs.h | 13 +++++++++++++
misc/chattr.c | 26 ++++++++++++++++++++++++--
misc/lsattr.c | 9 ++++++---
5 files changed, 60 insertions(+), 6 deletions(-)
diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h
index 8a13f5f..c81890b 100644
--- a/lib/e2p/e2p.h
+++ b/lib/e2p/e2p.h
@@ -17,6 +17,7 @@
/* `options' for print_flags() */
#define PFOPT_LONG 1 /* Must be 1 for compatibility with `int long_format'. */
+#define PFOPT_SNAPSHOT 2
int fgetflags (const char * name, unsigned long * flags);
diff --git a/lib/e2p/pf.c b/lib/e2p/pf.c
index 4a61176..acb9f87 100644
--- a/lib/e2p/pf.c
+++ b/lib/e2p/pf.c
@@ -46,16 +46,31 @@ static struct flags_name flags_array[] = {
{ EXT2_TOPDIR_FL, "T", "Top_of_Directory_Hierarchies" },
{ EXT4_EXTENTS_FL, "e", "Extents" },
{ EXT4_HUGE_FILE_FL, "h", "Huge_file" },
+ { NEXT3_SNAPFILE_FL, "x", "Snapshot_File" },
+ { 0, NULL, NULL }
+};
+
+static struct flags_name snapshot_flags_array[] = {
+ { NEXT3_SNAPFILE_LIST_FL, "S", "on_liSt" },
+ { NEXT3_SNAPFILE_ENABLED_FL, "n", "eNabled" },
+ { NEXT3_SNAPFILE_ACTIVE_FL, "a", "Active" },
+ { NEXT3_SNAPFILE_INUSE_FL, "p", "inuse_by_Previous" },
+ { NEXT3_SNAPFILE_DELETED_FL, "s", "Deleted" },
+ { NEXT3_SNAPFILE_SHRUNK_FL, "h", "sHrunk" },
+ { NEXT3_SNAPFILE_OPEN_FL, "o", "mOunted" },
+ { NEXT3_SNAPFILE_TAGGED_FL, "t", "Tagged" },
{ 0, NULL, NULL }
};
void print_flags (FILE * f, unsigned long flags, unsigned options)
{
+ struct flags_name *array = ((options & PFOPT_SNAPSHOT) ?
+ snapshot_flags_array : flags_array);
int long_opt = (options & PFOPT_LONG);
struct flags_name *fp;
int first = 1;
- for (fp = flags_array; fp->flag != 0; fp++) {
+ for (fp = array; fp->flag != 0; fp++) {
if (flags & fp->flag) {
if (long_opt) {
if (first)
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index 5e4b163..b2655e6 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -279,6 +279,19 @@ struct ext2_dx_countlimit {
#define EXT4_HUGE_FILE_FL 0x00040000 /* Set to each huge file */
#define EXT4_EXTENTS_FL 0x00080000 /* Inode uses extents */
#define EXT4_EOFBLOCKS_FL 0x00400000 /* Blocks allocated beyond EOF */
+/* snapshot non-persistent status flags - overlaps ext4 flags */
+#define NEXT3_SNAPFILE_LIST_FL 0x00100000 /* snapshot is on list */
+#define NEXT3_SNAPFILE_ACTIVE_FL 0x00200000 /* snapshot is active */
+#define NEXT3_SNAPFILE_OPEN_FL 0x00400000 /* snapshot is mounted */
+#define NEXT3_SNAPFILE_INUSE_FL 0x00800000 /* snapshot is in-use */
+/* end of snapshot non-persistent status flags */
+/* snapshot persistent flags */
+#define NEXT3_SNAPFILE_FL 0x01000000 /* snapshot file */
+#define NEXT3_SNAPFILE_ENABLED_FL 0x02000000 /* snapshot is enabled */
+#define NEXT3_SNAPFILE_DELETED_FL 0x04000000 /* snapshot is deleted */
+#define NEXT3_SNAPFILE_SHRUNK_FL 0x08000000 /* snapshot is shrunk */
+#define NEXT3_SNAPFILE_TAGGED_FL 0x10000000 /* snapshot is tagged */
+/* end of snapshot persistent flags */
#define EXT2_RESERVED_FL 0x80000000 /* reserved for ext2 lib */
#define EXT2_FL_USER_VISIBLE 0x004BDFFF /* User visible flags */
diff --git a/misc/chattr.c b/misc/chattr.c
index de33b08..69e6493 100644
--- a/misc/chattr.c
+++ b/misc/chattr.c
@@ -82,7 +82,10 @@ static unsigned long sf;
static void usage(void)
{
fprintf(stderr,
- _("Usage: %s [-RVf] [-+=AacDdeijsSu] [-v version] files...\n"),
+ _("Usage: %s [-RVf] [-+=AacDdeijsSux] [-v version] files...\n"),
+ program_name);
+ fprintf(stderr,
+ _("Usage: %s -X [-+=Snapshot] files...\n"),
program_name);
exit(1);
}
@@ -92,7 +95,7 @@ struct flags_char {
char optchar;
};
-static const struct flags_char flags_array[] = {
+static const struct flags_char ext2_flags_array[] = {
{ EXT2_NOATIME_FL, 'A' },
{ EXT2_SYNC_FL, 'S' },
{ EXT2_DIRSYNC_FL, 'D' },
@@ -106,6 +109,21 @@ static const struct flags_char flags_array[] = {
{ EXT2_UNRM_FL, 'u' },
{ EXT2_NOTAIL_FL, 't' },
{ EXT2_TOPDIR_FL, 'T' },
+ { NEXT3_SNAPFILE_FL, 'x' },
+ { 0, 0 }
+};
+
+static const struct flags_char *flags_array = ext2_flags_array;
+
+static struct flags_char snapshot_flags_array[] = {
+ { NEXT3_SNAPFILE_LIST_FL, 'S' },
+ { NEXT3_SNAPFILE_ENABLED_FL, 'n' },
+ { NEXT3_SNAPFILE_ACTIVE_FL, 'a' },
+ { NEXT3_SNAPFILE_INUSE_FL, 'p' },
+ { NEXT3_SNAPFILE_DELETED_FL, 's' },
+ { NEXT3_SNAPFILE_SHRUNK_FL, 'h' },
+ { NEXT3_SNAPFILE_OPEN_FL, 'o' },
+ { NEXT3_SNAPFILE_TAGGED_FL, 't' },
{ 0, 0 }
};
@@ -131,6 +149,10 @@ static int decode_arg (int * i, int argc, char ** argv)
{
case '-':
for (p = &argv[*i][1]; *p; p++) {
+ if (*p == 'X') {
+ flags_array = snapshot_flags_array;
+ continue;
+ }
if (*p == 'R') {
recursive = 1;
continue;
diff --git a/misc/lsattr.c b/misc/lsattr.c
index 15b17ad..2864075 100644
--- a/misc/lsattr.c
+++ b/misc/lsattr.c
@@ -70,7 +70,7 @@ static int generation_opt;
static void usage(void)
{
- fprintf(stderr, _("Usage: %s [-RVadlv] [files...]\n"), program_name);
+ fprintf(stderr, _("Usage: %s [-XRVadlv] [files...]\n"), program_name);
exit(1);
}
@@ -169,9 +169,12 @@ int main (int argc, char ** argv)
#endif
if (argc && *argv)
program_name = *argv;
- while ((c = getopt (argc, argv, "RVadlv")) != EOF)
+ while ((c = getopt (argc, argv, "XRVadlv")) != EOF)
switch (c)
{
+ case 'X':
+ pf_options |= PFOPT_SNAPSHOT;
+ break;
case 'R':
recursive = 1;
break;
@@ -185,7 +188,7 @@ int main (int argc, char ** argv)
dirs_opt = 1;
break;
case 'l':
- pf_options = PFOPT_LONG;
+ pf_options |= PFOPT_LONG;
break;
case 'v':
generation_opt = 1;
--
1.6.6
next prev parent reply other threads:[~2010-05-05 18:52 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-05-05 18:28 [PATCHSET] e2fsprogs: Next3 patch series Amir Goldstein
2010-05-05 18:28 ` [PATCH 1/8] e2fsprogs: Next3 on-disk format changes Amir Goldstein
2010-05-05 18:28 ` [PATCH 2/8] e2fsprogs: Add big_journal feature for Next3 Amir Goldstein
2010-05-05 18:28 ` [PATCH 3/8] e2fsprogs: Add exclude_inode " Amir Goldstein
2010-05-05 18:28 ` Amir Goldstein [this message]
2010-05-05 18:28 ` [PATCH 5/8] e2fsprogs: Add has_snapshot " Amir Goldstein
2010-05-05 18:28 ` [PATCH 6/8] e2fsprogs: Cleanup Next3 snapshot list when removing has_snapshot feature Amir Goldstein
2010-05-05 18:28 ` [PATCH 7/8] e2fsprogs: Check Next3 exclude bitmap on fsck Amir Goldstein
2010-05-05 18:28 ` [PATCH 8/8] e2fsprogs: Dump Next3 message buffer " Amir Goldstein
-- strict thread matches above, loose matches on Subject: below --
2010-06-21 18:17 [PATCH 4/8] e2fsprogs: Next3 snapshot control with chattr/lsattr -X Andreas Dilger
2010-06-22 8:56 ` Amir G.
2010-07-26 8:01 ` Amir G.
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1273084136-6286-5-git-send-email-amir73il@users.sf.net \
--to=amir73il@users.sf.net \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).