]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
kclient: down_read snap_rwsem for buffered writes
authorSage Weil <sage@newdream.net>
Tue, 19 Aug 2008 17:58:11 +0000 (10:58 -0700)
committerSage Weil <sage@newdream.net>
Tue, 19 Aug 2008 20:36:19 +0000 (13:36 -0700)
src/kernel/addr.c

index 13a292557125917e8ad144df5069b60808d98a39..40b59c40ac16d8e5b427e2bac8a7df0d3adca967 100644 (file)
@@ -553,6 +553,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping,
        struct inode *inode = file->f_dentry->d_inode;
        struct ceph_inode_info *ci = ceph_inode(inode);
        struct ceph_osd_client *osdc = &ceph_inode_to_client(inode)->osdc;
+       struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
        struct page *page;
        pgoff_t index = pos >> PAGE_CACHE_SHIFT;
        loff_t page_off = pos & PAGE_MASK;
@@ -573,6 +574,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping,
        /* check snap context */
        BUG_ON(!ci->i_snaprealm);
        BUG_ON(!ci->i_snaprealm->cached_context);
+       down_read(&mdsc->snap_rwsem);
        if (page->private &&
            (void *)page->private != ci->i_snaprealm->cached_context) {
                /* force early writeback of snapped page */
@@ -623,6 +625,7 @@ static int ceph_write_begin(struct file *file, struct address_space *mapping,
 
 fail:
        unlock_page(page);
+       up_read(&mdsc->snap_rwsem);
        return r;
 }
 
@@ -635,6 +638,7 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,
                          struct page *page, void *fsdata)
 {
        struct inode *inode = file->f_dentry->d_inode;
+       struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc;
        unsigned from = pos & (PAGE_CACHE_SIZE - 1);
 
        dout(10, "write_end file %p inode %p page %p %d~%d (%d)\n", file,
@@ -659,6 +663,7 @@ static int ceph_write_end(struct file *file, struct address_space *mapping,
        set_page_dirty(page);
 
        unlock_page(page);
+       up_read(&mdsc->snap_rwsem);
        page_cache_release(page);
 
        return copied;