(* écriture *)
  let write desc buffer from len =
    if desc.closed then
      system_error EINVAL "write" "Closed descriptor";
    if len <= 0 then system_error EINVAL "write" "Invalid length";
    if desc.pos + len >= max_file_size then
      system_error EINVAL "write" "Size to long";
    let inode = desc.inode in
    if inode.stats.st_size > max_file_size then
      system_error EIO "write" "Inconsistent file system";
    let rec write start len ret =
      if len > 0 then
        begin
          let block = desc.pos / block_size in
          let pos' = desc.pos mod block_size in
          let len' = min len (block_size - pos') in
          let disk_block =
            if inode.blocktbl.(block) = 0 then
              begin
                inode.blocktbl.(block) <- alloc_block ();
                bzeros inode.blocktbl.(block)
              end
            else
              bread inode.blocktbl.(blockin
         write_string buffer start disk_block poslen';
         brelse disk_block;
         desc.pos <- desc.pos + len';
         write (start + len') (len - len') (ret + len')
        end
      else ret in
    let size = write from len 0 in
    if inode.stats.st_size < desc.pos then inode.stats.st_size <- desc.pos;
    size;;