]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - mm/filemap.c
add WEAK() for creating weak asm labels
[linux-2.6-omap-h63xx.git] / mm / filemap.c
index ca04226bf1de3311d3a5ffe5befdaac03eaf6efa..5209e47b7fe39dba855e84ee9ca4d89283fd3d80 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/uio.h>
 #include <linux/hash.h>
 #include <linux/writeback.h>
+#include <linux/backing-dev.h>
 #include <linux/pagevec.h>
 #include <linux/blkdev.h>
 #include <linux/security.h>
@@ -63,6 +64,7 @@ generic_file_direct_IO(int rw, struct kiocb *iocb, const struct iovec *iov,
  *    ->private_lock           (__free_pte->__set_page_dirty_buffers)
  *      ->swap_lock            (exclusive_swap_page, others)
  *        ->mapping->tree_lock
+ *          ->zone.lock
  *
  *  ->i_mutex
  *    ->i_mmap_lock            (truncate->unmap_mapping_range)
@@ -839,7 +841,7 @@ static void shrink_readahead_size_eio(struct file *filp,
 /**
  * do_generic_mapping_read - generic file read routine
  * @mapping:   address_space to be read
- * @_ra:       file's readahead state
+ * @ra:                file's readahead state
  * @filp:      the file to read
  * @ppos:      current file position
  * @desc:      read_descriptor
@@ -1626,12 +1628,18 @@ int __remove_suid(struct dentry *dentry, int kill)
 
 int remove_suid(struct dentry *dentry)
 {
-       int kill = should_remove_suid(dentry);
+       int killsuid = should_remove_suid(dentry);
+       int killpriv = security_inode_need_killpriv(dentry);
+       int error = 0;
 
-       if (unlikely(kill))
-               return __remove_suid(dentry, kill);
+       if (killpriv < 0)
+               return killpriv;
+       if (killpriv)
+               error = security_inode_killpriv(dentry);
+       if (!error && killsuid)
+               error = __remove_suid(dentry, killsuid);
 
-       return 0;
+       return error;
 }
 EXPORT_SYMBOL(remove_suid);
 
@@ -1684,6 +1692,7 @@ size_t iov_iter_copy_from_user_atomic(struct page *page,
 
        return copied;
 }
+EXPORT_SYMBOL(iov_iter_copy_from_user_atomic);
 
 /*
  * This has the same sideeffects and return value as
@@ -1710,6 +1719,7 @@ size_t iov_iter_copy_from_user(struct page *page,
        kunmap(page);
        return copied;
 }
+EXPORT_SYMBOL(iov_iter_copy_from_user);
 
 static void __iov_iter_advance_iov(struct iov_iter *i, size_t bytes)
 {
@@ -1741,6 +1751,7 @@ void iov_iter_advance(struct iov_iter *i, size_t bytes)
        __iov_iter_advance_iov(i, bytes);
        i->count -= bytes;
 }
+EXPORT_SYMBOL(iov_iter_advance);
 
 /*
  * Fault in the first iovec of the given iov_iter, to a maximum length
@@ -1757,6 +1768,7 @@ int iov_iter_fault_in_readable(struct iov_iter *i, size_t bytes)
        bytes = min(bytes, i->iov->iov_len - i->iov_offset);
        return fault_in_pages_readable(buf, bytes);
 }
+EXPORT_SYMBOL(iov_iter_fault_in_readable);
 
 /*
  * Return the count of just the current iov_iter segment.
@@ -1769,6 +1781,7 @@ size_t iov_iter_single_seg_count(struct iov_iter *i)
        else
                return min(i->count, iov->iov_len - i->iov_offset);
 }
+EXPORT_SYMBOL(iov_iter_single_seg_count);
 
 /*
  * Performs necessary checks before doing a write
@@ -1893,13 +1906,10 @@ again:
 
                ret = aops->prepare_write(file, page, offset, offset+len);
                if (ret) {
-                       if (ret != AOP_TRUNCATED_PAGE)
-                               unlock_page(page);
+                       unlock_page(page);
                        page_cache_release(page);
                        if (pos + len > inode->i_size)
                                vmtruncate(inode, inode->i_size);
-                       if (ret == AOP_TRUNCATED_PAGE)
-                               goto again;
                }
                return ret;
        }
@@ -1926,7 +1936,6 @@ int pagecache_write_end(struct file *file, struct address_space *mapping,
                unlock_page(page);
                mark_page_accessed(page);
                page_cache_release(page);
-               BUG_ON(ret == AOP_TRUNCATED_PAGE); /* can't deal with */
 
                if (ret < 0) {
                        if (pos + len > inode->i_size)
@@ -2137,7 +2146,7 @@ static ssize_t generic_perform_write_2copy(struct file *file,
                flush_dcache_page(page);
 
                status = a_ops->commit_write(file, page, offset, offset+bytes);
-               if (unlikely(status < 0 || status == AOP_TRUNCATED_PAGE))
+               if (unlikely(status < 0))
                        goto fs_write_aop_error;
                if (unlikely(status > 0)) /* filesystem did partial write */
                        copied = min_t(size_t, copied, status);
@@ -2157,8 +2166,7 @@ static ssize_t generic_perform_write_2copy(struct file *file,
                continue;
 
 fs_write_aop_error:
-               if (status != AOP_TRUNCATED_PAGE)
-                       unlock_page(page);
+               unlock_page(page);
                page_cache_release(page);
                if (src_page)
                        page_cache_release(src_page);
@@ -2170,10 +2178,7 @@ fs_write_aop_error:
                 */
                if (pos + bytes > inode->i_size)
                        vmtruncate(inode, inode->i_size);
-               if (status == AOP_TRUNCATED_PAGE)
-                       continue;
-               else
-                       break;
+               break;
        } while (iov_iter_count(i));
 
        return written ? written : status;