diff -r -u chironfs-1.1.1/src/chirctl.c chironfs-1.1.1.mtn1/src/chirctl.c
--- chironfs-1.1.1/src/chirctl.c	2008-06-18 19:27:08.000000000 -0600
+++ chironfs-1.1.1.mtn1/src/chirctl.c	2009-02-21 10:45:28.000000000 -0700
@@ -593,7 +593,7 @@
       if ((size>2) 
       || ((size==2) && (buf[1]!='\n'))
 //      || ((buf[0]!='0') && (buf[0]!='1') && (buf[0]!='2'))
-      || ((buf[0]!='0') && (buf[0]!='2'))
+      || ((buf[0]!='0') && (buf[0]!='2') && (buf[0]!='B') && (buf[0]!='U'))
       ) {
          return(-ENOSYS);
       }
@@ -605,6 +605,10 @@
          fprintf(tochironfs,"0009enable:%02X",res.i);
       } else if (buf[0]=='2') {
          fprintf(tochironfs,"000Adisable:%02X",res.i);
+      } else if (buf[0]=='B') {
+         fprintf(tochironfs,"000Bblockwrites",res.i);
+      } else if (buf[0]=='U') {
+         fprintf(tochironfs,"000Dunblockwrites",res.i);
       }
       fflush(tochironfs);
       someerr = read_a_line(&chbuf,&sz,fromchironfs);
diff -r -u chironfs-1.1.1/src/chironfs.c chironfs-1.1.1.mtn1/src/chironfs.c
--- chironfs-1.1.1/src/chironfs.c	2008-06-20 19:09:19.000000000 -0600
+++ chironfs-1.1.1.mtn1/src/chironfs.c	2009-02-21 10:45:28.000000000 -0700
@@ -324,6 +324,64 @@
    }
 }
 
+/*
+   Block if we are not free to write until we are.
+   Also, keep track of ongoing writes so that we
+   know when we are finally safely blocked.
+*/
+int wcnt =0;
+void write_start()
+{
+   dbg(("\nMTN: BEGIN writes_unbloc"));
+   pthread_mutex_lock(&write_mutex);
+//sleep(1);
+   while (block_writes) {
+      pthread_cond_wait(&write_cond,&write_mutex);
+   }
+   write_count ++;
+   dbg(("\nMTN: IN writes_unblock  writes_count:%d, seq:%d", write_count, ++wcnt));
+   pthread_mutex_unlock(&write_mutex);
+   dbg(("\nMTN: END writes_unblock"));
+}
+
+void write_end()
+{
+   dbg(("\nMTN: BEGIN done_write"));
+   pthread_mutex_lock(&write_mutex);
+//sleep(1);
+   write_count --;
+   dbg(("\nMTN: IN done_write  writes_count:%d, seq:%d", write_count, ++wcnt));
+   if(!write_count && block_writes) {
+      pthread_cond_broadcast(&write_count_cond);
+   }
+   pthread_mutex_unlock(&write_mutex);
+   dbg(("\nMTN: END done_write"));
+}
+
+/* Unblock all the writers */
+void unblock_all_writes()
+{ //Should we be able to unblock if we haven't finished blocking yet?
+   dbg(("\nMTN: BEGIN unblock_all_writes"));
+   pthread_mutex_lock(&write_mutex);
+   block_writes = 0;
+   pthread_cond_broadcast(&write_cond);
+   pthread_mutex_unlock(&write_mutex);
+   dbg(("\nMTN: END unblock_all_writes"));
+}
+
+/* Block all future writers, return only when
+   no more writes are oustanding */
+void block_all_writes()
+{
+   dbg(("\nMTN: BEGIN block_all_writes"));
+   pthread_mutex_lock(&write_mutex);
+   block_writes = 1;
+   while (write_count > 0) {
+      pthread_cond_wait(&write_count_cond,&write_mutex);
+   }
+   pthread_mutex_unlock(&write_mutex);
+   dbg(("\nMTN: END block_all_writes"));
+}
 
 ////////////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////////////
@@ -533,6 +591,7 @@
    unsigned int gid;
    static struct fuse_context *context;
    struct stat stbuf;
+   int flag_write = (fi->flags & O_WRONLY) || (fi->flags & O_RDWR) || (fi->flags & O_CREAT) || (fi->flags & O_EXCL) || (fi->flags & O_TRUNC) || (fi->flags & O_APPEND);
    decl_tmvar(t1, t2, t3);
    decl_tmvar(t4, t5, t6);
                                                 dbg(("\nopen %s",path_orig));
@@ -551,6 +610,12 @@
       return -ENOMEM;
    }
 
+   /* If the open is for write, it must be blocked  */
+   if (flag_write) {
+      write_start();
+   }
+
+
    path = strdup(path_orig);
 
    if (path!=NULL) {
@@ -657,10 +722,16 @@
          }
          if (fd_ndx < 0) {
             free( fd );        /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */
+            if (flag_write) {
+               write_end();
+            }
             return -EMFILE;
          }
 //    we dont free fd anymore because it is being put in tab_fd. Now this will be freed only on close.
          fi->fh = fd_ndx;
