diff options
author | David Howells <dhowells@redhat.com> | 2007-04-26 18:57:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-04-26 18:57:07 -0400 |
commit | 00d3b7a4533e367b0dc2812a706db8f9f071c27f (patch) | |
tree | f0b1ae0266267cb2c54cb11aa61ad0758ce9c0f5 /fs/afs/vlocation.c | |
parent | 436058a49e0fb91c74454dbee9cfee6fb53b4336 (diff) |
[AFS]: Add security support.
Add security support to the AFS filesystem. Kerberos IV tickets are added as
RxRPC keys are added to the session keyring with the klog program. open() and
other VFS operations then find this ticket with request_key() and either use
it immediately (eg: mkdir, unlink) or attach it to a file descriptor (open).
Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/afs/vlocation.c')
-rw-r--r-- | fs/afs/vlocation.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/fs/afs/vlocation.c b/fs/afs/vlocation.c index 60cb2f408c75..7d9815e9ae0f 100644 --- a/fs/afs/vlocation.c +++ b/fs/afs/vlocation.c | |||
@@ -33,6 +33,7 @@ static struct workqueue_struct *afs_vlocation_update_worker; | |||
33 | * about the volume in question | 33 | * about the volume in question |
34 | */ | 34 | */ |
35 | static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl, | 35 | static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl, |
36 | struct key *key, | ||
36 | struct afs_cache_vlocation *vldb) | 37 | struct afs_cache_vlocation *vldb) |
37 | { | 38 | { |
38 | struct afs_cell *cell = vl->cell; | 39 | struct afs_cell *cell = vl->cell; |
@@ -49,7 +50,7 @@ static int afs_vlocation_access_vl_by_name(struct afs_vlocation *vl, | |||
49 | _debug("CellServ[%hu]: %08x", cell->vl_curr_svix, addr.s_addr); | 50 | _debug("CellServ[%hu]: %08x", cell->vl_curr_svix, addr.s_addr); |
50 | 51 | ||
51 | /* attempt to access the VL server */ | 52 | /* attempt to access the VL server */ |
52 | ret = afs_vl_get_entry_by_name(&addr, vl->vldb.name, vldb, | 53 | ret = afs_vl_get_entry_by_name(&addr, key, vl->vldb.name, vldb, |
53 | &afs_sync_call); | 54 | &afs_sync_call); |
54 | switch (ret) { | 55 | switch (ret) { |
55 | case 0: | 56 | case 0: |
@@ -86,6 +87,7 @@ out: | |||
86 | * about the volume in question | 87 | * about the volume in question |
87 | */ | 88 | */ |
88 | static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl, | 89 | static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl, |
90 | struct key *key, | ||
89 | afs_volid_t volid, | 91 | afs_volid_t volid, |
90 | afs_voltype_t voltype, | 92 | afs_voltype_t voltype, |
91 | struct afs_cache_vlocation *vldb) | 93 | struct afs_cache_vlocation *vldb) |
@@ -104,7 +106,7 @@ static int afs_vlocation_access_vl_by_id(struct afs_vlocation *vl, | |||
104 | _debug("CellServ[%hu]: %08x", cell->vl_curr_svix, addr.s_addr); | 106 | _debug("CellServ[%hu]: %08x", cell->vl_curr_svix, addr.s_addr); |
105 | 107 | ||
106 | /* attempt to access the VL server */ | 108 | /* attempt to access the VL server */ |
107 | ret = afs_vl_get_entry_by_id(&addr, volid, voltype, vldb, | 109 | ret = afs_vl_get_entry_by_id(&addr, key, volid, voltype, vldb, |
108 | &afs_sync_call); | 110 | &afs_sync_call); |
109 | switch (ret) { | 111 | switch (ret) { |
110 | case 0: | 112 | case 0: |
@@ -188,6 +190,7 @@ static struct afs_vlocation *afs_vlocation_alloc(struct afs_cell *cell, | |||
188 | * update record if we found it in the cache | 190 | * update record if we found it in the cache |
189 | */ | 191 | */ |
190 | static int afs_vlocation_update_record(struct afs_vlocation *vl, | 192 | static int afs_vlocation_update_record(struct afs_vlocation *vl, |
193 | struct key *key, | ||
191 | struct afs_cache_vlocation *vldb) | 194 | struct afs_cache_vlocation *vldb) |
192 | { | 195 | { |
193 | afs_voltype_t voltype; | 196 | afs_voltype_t voltype; |
@@ -228,7 +231,7 @@ static int afs_vlocation_update_record(struct afs_vlocation *vl, | |||
228 | /* contact the server to make sure the volume is still available | 231 | /* contact the server to make sure the volume is still available |
229 | * - TODO: need to handle disconnected operation here | 232 | * - TODO: need to handle disconnected operation here |
230 | */ | 233 | */ |
231 | ret = afs_vlocation_access_vl_by_id(vl, vid, voltype, vldb); | 234 | ret = afs_vlocation_access_vl_by_id(vl, key, vid, voltype, vldb); |
232 | switch (ret) { | 235 | switch (ret) { |
233 | /* net error */ | 236 | /* net error */ |
234 | default: | 237 | default: |
@@ -287,7 +290,8 @@ static void afs_vlocation_apply_update(struct afs_vlocation *vl, | |||
287 | * fill in a volume location record, consulting the cache and the VL server | 290 | * fill in a volume location record, consulting the cache and the VL server |
288 | * both | 291 | * both |
289 | */ | 292 | */ |
290 | static int afs_vlocation_fill_in_record(struct afs_vlocation *vl) | 293 | static int afs_vlocation_fill_in_record(struct afs_vlocation *vl, |
294 | struct key *key) | ||
291 | { | 295 | { |
292 | struct afs_cache_vlocation vldb; | 296 | struct afs_cache_vlocation vldb; |
293 | int ret; | 297 | int ret; |
@@ -310,11 +314,11 @@ static int afs_vlocation_fill_in_record(struct afs_vlocation *vl) | |||
310 | /* try to update a known volume in the cell VL databases by | 314 | /* try to update a known volume in the cell VL databases by |
311 | * ID as the name may have changed */ | 315 | * ID as the name may have changed */ |
312 | _debug("found in cache"); | 316 | _debug("found in cache"); |
313 | ret = afs_vlocation_update_record(vl, &vldb); | 317 | ret = afs_vlocation_update_record(vl, key, &vldb); |
314 | } else { | 318 | } else { |
315 | /* try to look up an unknown volume in the cell VL databases by | 319 | /* try to look up an unknown volume in the cell VL databases by |
316 | * name */ | 320 | * name */ |
317 | ret = afs_vlocation_access_vl_by_name(vl, &vldb); | 321 | ret = afs_vlocation_access_vl_by_name(vl, key, &vldb); |
318 | if (ret < 0) { | 322 | if (ret < 0) { |
319 | printk("kAFS: failed to locate '%s' in cell '%s'\n", | 323 | printk("kAFS: failed to locate '%s' in cell '%s'\n", |
320 | vl->vldb.name, vl->cell->name); | 324 | vl->vldb.name, vl->cell->name); |
@@ -366,14 +370,16 @@ void afs_vlocation_queue_for_updates(struct afs_vlocation *vl) | |||
366 | * - insert/update in the local cache if did get a VL response | 370 | * - insert/update in the local cache if did get a VL response |
367 | */ | 371 | */ |
368 | struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, | 372 | struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, |
373 | struct key *key, | ||
369 | const char *name, | 374 | const char *name, |
370 | size_t namesz) | 375 | size_t namesz) |
371 | { | 376 | { |
372 | struct afs_vlocation *vl; | 377 | struct afs_vlocation *vl; |
373 | int ret; | 378 | int ret; |
374 | 379 | ||
375 | _enter("{%s},%*.*s,%zu", | 380 | _enter("{%s},{%x},%*.*s,%zu", |
376 | cell->name, (int) namesz, (int) namesz, name, namesz); | 381 | cell->name, key_serial(key), |
382 | (int) namesz, (int) namesz, name, namesz); | ||
377 | 383 | ||
378 | if (namesz > sizeof(vl->vldb.name)) { | 384 | if (namesz > sizeof(vl->vldb.name)) { |
379 | _leave(" = -ENAMETOOLONG"); | 385 | _leave(" = -ENAMETOOLONG"); |
@@ -405,7 +411,7 @@ struct afs_vlocation *afs_vlocation_lookup(struct afs_cell *cell, | |||
405 | up_write(&cell->vl_sem); | 411 | up_write(&cell->vl_sem); |
406 | 412 | ||
407 | fill_in_record: | 413 | fill_in_record: |
408 | ret = afs_vlocation_fill_in_record(vl); | 414 | ret = afs_vlocation_fill_in_record(vl, key); |
409 | if (ret < 0) | 415 | if (ret < 0) |
410 | goto error_abandon; | 416 | goto error_abandon; |
411 | vl->state = AFS_VL_VALID; | 417 | vl->state = AFS_VL_VALID; |
@@ -656,7 +662,7 @@ static void afs_vlocation_updater(struct work_struct *work) | |||
656 | vl->upd_rej_cnt = 0; | 662 | vl->upd_rej_cnt = 0; |
657 | vl->upd_busy_cnt = 0; | 663 | vl->upd_busy_cnt = 0; |
658 | 664 | ||
659 | ret = afs_vlocation_update_record(vl, &vldb); | 665 | ret = afs_vlocation_update_record(vl, NULL, &vldb); |
660 | switch (ret) { | 666 | switch (ret) { |
661 | case 0: | 667 | case 0: |
662 | afs_vlocation_apply_update(vl, &vldb); | 668 | afs_vlocation_apply_update(vl, &vldb); |