ceph: fix leak of osd authorizer
[safe/jmp/linux-2.6] / fs / ceph / ioctl.c
index e4f99ef..d085f07 100644 (file)
@@ -24,6 +24,8 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg)
                l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout);
                l.object_size = ceph_file_layout_object_size(ci->i_layout);
                l.data_pool = le32_to_cpu(ci->i_layout.fl_pg_pool);
+               l.preferred_osd =
+                       (s32)le32_to_cpu(ci->i_layout.fl_pg_preferred);
                if (copy_to_user(arg, &l, sizeof(l)))
                        return -EFAULT;
        }
@@ -79,7 +81,8 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg)
        req->r_args.setlayout.layout.fl_object_size =
                cpu_to_le32(l.object_size);
        req->r_args.setlayout.layout.fl_pg_pool = cpu_to_le32(l.data_pool);
-       req->r_args.setlayout.layout.fl_pg_preferred = cpu_to_le32((s32)-1);
+       req->r_args.setlayout.layout.fl_pg_preferred =
+               cpu_to_le32(l.preferred_osd);
 
        err = ceph_mdsc_do_request(mdsc, parent_inode, req);
        ceph_mdsc_put_request(req);
@@ -95,11 +98,11 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
        struct ceph_ioctl_dataloc dl;
        struct inode *inode = file->f_dentry->d_inode;
        struct ceph_inode_info *ci = ceph_inode(inode);
-       struct ceph_osd_client *osdc = &ceph_client(inode->i_sb)->osdc;
+       struct ceph_osd_client *osdc = &ceph_sb_to_client(inode->i_sb)->osdc;
        u64 len = 1, olen;
        u64 tmp;
        struct ceph_object_layout ol;
-       union ceph_pg pgid;
+       struct ceph_pg pgid;
 
        /* copy and validate */
        if (copy_from_user(&dl, arg, sizeof(dl)))
@@ -121,7 +124,7 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg)
        ceph_calc_object_layout(&ol, dl.object_name, &ci->i_layout,
                                osdc->osdmap);
 
-       pgid.pg64 = le64_to_cpu(ol.ol_pgid);
+       pgid = ol.ol_pgid;
        dl.osd = ceph_calc_pg_primary(osdc->osdmap, pgid);
        if (dl.osd >= 0) {
                struct ceph_entity_addr *a =