ceph: Don't get layout from mds for regular file which has been written.
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
@@ -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
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.
Signed-off-by Jianpeng Ma <[email protected]>--- fs/ceph/ioctl.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)fs/ceph/ioctl.c +0
-0
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