int nilfs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
{ /* * Called from fsync() system call * This is the only entry point that can catch write and synch * timing for both data blocks and intermediate blocks. * * This function should be implemented when the writeback function * will be implemented.
*/ struct the_nilfs *nilfs; struct inode *inode = file->f_mapping->host; int err = 0;
if (nilfs_inode_dirty(inode)) { if (datasync)
err = nilfs_construct_dsync_segment(inode->i_sb, inode,
start, end); else
err = nilfs_construct_segment(inode->i_sb);
}
nilfs = inode->i_sb->s_fs_info; if (!err)
err = nilfs_flush_device(nilfs);
if (unlikely(nilfs_near_disk_full(inode->i_sb->s_fs_info))) return VM_FAULT_SIGBUS; /* -ENOSPC */
sb_start_pagefault(inode->i_sb);
folio_lock(folio); if (folio->mapping != inode->i_mapping ||
folio_pos(folio) >= i_size_read(inode) ||
!folio_test_uptodate(folio)) {
folio_unlock(folio);
ret = -EFAULT; /* make the VM retry the fault */ goto out;
}
/* * check to see if the folio is mapped already (no holes)
*/ if (folio_test_mappedtodisk(folio)) goto mapped;
head = folio_buffers(folio); if (head) { int fully_mapped = 1;
bh = head; do { if (!buffer_mapped(bh)) {
fully_mapped = 0; break;
}
} while (bh = bh->b_this_page, bh != head);
if (fully_mapped) {
folio_set_mappedtodisk(folio); goto mapped;
}
}
folio_unlock(folio);
/* * fill hole blocks
*/
ret = nilfs_transaction_begin(inode->i_sb, &ti, 1); /* never returns -ENOMEM, but may return -ENOSPC */ if (unlikely(ret)) goto out;
file_update_time(vma->vm_file);
ret = block_page_mkwrite(vma, vmf, nilfs_get_block); if (ret) {
nilfs_transaction_abort(inode->i_sb); goto out;
}
nilfs_set_file_dirty(inode, 1 << (PAGE_SHIFT - inode->i_blkbits));
nilfs_transaction_commit(inode->i_sb);
mapped: /* * Since checksumming including data blocks is performed to determine * the validity of the log to be written and used for recovery, it is * necessary to wait for writeback to finish here, regardless of the * stable write requirement of the backing device.
*/
folio_wait_writeback(folio);
out:
sb_end_pagefault(inode->i_sb); return vmf_fs_error(ret);
}
¤ Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.0.0Bemerkung:
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.