[PATCH 3/3] btrfs: implement 'start-sync' and 'wait-sync' commands

2010-10-30 Thread Sage Weil
The 'start-sync' command initiates a sync, but does not wait for it to
complete.  A transaction is printed that can be fed to 'wait-sync', which
will wait for it to commit.

'wait-sync' can also be used in combination with 'async-snapshot' to wait
for an async snapshot creation to commit.

Signed-off-by: Sage Weil s...@newdream.net
---
 btrfs.c  |9 +
 btrfs_cmds.c |   49 +
 btrfs_cmds.h |2 ++
 3 files changed, 60 insertions(+), 0 deletions(-)

diff --git a/btrfs.c b/btrfs.c
index c4b9a31..d45ac1f 100644
--- a/btrfs.c
+++ b/btrfs.c
@@ -83,6 +83,15 @@ static struct Command commands[] = {
  filesystem sync, path\n
Force a sync on the filesystem path.
},
+   { do_start_sync, 1,
+ filesystem start-sync, path\n
+   Start a sync on the filesystem path, and print the 
resulting\n
+   transaction id.
+   },
+   { do_wait_sync, 2,
+ filesystem wait-sync, path transid\n
+   Wait for the transaction transid on the filesystem at path 
to commit.
+   },
{ do_resize, 2,
  filesystem resize, [+/-]newsize[gkm]|max filesystem\n
Resize the file system. If 'max' is passed, the filesystem\n
diff --git a/btrfs_cmds.c b/btrfs_cmds.c
index 6da5862..5b5bb15 100644
--- a/btrfs_cmds.c
+++ b/btrfs_cmds.c
@@ -548,6 +548,55 @@ int do_fssync(int argc, char **argv)
return 0;
 }
 
