Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ceph: fully initialize new layout

When we are setting a new layout, fully initialize the structure:
- zero it out
- always set preferred_osd to -1

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Alex Elder <elder@inktank.com>

authored by

Sage Weil and committed by
Alex Elder
702aeb1f fd51653f

+15 -6
+13 -6
fs/ceph/ioctl.c
··· 80 80 81 81 /* validate changed params against current layout */ 82 82 err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT); 83 - if (!err) { 84 - nl.stripe_unit = ceph_file_layout_su(ci->i_layout); 85 - nl.stripe_count = ceph_file_layout_stripe_count(ci->i_layout); 86 - nl.object_size = ceph_file_layout_object_size(ci->i_layout); 87 - nl.data_pool = le32_to_cpu(ci->i_layout.fl_pg_pool); 88 - } else 83 + if (err) 89 84 return err; 90 85 86 + memset(&nl, 0, sizeof(nl)); 91 87 if (l.stripe_count) 92 88 nl.stripe_count = l.stripe_count; 89 + else 90 + nl.stripe_count = ceph_file_layout_stripe_count(ci->i_layout); 93 91 if (l.stripe_unit) 94 92 nl.stripe_unit = l.stripe_unit; 93 + else 94 + nl.stripe_unit = ceph_file_layout_su(ci->i_layout); 95 95 if (l.object_size) 96 96 nl.object_size = l.object_size; 97 + else 98 + nl.object_size = ceph_file_layout_object_size(ci->i_layout); 97 99 if (l.data_pool) 98 100 nl.data_pool = l.data_pool; 101 + else 102 + nl.data_pool = ceph_file_layout_pg_pool(ci->i_layout); 103 + 104 + /* this is obsolete, and always -1 */ 105 + nl.preferred_osd = le64_to_cpu(-1); 99 106 100 107 err = __validate_layout(mdsc, &nl); 101 108 if (err)
+2
fs/ceph/ioctl.h
··· 34 34 struct ceph_ioctl_layout { 35 35 __u64 stripe_unit, stripe_count, object_size; 36 36 __u64 data_pool; 37 + 38 + /* obsolete. new values ignored, always return -1 */ 37 39 __s64 preferred_osd; 38 40 }; 39 41