diff options
author | Nick Piggin <npiggin@suse.de> | 2007-10-16 10:24:59 +0200 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 18:42:55 +0200 |
commit | 2f718ffc16c43a435d12919c75dbfad518abd056 (patch) | |
tree | 55588cb2815d844e9d0b2404cf8ceafe98b5c55d /mm/filemap.h | |
parent | mm: fix pagecache write deadlocks (diff) | |
download | linux-2f718ffc16c43a435d12919c75dbfad518abd056.tar.xz linux-2f718ffc16c43a435d12919c75dbfad518abd056.zip |
mm: buffered write iterator
Add an iterator data structure to operate over an iovec. Add usercopy
operators needed by generic_file_buffered_write, and convert that function
over.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/filemap.h')
-rw-r--r-- | mm/filemap.h | 103 |
1 files changed, 0 insertions, 103 deletions
diff --git a/mm/filemap.h b/mm/filemap.h deleted file mode 100644 index b500d936cec5..000000000000 --- a/mm/filemap.h +++ /dev/null @@ -1,103 +0,0 @@ -/* - * linux/mm/filemap.h - * - * Copyright (C) 1994-1999 Linus Torvalds - */ - -#ifndef __FILEMAP_H -#define __FILEMAP_H - -#include <linux/types.h> -#include <linux/fs.h> -#include <linux/mm.h> -#include <linux/highmem.h> -#include <linux/uio.h> -#include <linux/uaccess.h> - -size_t -__filemap_copy_from_user_iovec_inatomic(char *vaddr, - const struct iovec *iov, - size_t base, - size_t bytes); - -/* - * Copy as much as we can into the page and return the number of bytes which - * were sucessfully copied. If a fault is encountered then return the number of - * bytes which were copied. - */ -static inline size_t -filemap_copy_from_user_atomic(struct page *page, unsigned long offset, - const struct iovec *iov, unsigned long nr_segs, - size_t base, size_t bytes) -{ - char *kaddr; - size_t copied; - - kaddr = kmap_atomic(page, KM_USER0); - if (likely(nr_segs == 1)) { - int left; - char __user *buf = iov->iov_base + base; - left = __copy_from_user_inatomic_nocache(kaddr + offset, - buf, bytes); - copied = bytes - left; - } else { - copied = __filemap_copy_from_user_iovec_inatomic(kaddr + offset, - iov, base, bytes); - } - kunmap_atomic(kaddr, KM_USER0); - - return copied; -} - -/* - * This has the same sideeffects and return value as - * filemap_copy_from_user_atomic(). - * The difference is that it attempts to resolve faults. - */ -static inline size_t -filemap_copy_from_user(struct page *page, unsigned long offset, - const struct iovec *iov, unsigned long nr_segs, - size_t base, size_t bytes) -{ - char *kaddr; - size_t copied; - - kaddr = kmap(page); - if (likely(nr_segs == 1)) { - int left; - char __user *buf = iov->iov_base + base; - left = __copy_from_user_nocache(kaddr + offset, buf, bytes); - copied = bytes - left; - } else { - copied = __filemap_copy_from_user_iovec_inatomic(kaddr + offset, - iov, base, bytes); - } - kunmap(page); - return copied; -} - -static inline void -filemap_set_next_iovec(const struct iovec **iovp, unsigned long nr_segs, - size_t *basep, size_t bytes) -{ - if (likely(nr_segs == 1)) { - *basep += bytes; - } else { - const struct iovec *iov = *iovp; - size_t base = *basep; - - while (bytes) { - int copy = min(bytes, iov->iov_len - base); - - bytes -= copy; - base += copy; - if (iov->iov_len == base) { - iov++; - base = 0; - } - } - *iovp = iov; - *basep = base; - } -} -#endif |