anchor.diff:          stream))))
   
   (defmethod probe-using-host ((host fat32-host) pathname)
  -  (multiple-value-bind (dir cluster-n start) (find-file host pathname)
  -    (declare (ignore dir cluster-n))
  -    (if start t nil)))
  +  (multiple-value-bind (file-data file-cluster file-length) (open-file host pathname)
  +    (declare (ignore file-data file-cluster))
  +    (if file-length t nil)))
   
   (defmethod directory-using-host ((host fat32-host) pathname &key)
  -  (let ((file-data (find-file host pathname)))
  -    (let ((stack '())
  -          (path (directory-namestring pathname)))
  -      (do-files (file) file-data
  -        t
  -        (push
  -         (parse-simple-file-path host
  -                                 (format nil
  -                                         (if (file-p file-data file)
  -                                             "~a~a"
  -                                             "~a~a>")
  -                                         path
  -                                         (read-file-name file-data file)))
  -         stack))
  -      (return-from directory-using-host stack))))
  +  (let ((file-data (open-file-metadata host pathname))
  +        (stack '())
  +        (path (directory-namestring pathname)))
  +    (do-files (file) file-data
  +      t
  +      (push
  +       (parse-simple-file-path host
  +                               (format nil
  +                                       (if (file-p file-data file)
  +                                           "~a~a"
  +                                           "~a~a>")
  +                                       path
  +                                       (read-file-name file-data file)))
  +       stack))
  +    (return-from directory-using-host stack)))
   
   (defmethod ensure-directories-exist-using-host ((host fat32-host) pathname &key verbose)
     ;; TODO verbose
  
positive.code:                     (let ((metadata (subseq source-dir start (+ 32 source-start))))
                        (replace dest-dir metadata :start1 (next-n-spaces dest-dir (/ (length metadata) 32))))
                      ;; Write short name part
                      (multiple-value-bind (pathname-name pathname-type) (sub-path dest)
                        (let* ((name (concatenate 'string pathname-name "." pathname-type))
                               (short-name (make-short-name pathname-name pathname-type dest-dir))
                               (name-length (length name))
                               (start-offset (next-n-spaces dest-dir (if (> name-length 11)
                                                                         (1+ (ceiling
                                                                              (/ name-length 13)))
                                                                         1)))
                               (end-offset (+ start-offset (ash (if (> name-length 11)
                                                                    (ceiling (/ name-length 13))
                                                                    0)
                                                                5))))
                          ;; Copy short part
                          (let ((metadata (subseq source-dir source-start (+ 32 source-start))))
                            (replace dest-dir metadata :start1 end-offset))
                          ;; Change short name
                          (setf (read-short-name dest-dir end-offset) short-name)
                          ;; Write long name parts only if needed
                          (unless (and (>= 8 (length pathname-name))
                                       (>= 3 (length pathname-type)))
                            (setf (read-long-name dest-dir start-offset) name)))))
                  (if (equalp (pathname-directory source)
                              (pathname-directory dest))
                      (loop :for part-offset :from start :to source-start :by 32
                            :do (setf (aref dest-dir part-offset) #xE5))
                      (progn (loop :for part-offset :from start :to source-start :by 32
                                   :do (setf (aref source-dir part-offset) #xE5))
                             (write-file fat32 disk source-cluster-n fat source-dir)))
                  (write-file fat32 disk dest-cluster-n fat dest-dir))))))))
  
  (defmethod file-write-date-using-host ((host fat32-host) path)
    (multiple-value-bind (file cluster-n metadata-offset) (find-file host path)
      (declare (ignore cluster-n))
      (assert metadata-offset (metadata-offset) "File not found. ~s" path)
      (let ((time (read-write-time file metadata-offset))
            (date (read-write-date file metadata-offset)))
        (encode-universal-time (ash (ldb (byte 5 0) time) 1)
                               (ldb (byte 6 5) time)
                               (ldb (byte 5 11) time)
  
negative.code:   `(mezzano.supervisor:with-mutex ((fat32-host-lock ,host))
       ,@body))
  
  (defun file-name (pathname)
    "Take pathname and return file name."
    (unless (or (eql :wild (pathname-name pathname))
  