Am Di, 2003-07-22 um 23.39 schrieb Christophe Saout: > > I just wrote a dm target uses a file as backend instead of another block > > device. > > Umm... lalala... (a cleanup and a *fix*) :D So, another patch on top of that. A small cleanup and three bugfixes (avoid the worker thread to be accidentally killed by a signal, fix its shutdown procedure and add a missing offset). -- Christophe Saout <christophe@xxxxxxxx> Please avoid sending me Word or PowerPoint attachments. See http://www.fsf.org/philosophy/no-word-attachments.html
--- dm-file.c.orig 2003-07-26 02:46:58.731720680 +0200 +++ dm-file.c 2003-07-26 02:47:36.217022048 +0200 @@ -116,7 +116,7 @@ int r; /* - * No need do use that handy bio_kmap_irq macro since we are always + * No need do use that handy bvec_kmap_irq macro since we are always * alled in a non-irq context (from our worker thread actually) */ data = kmap(bv->bv_page) + bv->bv_offset, @@ -135,7 +135,7 @@ * Handles a bio_vec as a file write operation */ static int fileio_write_bvec(struct file_c *fc, struct bio_vec *bv, - int blocksize, loff_t pos) + loff_t pos) { struct file *file = fc->file; struct address_space *mapping = file->f_dentry->d_inode->i_mapping; @@ -151,7 +151,7 @@ offset = pos & ((pgoff_t)PAGE_CACHE_SIZE - 1); down(&mapping->host->i_sem); - while(len > 0) { + while (len > 0) { size = PAGE_CACHE_SIZE - offset; if (size > len) size = len; @@ -160,15 +160,15 @@ if (!page) goto fail; - if (aops->prepare_write(file, page, offset, offset+size)) + if (aops->prepare_write(file, page, offset, offset + size)) goto unlock; - dst = kmap(page); + dst = kmap(page) + offset; memcpy(dst, src, size); flush_dcache_page(page); kunmap(page); - if (aops->commit_write(file, page, offset, offset+size)) + if (aops->commit_write(file, page, offset, offset + size)) goto unlock; src += size; @@ -199,7 +199,6 @@ static int fileio_write(struct file_c *fc, struct bio *bio, loff_t pos) { struct bio_vec *bv; - int blocksize = fc->file->f_dentry->d_inode->i_blksize; int i; bio_for_each_segment(bv, bio, i) { @@ -207,11 +206,11 @@ int r; /* - * No need do use that handy bio_kmap_irq macro since we are always + * No need do use that handy bvec_kmap_irq macro since we are always * alled in a non-irq context (from our worker thread actually) */ data = kmap(bv->bv_page) + bv->bv_offset, - r = fileio_write_bvec(fc, bv, blocksize, pos); + r = fileio_write_bvec(fc, bv, pos); kunmap(bv->bv_page); if (r < 0) @@ -241,7 +240,7 @@ up(&fc->sem); while (1) { - down_interruptible(&fc->bh_mutex); + while (down_interruptible(&fc->bh_mutex) == -EINTR); bio = fileio_next_bio(fc); @@ -376,6 +375,7 @@ init_MUTEX_LOCKED(&fc->bh_mutex); kernel_thread(fileio_thread, fc, CLONE_FS | CLONE_FILES | CLONE_SIGHAND); + down(&fc->sem); ti->private = fc; return 0;