+         if (flag_write) {
+            write_end();
+         }
          return(0);
       }
       gettmday(&t2,NULL);
@@ -682,6 +753,9 @@
 
    free(err_list);
    free( fd );           /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */
+   if (flag_write) {
+      write_end();
+   }
    return(-errno);
 }
 
@@ -794,10 +868,14 @@
 {
    int     i, fail_cnt=0, succ_cnt=0, ret, *err_list, perm;
    ssize_t *w;
+
+   write_start();
+
    decl_tmvar(t1, t2, t3);
 
    gettmday(&t1,NULL);
    (void) path;
+
    
                                                                   dbg(("write(%d)",fi->fh));
    if (tab_fd.fd[fi->fh]==NULL) {
@@ -858,6 +936,7 @@
                ret = w[i];
                free( w );
                free(err_list);
+               write_end();
                return(ret);
             }
          }
@@ -870,6 +949,7 @@
 
    free( w );
    free(err_list);
+   write_end();
    return(-errno);
 }
 
@@ -1218,6 +1298,9 @@
    (void) rdev;
    static struct fuse_context *context;
    struct stat stbuf;
+
+   write_start();
+
    decl_tmvar(t1, t2, t3);
 
    gettmday(&t1,NULL);
@@ -1225,12 +1308,14 @@
                                                       dbg(("\nmknod@: %s\n",path_orig));
    fd = calloc(max_replica,sizeof(int));
    if (fd==NULL) {
+      write_end();
       return -ENOMEM;
    }
 
    err_list = calloc(max_replica,sizeof(int));
    if (err_list==NULL) {
       free(fd);
+      write_end();
       return -ENOMEM;
    }
 
@@ -1333,6 +1418,7 @@
          free( fd );             /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */
          free(err_list);
 
+         write_end();
          return(0);
       }
                               dbg(("\nmknod fail0"));
@@ -1351,6 +1437,7 @@
                               dbg(("\nmknod fail1"));
    free( fd );               /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */
    free(err_list);
+   write_end();
    return -errno;
 }
 
@@ -1360,15 +1447,18 @@
    int     i, *fd;                                                                             \
    int     fail_cnt=0, succ_cnt=0;                                                             \
    int    *err_list, perm;                                                                     \
+   write_start();                                                                             \
    decl_tmvar(t1, t2, t3);                                                                     \
    gettmday(&t1,NULL);                                                                         \
    fd = calloc(max_replica,sizeof(int));                                                       \
    if (fd==NULL) {                                                                             \
+      write_end();                                                                             \
       return -ENOMEM;                                                                          \
    }                                                                                           \
    err_list = calloc(max_replica,sizeof(int));                                                 \
    if (err_list==NULL) {                                                                       \
       free(fd);                                                                                \
+      write_end();                                                                             \
       return -ENOMEM;                                                                          \
    }                                                                                           \
    for(i=0;i<max_replica;++i) {                                                                \
@@ -1420,6 +1510,7 @@
          if (!paths[i].disabled) {                                                             \
             if (err_list[i]) {                                                                 \
                dbg(("\nretval: %d,%d,%d\n",-err_list[i],err_list[i],i));                       \
+               write_end();                                                                    \
                return(-err_list[i]);                                                           \
             }                                                                                  \
          }                                                                                     \
@@ -1430,8 +1521,10 @@
       timeval_subtract(&t3,&t2,&t1);                                                           \
       dbg(("\n%s time %ld secs,  %ld usecs",logmsgstr,t3.tv_sec,t3.tv_usec));                  \
       if (succ_cnt) {                                                                          \
+         write_end();                                                                          \
          return(0);                                                                            \
       }                                                                                        \
+      write_end();                                                                             \
       return -errno;                                                                           \
    }                                                                                           \
    free( fd ); /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */    \
@@ -1439,6 +1532,7 @@
    gettmday(&t2,NULL);                                                                         \
    timeval_subtract(&t3,&t2,&t1);                                                              \
    dbg(("\n%s allocfail time %ld secs,  %ld usecs",logmsgstr,t3.tv_sec,t3.tv_usec));           \
+   write_end();                                                                                \
    return -ENOMEM
 
 
