(* lecture sur un descripteur *)
  let read 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_RDONLY && desc.flag != O_RDWR then
      raise (File_system_exception "Cannot read on this descriptor");
    if desc_offset desc >= desc.inode.stats.st_size then  0
    else
      let disk_buffer = Array.create D.block_size 0 in
      D.read desc.inode.blocktbl.(desc.blockdisk_buffer 0;
      let rec read i len j =
        if len == 0 || desc_offset desc == desc.inode.stats.st_size then
          j
        else
          begin
            if desc.pos == D.block_size then
              begin
                desc.block <- desc.block + 1;
                if desc.inode.blocktbl.(desc.block) != 0 then
                  D.read desc.inode.blocktbl.(desc.blockdisk_buffer 0;
                desc.pos <- 0
              end;
            if desc.inode.blocktbl.(desc.block) == 0 then
              buffer.[i] <- Char.chr 0
            else
              buffer.[i] <- Char.chr disk_buffer.(desc.pos);
            desc.pos <- desc.pos + 1;
            read (i+1) (len-1) (j+1)
          end
      in
      if len > 0 then
        read from len 0
      else
        0;;