diff options
author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
---|---|---|
committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-17 16:15:55 -0500 |
commit | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (patch) | |
tree | a8f4d49d63b1ecc92f2fddceba0655b2472c5bd9 /fs/ceph/ioctl.c | |
parent | 406089d01562f1e2bf9f089fd7637009ebaad589 (diff) |
Patched in Tegra support.
Diffstat (limited to 'fs/ceph/ioctl.c')
-rw-r--r-- | fs/ceph/ioctl.c | 125 |
1 files changed, 53 insertions, 72 deletions
diff --git a/fs/ceph/ioctl.c b/fs/ceph/ioctl.c index 36549a46e31..3b256b50f7d 100644 --- a/fs/ceph/ioctl.c +++ b/fs/ceph/ioctl.c | |||
@@ -26,7 +26,8 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg) | |||
26 | l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout); | 26 | l.stripe_count = ceph_file_layout_stripe_count(ci->i_layout); |
27 | l.object_size = ceph_file_layout_object_size(ci->i_layout); | 27 | l.object_size = ceph_file_layout_object_size(ci->i_layout); |
28 | l.data_pool = le32_to_cpu(ci->i_layout.fl_pg_pool); | 28 | l.data_pool = le32_to_cpu(ci->i_layout.fl_pg_pool); |
29 | l.preferred_osd = (s32)-1; | 29 | l.preferred_osd = |
30 | (s32)le32_to_cpu(ci->i_layout.fl_pg_preferred); | ||
30 | if (copy_to_user(arg, &l, sizeof(l))) | 31 | if (copy_to_user(arg, &l, sizeof(l))) |
31 | return -EFAULT; | 32 | return -EFAULT; |
32 | } | 33 | } |
@@ -34,33 +35,6 @@ static long ceph_ioctl_get_layout(struct file *file, void __user *arg) | |||
34 | return err; | 35 | return err; |
35 | } | 36 | } |
36 | 37 | ||
37 | static long __validate_layout(struct ceph_mds_client *mdsc, | ||
38 | struct ceph_ioctl_layout *l) | ||
39 | { | ||
40 | int i, err; | ||
41 | |||
42 | /* validate striping parameters */ | ||
43 | if ((l->object_size & ~PAGE_MASK) || | ||
44 | (l->stripe_unit & ~PAGE_MASK) || | ||
45 | (l->stripe_unit != 0 && | ||
46 | ((unsigned)l->object_size % (unsigned)l->stripe_unit))) | ||
47 | return -EINVAL; | ||
48 | |||
49 | /* make sure it's a valid data pool */ | ||
50 | mutex_lock(&mdsc->mutex); | ||
51 | err = -EINVAL; | ||
52 | for (i = 0; i < mdsc->mdsmap->m_num_data_pg_pools; i++) | ||
53 | if (mdsc->mdsmap->m_data_pg_pools[i] == l->data_pool) { | ||
54 | err = 0; | ||
55 | break; | ||
56 | } | ||
57 | mutex_unlock(&mdsc->mutex); | ||
58 | if (err) | ||
59 | return err; | ||
60 | |||
61 | return 0; | ||
62 | } | ||
63 | |||
64 | static long ceph_ioctl_set_layout(struct file *file, void __user *arg) | 38 | static long ceph_ioctl_set_layout(struct file *file, void __user *arg) |
65 | { | 39 | { |
66 | struct inode *inode = file->f_dentry->d_inode; | 40 | struct inode *inode = file->f_dentry->d_inode; |
@@ -68,42 +42,32 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg) | |||
68 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; | 42 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
69 | struct ceph_mds_request *req; | 43 | struct ceph_mds_request *req; |
70 | struct ceph_ioctl_layout l; | 44 | struct ceph_ioctl_layout l; |
71 | struct ceph_inode_info *ci = ceph_inode(file->f_dentry->d_inode); | 45 | int err, i; |
72 | struct ceph_ioctl_layout nl; | ||
73 | int err; | ||
74 | 46 | ||
47 | /* copy and validate */ | ||
75 | if (copy_from_user(&l, arg, sizeof(l))) | 48 | if (copy_from_user(&l, arg, sizeof(l))) |
76 | return -EFAULT; | 49 | return -EFAULT; |
77 | 50 | ||
78 | /* validate changed params against current layout */ | 51 | if ((l.object_size & ~PAGE_MASK) || |
79 | err = ceph_do_getattr(file->f_dentry->d_inode, CEPH_STAT_CAP_LAYOUT); | 52 | (l.stripe_unit & ~PAGE_MASK) || |
80 | if (err) | 53 | !l.stripe_unit || |
81 | return err; | 54 | (l.object_size && |
82 | 55 | (unsigned)l.object_size % (unsigned)l.stripe_unit)) | |
83 | memset(&nl, 0, sizeof(nl)); | 56 | return -EINVAL; |
84 | if (l.stripe_count) | 57 | |
85 | nl.stripe_count = l.stripe_count; | 58 | /* make sure it's a valid data pool */ |
86 | else | 59 | if (l.data_pool > 0) { |
87 | nl.stripe_count = ceph_file_layout_stripe_count(ci->i_layout); | 60 | mutex_lock(&mdsc->mutex); |
88 | if (l.stripe_unit) | 61 | err = -EINVAL; |
89 | nl.stripe_unit = l.stripe_unit; | 62 | for (i = 0; i < mdsc->mdsmap->m_num_data_pg_pools; i++) |
90 | else | 63 | if (mdsc->mdsmap->m_data_pg_pools[i] == l.data_pool) { |
91 | nl.stripe_unit = ceph_file_layout_su(ci->i_layout); | 64 | err = 0; |
92 | if (l.object_size) | 65 | break; |
93 | nl.object_size = l.object_size; | 66 | } |
94 | else | 67 | mutex_unlock(&mdsc->mutex); |
95 | nl.object_size = ceph_file_layout_object_size(ci->i_layout); | 68 | if (err) |
96 | if (l.data_pool) | 69 | return err; |
97 | nl.data_pool = l.data_pool; | 70 | } |
98 | else | ||
99 | nl.data_pool = ceph_file_layout_pg_pool(ci->i_layout); | ||
100 | |||
101 | /* this is obsolete, and always -1 */ | ||
102 | nl.preferred_osd = le64_to_cpu(-1); | ||
103 | |||
104 | err = __validate_layout(mdsc, &nl); | ||
105 | if (err) | ||
106 | return err; | ||
107 | 71 | ||
108 | req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETLAYOUT, | 72 | req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETLAYOUT, |
109 | USE_AUTH_MDS); | 73 | USE_AUTH_MDS); |
@@ -120,6 +84,8 @@ static long ceph_ioctl_set_layout(struct file *file, void __user *arg) | |||
120 | req->r_args.setlayout.layout.fl_object_size = | 84 | req->r_args.setlayout.layout.fl_object_size = |
121 | cpu_to_le32(l.object_size); | 85 | cpu_to_le32(l.object_size); |
122 | req->r_args.setlayout.layout.fl_pg_pool = cpu_to_le32(l.data_pool); | 86 | req->r_args.setlayout.layout.fl_pg_pool = cpu_to_le32(l.data_pool); |
87 | req->r_args.setlayout.layout.fl_pg_preferred = | ||
88 | cpu_to_le32(l.preferred_osd); | ||
123 | 89 | ||
124 | parent_inode = ceph_get_dentry_parent_inode(file->f_dentry); | 90 | parent_inode = ceph_get_dentry_parent_inode(file->f_dentry); |
125 | err = ceph_mdsc_do_request(mdsc, parent_inode, req); | 91 | err = ceph_mdsc_do_request(mdsc, parent_inode, req); |
@@ -139,16 +105,33 @@ static long ceph_ioctl_set_layout_policy (struct file *file, void __user *arg) | |||
139 | struct inode *inode = file->f_dentry->d_inode; | 105 | struct inode *inode = file->f_dentry->d_inode; |
140 | struct ceph_mds_request *req; | 106 | struct ceph_mds_request *req; |
141 | struct ceph_ioctl_layout l; | 107 | struct ceph_ioctl_layout l; |
142 | int err; | 108 | int err, i; |
143 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; | 109 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
144 | 110 | ||
145 | /* copy and validate */ | 111 | /* copy and validate */ |
146 | if (copy_from_user(&l, arg, sizeof(l))) | 112 | if (copy_from_user(&l, arg, sizeof(l))) |
147 | return -EFAULT; | 113 | return -EFAULT; |
148 | 114 | ||
149 | err = __validate_layout(mdsc, &l); | 115 | if ((l.object_size & ~PAGE_MASK) || |
150 | if (err) | 116 | (l.stripe_unit & ~PAGE_MASK) || |
151 | return err; | 117 | !l.stripe_unit || |
118 | (l.object_size && | ||
119 | (unsigned)l.object_size % (unsigned)l.stripe_unit)) | ||
120 | return -EINVAL; | ||
121 | |||
122 | /* make sure it's a valid data pool */ | ||
123 | if (l.data_pool > 0) { | ||
124 | mutex_lock(&mdsc->mutex); | ||
125 | err = -EINVAL; | ||
126 | for (i = 0; i < mdsc->mdsmap->m_num_data_pg_pools; i++) | ||
127 | if (mdsc->mdsmap->m_data_pg_pools[i] == l.data_pool) { | ||
128 | err = 0; | ||
129 | break; | ||
130 | } | ||
131 | mutex_unlock(&mdsc->mutex); | ||
132 | if (err) | ||
133 | return err; | ||
134 | } | ||
152 | 135 | ||
153 | req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETDIRLAYOUT, | 136 | req = ceph_mdsc_create_request(mdsc, CEPH_MDS_OP_SETDIRLAYOUT, |
154 | USE_AUTH_MDS); | 137 | USE_AUTH_MDS); |
@@ -166,6 +149,8 @@ static long ceph_ioctl_set_layout_policy (struct file *file, void __user *arg) | |||
166 | cpu_to_le32(l.object_size); | 149 | cpu_to_le32(l.object_size); |
167 | req->r_args.setlayout.layout.fl_pg_pool = | 150 | req->r_args.setlayout.layout.fl_pg_pool = |
168 | cpu_to_le32(l.data_pool); | 151 | cpu_to_le32(l.data_pool); |
152 | req->r_args.setlayout.layout.fl_pg_preferred = | ||
153 | cpu_to_le32(l.preferred_osd); | ||
169 | 154 | ||
170 | err = ceph_mdsc_do_request(mdsc, inode, req); | 155 | err = ceph_mdsc_do_request(mdsc, inode, req); |
171 | ceph_mdsc_put_request(req); | 156 | ceph_mdsc_put_request(req); |
@@ -187,18 +172,14 @@ static long ceph_ioctl_get_dataloc(struct file *file, void __user *arg) | |||
187 | u64 tmp; | 172 | u64 tmp; |
188 | struct ceph_object_layout ol; | 173 | struct ceph_object_layout ol; |
189 | struct ceph_pg pgid; | 174 | struct ceph_pg pgid; |
190 | int r; | ||
191 | 175 | ||
192 | /* copy and validate */ | 176 | /* copy and validate */ |
193 | if (copy_from_user(&dl, arg, sizeof(dl))) | 177 | if (copy_from_user(&dl, arg, sizeof(dl))) |
194 | return -EFAULT; | 178 | return -EFAULT; |
195 | 179 | ||
196 | down_read(&osdc->map_sem); | 180 | down_read(&osdc->map_sem); |
197 | r = ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, &len, | 181 | ceph_calc_file_object_mapping(&ci->i_layout, dl.file_offset, &len, |
198 | &dl.object_no, &dl.object_offset, | 182 | &dl.object_no, &dl.object_offset, &olen); |
199 | &olen); | ||
200 | if (r < 0) | ||
201 | return -EIO; | ||
202 | dl.file_offset -= dl.object_offset; | 183 | dl.file_offset -= dl.object_offset; |
203 | dl.object_size = ceph_file_layout_object_size(ci->i_layout); | 184 | dl.object_size = ceph_file_layout_object_size(ci->i_layout); |
204 | dl.block_size = ceph_file_layout_su(ci->i_layout); | 185 | dl.block_size = ceph_file_layout_su(ci->i_layout); |
@@ -238,11 +219,11 @@ static long ceph_ioctl_lazyio(struct file *file) | |||
238 | struct ceph_inode_info *ci = ceph_inode(inode); | 219 | struct ceph_inode_info *ci = ceph_inode(inode); |
239 | 220 | ||
240 | if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) { | 221 | if ((fi->fmode & CEPH_FILE_MODE_LAZY) == 0) { |
241 | spin_lock(&ci->i_ceph_lock); | 222 | spin_lock(&inode->i_lock); |
242 | ci->i_nr_by_mode[fi->fmode]--; | 223 | ci->i_nr_by_mode[fi->fmode]--; |
243 | fi->fmode |= CEPH_FILE_MODE_LAZY; | 224 | fi->fmode |= CEPH_FILE_MODE_LAZY; |
244 | ci->i_nr_by_mode[fi->fmode]++; | 225 | ci->i_nr_by_mode[fi->fmode]++; |
245 | spin_unlock(&ci->i_ceph_lock); | 226 | spin_unlock(&inode->i_lock); |
246 | dout("ioctl_layzio: file %p marked lazy\n", file); | 227 | dout("ioctl_layzio: file %p marked lazy\n", file); |
247 | 228 | ||
248 | ceph_check_caps(ci, 0, NULL); | 229 | ceph_check_caps(ci, 0, NULL); |