ceph: fix truncation when not holding caps
authorYehuda Sadeh <yehuda@hq.newdream.net>
Tue, 9 Feb 2010 19:08:40 +0000 (11:08 -0800)
committerSage Weil <sage@newdream.net>
Thu, 11 Feb 2010 19:48:51 +0000 (11:48 -0800)
A truncation should occur when either we have the
specified caps for the file, or (in cases where we are
not the only ones referencing the file) when it is mapped
or when it is opened. The latter two cases were not
handled.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/inode.c

index a4f573ab232ea3004524c302c1e3488422618dbe..af85f2de2f7cef3aa15b41906c5152bb81c538a2 100644 (file)
@@ -416,9 +416,17 @@ int ceph_fill_file_size(struct inode *inode, int issued,
                        dout("truncate_seq %u -> %u\n",
                             ci->i_truncate_seq, truncate_seq);
                        ci->i_truncate_seq = truncate_seq;
-                       if (issued & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_RD|
+                       /*
+                        * If we hold relevant caps, or in the case where we're
+                        * not the only client referencing this file and we
+                        * don't hold those caps, then we need to check whether
+                        * the file is either opened or mmaped
+                        */
+                       if ((issued & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_RD|
                                      CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER|
-                                     CEPH_CAP_FILE_EXCL)) {
+                                     CEPH_CAP_FILE_EXCL)) ||
+                           mapping_mapped(inode->i_mapping) ||
+                           __ceph_caps_file_wanted(ci)) {
                                ci->i_truncate_pending++;
                                queue_trunc = 1;
                        }