unsigned from, unsigned to)
{
/* struct inode *inode = filp->f_dentry->d_inode;*/
- struct inode *inode = page->mapping->host;
- struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
- int err = 0;
- loff_t offset, i_size;
-
- /*
- * TODO:
- * 1. check if page is up to date
- * 2. If not, read a page to be up to date
- */
-
- if (PageUptodate(page))
- return 0;
-
- /* The given page is already up to date if it's a full page */
- if ((to == PAGE_SIZE) && (from == 0)) {
- SetPageUptodate(page);
- return 0;
- }
-
- offset = (loff_t)page->index << PAGE_SHIFT;
- i_size = i_size_read(inode);
-
- if ((offset >= i_size) ||
- ((from == 0) && (offset + to) >= i_size)) {
- /* data beyond the file end doesn't need to be read */
- simple_prepare_write(filp, page, from, to);
- SetPageUptodate(page);
- return 0;
- }
-
- /* Now it's clear that the page is not up to date */
-
- err = ceph_osdc_prepare_write(osdc, inode->i_ino, &ci->i_layout,
- page->index << PAGE_SHIFT, PAGE_SIZE, page);
- if (err)
- goto out_unlock;
-
+ struct inode *inode = page->mapping->host;
+ struct ceph_inode_info *ci = ceph_inode(inode);
+ struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
+ int err = 0;
+ loff_t offset, i_size;
+
+ /*
+ * TODO:
+ * 1. check if page is up to date
+ * 2. If not, read a page to be up to date
+ */
+
+ if (PageUptodate(page))
+ return 0;
+
+ /* The given page is already up to date if it's a full page */
+ if ((to == PAGE_SIZE) && (from == 0)) {
+ SetPageUptodate(page);
+ return 0;
+ }
+
+ offset = (loff_t)page->index << PAGE_SHIFT;
+ i_size = i_size_read(inode);
+
+ if ((offset >= i_size) ||
+ ((from == 0) && (offset + to) >= i_size)) {
+ /* data beyond the file end doesn't need to be read */
+ simple_prepare_write(filp, page, from, to);
+ SetPageUptodate(page);
+ return 0;
+ }
+
+ /* Now it's clear that the page is not up to date */
+
+ err = ceph_osdc_prepare_write(osdc, inode->i_ino, &ci->i_layout,
+ page->index << PAGE_SHIFT, PAGE_SIZE, page);
+ if (err)
+ goto out_unlock;
+
out_unlock:
- unlock_page(page);
- return err;
+ unlock_page(page);
+ return err;
}
/*
unsigned from, unsigned to)
{
/* struct inode *inode = filp->f_dentry->d_inode;*/
- struct inode *inode = page->mapping->host;
- struct ceph_inode_info *ci = ceph_inode(inode);
- struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
- loff_t position = ((loff_t)page->index << PAGE_SHIFT) + to;
- int err = 0;
- char *page_data;
-
- spin_lock(&inode->i_lock);
- if (position > inode->i_size) {
- i_size_write(inode, position);
- }
- spin_unlock(&inode->i_lock);
-
- /*
- * 1. check if page is up to date
- * 2. If not, make the page up to date by writing a page
- * 3. If yes, just set the page as dirty
- */
-
- if (!PageUptodate(page)) {
- position = ((loff_t)page->index << PAGE_SHIFT) + from;
-
- page_data = kmap(page);
- err = ceph_osdc_commit_write(osdc, inode->i_ino, &ci->i_layout,
- page->index << PAGE_SHIFT, PAGE_SIZE, page);
- if (err)
- err = 0; /* FIXME: more sophisticated error handling */
- kunmap(page);
- }
- else {
- /* set the page as up-to-date and mark it as dirty */
- SetPageUptodate(page);
- set_page_dirty(page);
- }
-
+ struct inode *inode = page->mapping->host;
+ struct ceph_inode_info *ci = ceph_inode(inode);
+ struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
+ loff_t position = ((loff_t)page->index << PAGE_SHIFT) + to;
+ int err = 0;
+ char *page_data;
+
+ spin_lock(&inode->i_lock);
+ if (position > inode->i_size) {
+ i_size_write(inode, position);
+ }
+ spin_unlock(&inode->i_lock);
+
+ /*
+ * 1. check if page is up to date
+ * 2. If not, make the page up to date by writing a page
+ * 3. If yes, just set the page as dirty
+ */
+
+ if (!PageUptodate(page)) {
+ position = ((loff_t)page->index << PAGE_SHIFT) + from;
+
+ page_data = kmap(page);
+ err = ceph_osdc_commit_write(osdc, inode->i_ino, &ci->i_layout,
+ page->index << PAGE_SHIFT, PAGE_SIZE, page);
+ if (err)
+ err = 0; /* FIXME: more sophisticated error handling */
+ kunmap(page);
+ }
+ else {
+ /* set the page as up-to-date and mark it as dirty */
+ SetPageUptodate(page);
+ set_page_dirty(page);
+ }
+
/*out_unlock:*/
- unlock_page(page);
- return err;
+ unlock_page(page);
+ return err;
}