Messages in this thread | | | Date | Mon, 12 Jan 2015 15:09:47 -0800 | From | Andrew Morton <> | Subject | Re: [PATCH v12 07/20] dax,ext2: Replace ext2_clear_xip_target with dax_clear_blocks |
| |
On Fri, 24 Oct 2014 17:20:39 -0400 Matthew Wilcox <matthew.r.wilcox@intel.com> 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); > > ... >
| |