(* écriture sur un descripteur*)
  let write desc buffer from len =
    if desc.inode.stats.st_size > max_file_size then
      raise (File_system_error "Inconsistant file system");
    if desc.flag != O_WRONLY && desc.flag != O_RDWR then
      raise (File_system_exception "Cannot write on this descriptor");
    (* fait en sorte que le bloc n du fichier soit accessible *)
    (* et ne contienne que des 0 *)
    let read_block  n disk_buffer =
      if n >= D.block_size - blocktbl_offset then
        raise (File_system_exception "File too large");
      if desc.inode.blocktbl.(n) == 0 then
        begin
          desc.inode.blocktbl.(n) <- alloc_block ();
          Array.fill disk_buffer 0 (D.block_size) 0;
          D.write desc.inode.blocktbl.(ndisk_buffer 0
        end
      else
        D.read desc.inode.blocktbl.(ndisk_buffer 0
    and update_inode_size () =
      let new_offset = desc_offset desc in
      if new_offset > desc.inode.stats.st_size then
        desc.inode.stats.st_size <- new_offset;
      write_inode desc.inode
    in
    let do_write () =
      let disk_buffer = Array.create D.block_size 0 in
      read_block desc.block disk_buffer;
      let rec write i len =
        if len != 0  then
          begin
            disk_buffer.(desc.pos) <- Char.code buffer.[i];
            desc.pos <- desc.pos + 1;
            if D.block_size == desc.pos then
              begin
                D.write desc.inode.blocktbl.(desc.blockdisk_buffer 0;
                desc.block <- desc.block + 1;
                read_block desc.block disk_buffer;
                desc.pos <- 0;
                write (i+1) (len-1)
              end
            else
              write (i+1) (len-1)
          end in
      write from len;
      D.write desc.inode.blocktbl.(desc.blockdisk_buffer 0;
    in
    if len > 0 then
      try_finally do_write () update_inode_size  ();;