#include <linux/mm.h>
#include <linux/pagemap.h>
#include <linux/smp_lock.h>
+#include <linux/writeback.h>
#define DEBUG_SUBSYSTEM S_LLITE
locked page too */
static int ll_invalidatepage(struct page *page, unsigned long offset)
{
+ if (offset)
+ return 0;
if (PagePrivate(page))
ll_removepage(page);
return 1;
return 1;
}
+static int ll_writepages(struct address_space *mapping,
+ struct writeback_control *wbc)
+{
+ struct ll_sb_info *sbi = ll_s2sbi(mapping->host->i_sb);
+ int rc;
+ struct timeval tstart, now;
+ do_gettimeofday(&tstart);
+ rc = generic_writepages(mapping, wbc);
+ /* this synchronization (even being implemented via Writeback)
+ * makes recovery much more sad, because iget() can get stuck
+ * on I_LOCK the kernel helds over ->writepages() -bzzz */
+ if (rc == 0 && wbc->sync_mode == WB_SYNC_ALL
+ && sbi->ll_flags & LL_SBI_UMOUNT) {
+ /* as we don't use Writeback bit to track pages
+ * under I/O, filemap_fdatawait() doesn't work
+ * for us. let's wait for I/O completion here */
+ struct ll_inode_info *lli = ll_i2info(mapping->host);
+ wait_event(lli->lli_dirty_wait,
+ ll_is_inode_dirty(mapping->host) == 0);
+ do_gettimeofday(&now);
+ if (now.tv_sec - tstart.tv_sec > obd_timeout * 6) {
+ CDEBUG(D_ERROR, "synching inode 0x%p "DLID4" took %ds\n",
+ mapping->host, OLID4(&lli->lli_id),
+ (int) (now.tv_sec - tstart.tv_sec));
+ portals_debug_dumplog();
+ }
+ }
+ return rc;
+}
+
struct address_space_operations ll_aops = {
.readpage = ll_readpage,
// .readpages = ll_readpages,
// .direct_IO = ll_direct_IO_26,
.writepage = ll_writepage_26,
- .writepages = generic_writepages,
+ .writepages = ll_writepages,
.set_page_dirty = __set_page_dirty_nobuffers,
.sync_page = NULL,
.prepare_write = ll_prepare_write,