+int do_start_sync(int argc, char **argv)
+{
+   int fd, res;
+   char*path = argv[1];
+   __u64 transid;
+
+   fd = open_file_or_dir(path);
+   if (fd  0) {
+   fprintf(stderr, ERROR: can't access to '%s'\n, path);
+   return 12;
+   }
+
+   printf(StartSync '%s'\n, path);
+   res = ioctl(fd, BTRFS_IOC_START_SYNC, transid);
+   close(fd);
+   if( res  0 ){
+   fprintf(stderr, ERROR: unable to fs-syncing '%s'\n, path);
+   return 16;
+   } else {
+   printf(transid %llu\n, (unsigned long long)transid);
+   }
+
+   return 0;
+}
+
+int do_wait_sync(int argc, char **argv)
+{
+   int fd, res;
+   char*path = argv[1];
+   __u64 transid = atoll(argv[2]);
+
+   fd = open_file_or_dir(path);
+   if (fd  0) {
+   fprintf(stderr, ERROR: can't access to '%s'\n, path);
+   return 12;
+   }
+
+   printf(WaitSync '%s' transid %llu\n, path, (unsigned long 
long)transid);
+   res = ioctl(fd, BTRFS_IOC_WAIT_SYNC, transid);
+   close(fd);
+   if( res  0 ){
+   fprintf(stderr, ERROR: unable to wait-sync on '%s' transid 
%llu: %s\n, path,
+   (unsigned long long)transid, strerror(errno));
+   return 16;
+   }
+
+   return 0;
+}
+
 int do_scan(int argc, char **argv)
 {
int i, fd;
diff --git a/btrfs_cmds.h b/btrfs_cmds.h
index c44dc79..e0e5ceb 100644
--- a/btrfs_cmds.h
+++ b/btrfs_cmds.h
@@ -20,6 +20,8 @@ int do_create_snap_async(int nargs, char **argv);
 int do_delete_subvolume(int nargs, char **argv);
 int do_create_subvol(int nargs, char **argv);
 int do_fssync(int nargs, char **argv);
+int do_start_sync(int nargs, char **argv);
+int do_wait_sync(int nargs, char **argv);
 int do_defrag(int argc, char **argv);
 int do_show_filesystem(int nargs, char **argv);
 int do_add_volume(int nargs, char **args);
-- 
1.7.1

--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/3] btrfs: implement 'start-sync' and 'wait-sync' commands

2010-10-30 Thread Goffredo Baroncelli
On Saturday, 30 October, 2010, Sage Weil wrote:
 The 'start-sync' command initiates a sync, but does not wait for it to
 complete.  A transaction is printed that can be fed to 'wait-sync', which
 will wait for it to commit.
 
 'wait-sync' can also be used in combination with 'async-snapshot' to wait
 for an async snapshot creation to commit.

As previous, if you add or update a command, please update the man page too.

 
 Signed-off-by: Sage Weil s...@newdream.net
 ---
  btrfs.c  |9 +
  btrfs_cmds.c |   49 +
  btrfs_cmds.h |2 ++
  3 files changed, 60 insertions(+), 0 deletions(-)
 
 diff --git a/btrfs.c b/btrfs.c
 index c4b9a31..d45ac1f 100644
 --- a/btrfs.c
 +++ b/btrfs.c
 @@ -83,6 +83,15 @@ static struct Command commands[] = {
 filesystem sync, path\n
   Force a sync on the filesystem path.
   },
 + { do_start_sync, 1,
 +   filesystem start-sync, path\n
 + Start a sync on the filesystem path, and print the 
resulting\n
 + transaction id.
 + },
 + { do_wait_sync, 2,
 +   filesystem wait-sync, path transid\n
 + Wait for the transaction transid on the filesystem at 
path to commit.
 + },
   { do_resize, 2,
 filesystem resize, [+/-]newsize[gkm]|max filesystem\n
   Resize the file system. If 'max' is passed, the filesystem\n
 diff --git a/btrfs_cmds.c b/btrfs_cmds.c
 index 6da5862..5b5bb15 100644
 --- a/btrfs_cmds.c
 +++ b/btrfs_cmds.c
 @@ -548,6 +548,55 @@ int do_fssync(int argc, char **argv)
   return 0;
  }
  
 +int do_start_sync(int argc, char **argv)
 +{
 + int fd, res;
 + char*path = argv[1];
 + __u64 transid;
 +
 + fd = open_file_or_dir(path);
 + if (fd  0) {
 + fprintf(stderr, ERROR: can't access to '%s'\n, path);
 + return 12;
 + }
 +
 + printf(StartSync '%s'\n, path);
 + res = ioctl(fd, BTRFS_IOC_START_SYNC, transid);
 + close(fd);
 + if( res  0 ){
 + fprintf(stderr, ERROR: unable to fs-syncing '%s'\n, path);
 + return 16;
 + } else {
 + printf(transid %llu\n, (unsigned long long)transid);
 + }
 +
 + return 0;
 +}
 +
 +int do_wait_sync(int argc, char **argv)
 +{
 + int fd, res;
 + char*path = argv[1];
 + __u64 transid = atoll(argv[2]);
 +
 + fd = open_file_or_dir(path);
 + if (fd  0) {
 + fprintf(stderr, ERROR: can't access to '%s'\n, path);
 + return 12;
 + }
 +
 + printf(WaitSync '%s' transid %llu\n, path, (unsigned long 
long)transid);
 + res = ioctl(fd, BTRFS_IOC_WAIT_SYNC, transid);
 + close(fd);
 + if( res  0 ){
 + fprintf(stderr, ERROR: unable to wait-sync on '%s' transid 
%llu: %s\n, path,
 + (unsigned long long)transid, strerror(errno));
 + return 16;
 + }
 +
 + return 0;
 +}
 +
  int do_scan(int argc, char **argv)
  {
   int i, fd;
 diff --git a/btrfs_cmds.h b/btrfs_cmds.h
 index c44dc79..e0e5ceb 100644
 --- a/btrfs_cmds.h
 +++ b/btrfs_cmds.h
 @@ -20,6 +20,8 @@ int do_create_snap_async(int nargs, char **argv);
  int do_delete_subvolume(int nargs, char **argv);
  int do_create_subvol(int nargs, char **argv);
  int do_fssync(int nargs, char **argv);
 +int do_start_sync(int nargs, char **argv);
 +int do_wait_sync(int nargs, char **argv);
  int do_defrag(int argc, char **argv);
  int do_show_filesystem(int nargs, char **argv);
  int do_add_volume(int nargs, char **args);
 -- 
 1.7.1
 
 --
 To unsubscribe from this list: send the line unsubscribe linux-btrfs in
 the body of a message to majord...@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html
 


-- 
gpg key@ keyserver.linux.it: Goffredo Baroncelli (ghigo) kreij...@inwind.it
Key fingerprint = 4769 7E51 5293 D36C 814E  C054 BF04 F161 3DC5 0512
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html