wake_up_process(io->sleeper);
 
                else {
-                       int r = io->error;
+                       unsigned long r = io->error;
                        io_notify_fn fn = io->callback;
                        void *context = io->context;
 
 
  * are in the no-sync state.  We have to recover these by
  * recopying from the default mirror to all the others.
  *---------------------------------------------------------------*/
-static void recovery_complete(int read_err, unsigned int write_err,
+static void recovery_complete(int read_err, unsigned long write_err,
                              void *context)
 {
        struct region *reg = (struct region *)context;
        }
 
        if (write_err) {
-               DMERR_LIMIT("Write error during recovery (error = 0x%x)",
+               DMERR_LIMIT("Write error during recovery (error = 0x%lx)",
                            write_err);
                /*
                 * Bits correspond to devices (excluding default mirror).
 
  * Called when the copy I/O has finished.  kcopyd actually runs
  * this code so don't block.
  */
-static void copy_callback(int read_err, unsigned int write_err, void *context)
+static void copy_callback(int read_err, unsigned long write_err, void *context)
 {
        struct dm_snap_pending_exception *pe = context;
        struct dm_snapshot *s = pe->snap;
 
         * Error state of the job.
         */
        int read_err;
-       unsigned int write_err;
+       unsigned long write_err;
 
        /*
         * Either READ or WRITE
 {
        void *context = job->context;
        int read_err = job->read_err;
-       unsigned int write_err = job->write_err;
+       unsigned long write_err = job->write_err;
        kcopyd_notify_fn fn = job->fn;
        struct kcopyd_client *kc = job->kc;
 
                if (r < 0) {
                        /* error this rogue job */
                        if (job->rw == WRITE)
-                               job->write_err = (unsigned int) -1;
+                               job->write_err = (unsigned long) -1L;
                        else
                                job->read_err = 1;
                        push(&_complete_jobs, job);
 }
 
 #define SUB_JOB_SIZE 128
-static void segment_complete(int read_err,
-                            unsigned int write_err, void *context)
+static void segment_complete(int read_err, unsigned long write_err,
+                            void *context)
 {
        /* FIXME: tidy this function */
        sector_t progress = 0;
 
  * read_err is a boolean,
  * write_err is a bitset, with 1 bit for each destination region
  */
-typedef void (*kcopyd_notify_fn)(int read_err,
-                                unsigned int write_err, void *context);
+typedef void (*kcopyd_notify_fn)(int read_err, unsigned long write_err,
+                                void *context);
 
 int kcopyd_copy(struct kcopyd_client *kc, struct io_region *from,
                unsigned int num_dests, struct io_region *dests,