On Fri, 24 Oct 2014 17:20:39 -0400 Matthew Wilcox <matthew.r.wilcox@xxxxxxxxx> wrote: > This is practically generic code; other filesystems will want to call > it from other places, but there's nothing ext2-specific about it. > > Make it a little more generic by allowing it to take a count of the number > of bytes to zero rather than fixing it to a single page. Thanks to Dave > Hansen for suggesting that I need to call cond_resched() if zeroing more > than one page. > > ... > > --- a/fs/dax.c > +++ b/fs/dax.c > @@ -20,8 +20,45 @@ > #include <linux/fs.h> > #include <linux/genhd.h> > #include <linux/mutex.h> > +#include <linux/sched.h> > #include <linux/uio.h> > > +int dax_clear_blocks(struct inode *inode, sector_t block, long size) > +{ > + struct block_device *bdev = inode->i_sb->s_bdev; > + sector_t sector = block << (inode->i_blkbits - 9); > + > + might_sleep(); > + do { > + void *addr; > + unsigned long pfn; > + long count; > + > + count = bdev_direct_access(bdev, sector, &addr, &pfn, size); > + if (count < 0) > + return count; > + BUG_ON(size < count); > + while (count > 0) { > + unsigned pgsz = PAGE_SIZE - offset_in_page(addr); > + if (pgsz > count) > + pgsz = count; > + if (pgsz < PAGE_SIZE) > + memset(addr, 0, pgsz); > + else > + clear_page(addr); Are there any cache issues in all this code? flush_dcache_page(addr)? > + addr += pgsz; > + size -= pgsz; > + count -= pgsz; > + BUG_ON(pgsz & 511); > + sector += pgsz / 512; > + cond_resched(); > + } > + } while (size); > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(dax_clear_blocks); > > ... > -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html