aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph/ioctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ceph/ioctl.c')
-rw-r--r--fs/ceph/ioctl.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c
index e0b4ef31d3c8..669622fd1ae3 100644
--- a/fs/ceph/ioctl.c
+++ b/fs/ceph/ioctl.c
@@ -196,8 +196,10 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
196 r = ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, len, 196 r = ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, len,
197 &dl.object_no, &dl.object_offset, 197 &dl.object_no, &dl.object_offset,
198 &olen); 198 &olen);
199 if (r < 0) 199 if (r < 0) {
200 up_read(&osdc->map_sem);
200 return -EIO; 201 return -EIO;
202 }
201 dl.file_offset -= dl.object_offset; 203 dl.file_offset -= dl.object_offset;
202 dl.object_size = ceph_file_layout_object_size(ci->i_layout); 204 dl.object_size = ceph_file_layout_object_size(ci->i_layout);
203 dl.block_size = ceph_file_layout_su(ci->i_layout); 205 dl.block_size = ceph_file_layout_su(ci->i_layout);
@@ -209,8 +211,12 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
209 snprintf(dl.object_name, sizeof(dl.object_name), "%llx.%08llx", 211 snprintf(dl.object_name, sizeof(dl.object_name), "%llx.%08llx",
210 ceph_ino(inode), dl.object_no); 212 ceph_ino(inode), dl.object_no);
211 213
212 ceph_calc_ceph_pg(&pgid, dl.object_name, osdc->osdmap, 214 r = ceph_calc_ceph_pg(&pgid, dl.object_name, osdc->osdmap,
213 ceph_file_layout_pg_pool(ci->i_layout)); 215 ceph_file_layout_pg_pool(ci->i_layout));
216 if (r < 0) {
217 up_read(&osdc->map_sem);
218 return r;
219 }
214 220
215 dl.osd = ceph_calc_pg_primary(osdc->osdmap, pgid); 221 dl.osd = ceph_calc_pg_primary(osdc->osdmap, pgid);
216 if (dl.osd >= 0) { 222 if (dl.osd >= 0) {