summaryrefslogtreecommitdiff
path: root/fs/ext4
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2010-03-31 21:52:10 -0700
committerSage Weil <sage@newdream.net>2010-04-01 09:34:36 -0700
commit80e755fedebc8de0599a79efad2c656503df2e62 (patch)
tree05f0285f4d040958377d6542394bc56b10f80257 /fs/ext4
parent9358c6d4c0264b1572554c49c4b92673ea9a5c72 (diff)
downloadlinux-3.10-80e755fedebc8de0599a79efad2c656503df2e62.tar.gz
linux-3.10-80e755fedebc8de0599a79efad2c656503df2e62.tar.bz2
linux-3.10-80e755fedebc8de0599a79efad2c656503df2e62.zip
ceph: allow writeback of snapped pages older than 'oldest' snapc
On snap deletion, we don't regenerate ceph_cap_snaps for inodes with dirty pages because deletion does not affect metadata writeback. However, we did run into problems when we went to write back the pages because the 'oldest' snapc is determined by the oldest cap_snap, and that may be the newer snapc that reflects the deletion. This caused confusion and an infinite loop in ceph_update_writeable_page(). Change the snapc checks to allow writeback of any snapc that is equal to OR older than the 'oldest' snapc. When there are no cap_snaps, we were also using the realm's latest snapc for writeback, which complicates ceph_put_wrbufffer_cap_refs(). Instead, use i_head_snapc, the most snapc used for the most recent ('head') data. This makes the writeback snapc (ceph_osd_request.r_snapc) _always_ match a capsnap or i_head_snapc. Also, in writepags_finish(), drop the snapc referenced by the _page_ and do not assume it matches the request snapc (it may not anymore). Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ext4')
0 files changed, 0 insertions, 0 deletions