Skip to contentSkip to conversation

ceph: Don't get layout from mds for regular file which has been written.

PATCH In review majianpeng 2 participants 2 messages Jul 11, 2013 – Jul 12, 2013 Ceph client

lore
Share & tools
lore

majianpeng

author
#0 lore raw

PATCH 1/1 ceph: Don't get layout from mds for regular file which has been written.

For regular file which has been written, it can't change layout. So it can get layout from local rather than mds.

---
 fs/ceph/ioctl.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
fs/ceph/ioctl.c +8 -2
index e0b4ef3..2b74879 100644
@@ -17,10 +17,16 @@
 static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
 {
 	struct ceph_inode_info *ci = ceph_inode(file_inode(file));
+	struct inode *inode = file_inode(file);
 	struct ceph_ioctl_layout l;
-	int err;
+	int err = 0;
+
+	/*For regular file which has been written,it can't change layout
+	 * So it don't get layout from mds*/
+	if (!(S_ISREG(inode->i_mode) && (i_size_read(inode) > 0 ||
+		ci->i_truncate_seq > 1)))
+		err = ceph_do_getattr(file_inode(file), CEPH_STAT_CAP_LAYOUT);
 
-	err = ceph_do_getattr(file_inode(file), CEPH_STAT_CAP_LAYOUT);
 	if (!err) {
 		l.stripe_unit = ceph_file_layout_su(ci->i_layout);
 		l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout);
Signature · 1 line
1.8.1.2
#1 lore raw
Quoted 13 lines · majianpeng

For regular file which has been written, it can't change layout. So it can get layout from local rather than mds.

---
 fs/ceph/ioctl.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)
fs/ceph/ioctl.c +0 -0
index e0b4ef3..2b74879 100644

fs/ceph/ioctl.c line 25

Quoted 10 lines
fs/ceph/ioctl.c +5 -1
@@ -17,10 +17,16 @@
 static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
 {
 	struct ceph_inode_info *ci = ceph_inode(file_inode(file));
+	struct inode *inode = file_inode(file);
 	struct ceph_ioctl_layout l;
-	int err;
+	int err = 0;
+
+	/*For regular file which has been written,it can't change layout
+	 * So it don't get layout from mds*/

style nit: space after /* and before */

fs/ceph/ioctl.c line 28

Quoted 3 lines
fs/ceph/ioctl.c +3 -0
+	if (!(S_ISREG(inode->i_mode) && (i_size_read(inode) > 0 ||
+		ci->i_truncate_seq > 1)))
+		err = ceph_do_getattr(file_inode(file), CEPH_STAT_CAP_LAYOUT);

I think a more defensive approach would be to use the helper to see if we are holding any of the Fcrwbl caps; if so, we can assume the layout is valid.

Note that we should be doing the same thing in getxattr when exposing the ceph.file.layout[.*] xattrs.. right now they are blindingly assuming that whatever is in cache is correct, which isn't strictly true. :/

sage

Quoted 7 lines
fs/ceph/ioctl.c +0 -1
-	err = ceph_do_getattr(file_inode(file), CEPH_STAT_CAP_LAYOUT);
 	if (!err) {
 		l.stripe_unit = ceph_file_layout_su(ci->i_layout);
 		l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout);
Signature · 1 line
1.8.1.2