@@ -1516,6 +1610,7 @@
 {
    char *dname;
    int tmpperm;
+
                                                          dbg(("\nrmdir: %s\n",path_orig));
    do_byname_rw(rmdir(fname), "rmdir",(
       ((dname=strdup(fname))==NULL)
@@ -1528,6 +1623,7 @@
 {
    char *dname;
    int tmpperm;
+
                                                          dbg(("\nunlink: %s\n",path_orig));
    do_byname_rw(unlink(fname), "unlink",(
       ((dname=strdup(fname))==NULL)
@@ -1550,6 +1646,8 @@
 
    gettmday(&t1,NULL);
 
+   write_start();
+
    context = fuse_get_context();
 
    fd = calloc(max_replica,sizeof(int));
@@ -1661,6 +1759,8 @@
 
    gettmday(&t1,NULL);
 
+   write_start();
+
                                                          dbg(("\nsymlink: %s->%s\n",from,to));
    context = fuse_get_context();
    fd = calloc(max_replica,sizeof(int));
@@ -1757,10 +1857,12 @@
 #define do_by2names_rw(perm_from,fn,logmsgstr)                             \
    char   *fname_from=NULL, *fname_to=NULL, *dname;                        \
    int     i, *fd, fail_cnt=0, succ_cnt=0, perm;                           \
+   write_start();                                                         \
    decl_tmvar(t1, t2, t3);                                                 \
    gettmday(&t1,NULL);                                                     \
    fd = calloc(max_replica,sizeof(int));                                   \
    if (fd==NULL) {                                                         \
+      write_end();                                                         \
       return -ENOMEM;                                                      \
    }                                                                       \
    for(i=(max_replica-1);i>=0;--i) {                                       \
@@ -1846,6 +1948,7 @@
    dbg(("\n%s time %ld secs,  %ld usecs",logmsgstr,t3.tv_sec,t3.tv_usec)); \
    if (succ_cnt) {                                                         \
       free( fd ); /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */  \
+      write_end();                                                                              \
       return(0);                                                                                \
    }                                                                                            \
    for(i=(max_replica-1);i>=0;--i) {                                                            \
@@ -1857,6 +1960,7 @@
       }                                                                                         \
    }                                                                                            \
    free( fd );   /* Thanks to Patrick Prasse for send this patch line fixing a memory leak */   \
+   write_end();                                                                                 \
    return(errno)
 
 static int chiron_rename(const char *from, const char *to)
@@ -1913,6 +2017,7 @@
    (void) path;
    (void) isdatasync;
    (void) fi;
+
                                                             dbg(("\nfsync: %d\n",fi->fh));
 /*
    if (tab_fd.fd[fi->fh]==NULL) {
@@ -1924,6 +2029,7 @@
       return -ENOMEM;
    }
 
+   write_start();
    for(i=(max_replica-1);i>=0;--i) {
       if (!paths[i].disabled) {
          if (isdatasync) {
@@ -1955,7 +2061,7 @@
 //   }
 
 //   return(-errno);
-
+   write_end();
 return(0);
 }
 
@@ -1973,7 +2079,7 @@
      *
      * Introduced in version 2.3
      */
-void *chiron_init(struct fuse_conn_info *conn)
+void *chiron_init(void *conn)
 {
    struct stat st;
    pthread_t   thand;
@@ -2086,7 +2192,9 @@
                         size_t size, int flags)
 {
    char *logmsg;
+    write_start();
     int res = lsetxattr(path, name, value, size, flags);
+    write_end();
     if (res == -1)
         return -errno;
     return 0;
@@ -2114,7 +2222,9 @@
 static int chiron_removexattr(const char *path, const char *name)
 {
    char *logmsg;
+    write_start();
     int res = lremovexattr(path, name);
+    write_end();                                                         \
     if (res == -1)
         return -errno;
     return 0;
@@ -2216,6 +2326,14 @@
                break;
             }
          }
+      } else if (strncmp(buf,"blockwrites",11)==0) {
+         block_all_writes();
+         fprintf(fo,"0002OK");
+         fflush(fo);
+      } else if (strncmp(buf,"unblockwrites",13)==0) {
+         unblock_all_writes();
+         fprintf(fo,"0002OK");
+         fflush(fo);
       } else if (strncmp(buf,"disable:",8)==0) {
          // put replica in inactive state
          sscanf(buf+8,"%2X",&i);
diff -r -u chironfs-1.1.1/src/chironfs.h chironfs-1.1.1.mtn1/src/chironfs.h
--- chironfs-1.1.1/src/chironfs.h	2008-06-15 17:32:23.000000000 -0600
+++ chironfs-1.1.1.mtn1/src/chironfs.h	2009-02-21 10:45:28.000000000 -0700
@@ -17,6 +17,7 @@
  */
 
 #include <getopt.h>
+/*#include <pthread.h>*/
 
 
 #if defined(_CHIRON_H_)
@@ -37,6 +38,12 @@
 uint64_t qt_hash_bits       = 0;
 uint64_t hash_mask          = 0;
 char *chironctl_mountpoint  = NULL;
+int      block_writes       = 0;
+pthread_mutex_t write_mutex;
+pthread_cond_t write_cond;
+pthread_cond_t write_count_cond;
+int      write_count        = 0;
+
 #else
 extern int      max_replica;
 extern int      curr_replica;
@@ -54,6 +61,11 @@
 extern uint64_t   qt_hash_bits;
 extern uint64_t   hash_mask;
 extern char *chironctl_mountpoint;
+extern int      block_writes;
+extern pthread_mutex_t writes_mutex;
+extern pthread_cond_t  write_cond;
+extern int      write_count;
+extern pthread_cond_t  write_count_cond;
 
 #endif
 
@@ -196,7 +208,7 @@
 void *start_ctl(void *arg);
 
 #if defined(_CHIRON_H_)
-void *chiron_init(struct fuse_conn_info *conn);
+void *chiron_init(void *conn);
 #endif
 
 
