diff options
author | J. Bruce Fields <bfields@citi.umich.edu> | 2009-09-02 19:50:40 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-09-02 23:54:48 -0400 |
commit | bc6c53d5a1383d5d9632adf33bd03458cfc0869d (patch) | |
tree | 6caf2e75f17efca08884dcaccb750901e2af2b26 /fs/nfsd/nfsfh.c | |
parent | 8e498751f2f36074ffa6fc7f0a9ec6e055b350e6 (diff) |
nfsd: move fsid_type choice out of fh_compose
More trivial cleanup.
Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'fs/nfsd/nfsfh.c')
-rw-r--r-- | fs/nfsd/nfsfh.c | 77 |
1 files changed, 41 insertions, 36 deletions
diff --git a/fs/nfsd/nfsfh.c b/fs/nfsd/nfsfh.c index 78d8ebf162ca..bce0b2bfbc61 100644 --- a/fs/nfsd/nfsfh.c +++ b/fs/nfsd/nfsfh.c | |||
@@ -431,43 +431,17 @@ static bool fsid_type_ok_for_exp(u8 fsid_type, struct svc_export *exp) | |||
431 | return 1; | 431 | return 1; |
432 | } | 432 | } |
433 | 433 | ||
434 | __be32 | ||
435 | fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, | ||
436 | struct svc_fh *ref_fh) | ||
437 | { | ||
438 | /* ref_fh is a reference file handle. | ||
439 | * if it is non-null and for the same filesystem, then we should compose | ||
440 | * a filehandle which is of the same version, where possible. | ||
441 | * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca | ||
442 | * Then create a 32byte filehandle using nfs_fhbase_old | ||
443 | * | ||
444 | */ | ||
445 | 434 | ||
435 | static void set_version_and_fsid_type(struct svc_fh *fhp, struct svc_export *exp, struct svc_fh *ref_fh) | ||
436 | { | ||
446 | u8 version; | 437 | u8 version; |
447 | u8 fsid_type = 0; | 438 | u8 fsid_type; |
448 | struct inode * inode = dentry->d_inode; | 439 | retry: |
449 | struct dentry *parent = dentry->d_parent; | ||
450 | __u32 *datap; | ||
451 | dev_t ex_dev = exp_sb(exp)->s_dev; | ||
452 | |||
453 | dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", | ||
454 | MAJOR(ex_dev), MINOR(ex_dev), | ||
455 | (long) exp->ex_path.dentry->d_inode->i_ino, | ||
456 | parent->d_name.name, dentry->d_name.name, | ||
457 | (inode ? inode->i_ino : 0)); | ||
458 | |||
459 | /* Choose filehandle version and fsid type based on | ||
460 | * the reference filehandle (if it is in the same export) | ||
461 | * or the export options. | ||
462 | */ | ||
463 | retry: | ||
464 | version = 1; | 440 | version = 1; |
465 | if (ref_fh && ref_fh->fh_export == exp) { | 441 | if (ref_fh && ref_fh->fh_export == exp) { |
466 | version = ref_fh->fh_handle.fh_version; | 442 | version = ref_fh->fh_handle.fh_version; |
467 | fsid_type = ref_fh->fh_handle.fh_fsid_type; | 443 | fsid_type = ref_fh->fh_handle.fh_fsid_type; |
468 | 444 | ||
469 | if (ref_fh == fhp) | ||
470 | fh_put(ref_fh); | ||
471 | ref_fh = NULL; | 445 | ref_fh = NULL; |
472 | 446 | ||
473 | switch (version) { | 447 | switch (version) { |
@@ -502,11 +476,44 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, | |||
502 | else | 476 | else |
503 | fsid_type = FSID_UUID4_INUM; | 477 | fsid_type = FSID_UUID4_INUM; |
504 | } | 478 | } |
505 | } else if (!old_valid_dev(ex_dev)) | 479 | } else if (!old_valid_dev(exp_sb(exp)->s_dev)) |
506 | /* for newer device numbers, we must use a newer fsid format */ | 480 | /* for newer device numbers, we must use a newer fsid format */ |
507 | fsid_type = FSID_ENCODE_DEV; | 481 | fsid_type = FSID_ENCODE_DEV; |
508 | else | 482 | else |
509 | fsid_type = FSID_DEV; | 483 | fsid_type = FSID_DEV; |
484 | fhp->fh_handle.fh_version = version; | ||
485 | if (version) | ||
486 | fhp->fh_handle.fh_fsid_type = fsid_type; | ||
487 | } | ||
488 | |||
489 | __be32 | ||
490 | fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, | ||
491 | struct svc_fh *ref_fh) | ||
492 | { | ||
493 | /* ref_fh is a reference file handle. | ||
494 | * if it is non-null and for the same filesystem, then we should compose | ||
495 | * a filehandle which is of the same version, where possible. | ||
496 | * Currently, that means that if ref_fh->fh_handle.fh_version == 0xca | ||
497 | * Then create a 32byte filehandle using nfs_fhbase_old | ||
498 | * | ||
499 | */ | ||
500 | |||
501 | struct inode * inode = dentry->d_inode; | ||
502 | struct dentry *parent = dentry->d_parent; | ||
503 | __u32 *datap; | ||
504 | dev_t ex_dev = exp_sb(exp)->s_dev; | ||
505 | |||
506 | dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", | ||
507 | MAJOR(ex_dev), MINOR(ex_dev), | ||
508 | (long) exp->ex_path.dentry->d_inode->i_ino, | ||
509 | parent->d_name.name, dentry->d_name.name, | ||
510 | (inode ? inode->i_ino : 0)); | ||
511 | |||
512 | /* Choose filehandle version and fsid type based on | ||
513 | * the reference filehandle (if it is in the same export) | ||
514 | * or the export options. | ||
515 | */ | ||
516 | set_version_and_fsid_type(fhp, exp, ref_fh); | ||
510 | 517 | ||
511 | if (ref_fh == fhp) | 518 | if (ref_fh == fhp) |
512 | fh_put(ref_fh); | 519 | fh_put(ref_fh); |
@@ -524,7 +531,7 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, | |||
524 | fhp->fh_export = exp; | 531 | fhp->fh_export = exp; |
525 | cache_get(&exp->h); | 532 | cache_get(&exp->h); |
526 | 533 | ||
527 | if (version == 0xca) { | 534 | if (fhp->fh_handle.fh_version == 0xca) { |
528 | /* old style filehandle please */ | 535 | /* old style filehandle please */ |
529 | memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE); | 536 | memset(&fhp->fh_handle.fh_base, 0, NFS_FHSIZE); |
530 | fhp->fh_handle.fh_size = NFS_FHSIZE; | 537 | fhp->fh_handle.fh_size = NFS_FHSIZE; |
@@ -538,15 +545,13 @@ fh_compose(struct svc_fh *fhp, struct svc_export *exp, struct dentry *dentry, | |||
538 | _fh_update_old(dentry, exp, &fhp->fh_handle); | 545 | _fh_update_old(dentry, exp, &fhp->fh_handle); |
539 | } else { | 546 | } else { |
540 | int len; | 547 | int len; |
541 | fhp->fh_handle.fh_version = 1; | ||
542 | fhp->fh_handle.fh_auth_type = 0; | 548 | fhp->fh_handle.fh_auth_type = 0; |
543 | datap = fhp->fh_handle.fh_auth+0; | 549 | datap = fhp->fh_handle.fh_auth+0; |
544 | fhp->fh_handle.fh_fsid_type = fsid_type; | 550 | mk_fsid(fhp->fh_handle.fh_fsid_type, datap, ex_dev, |
545 | mk_fsid(fsid_type, datap, ex_dev, | ||
546 | exp->ex_path.dentry->d_inode->i_ino, | 551 | exp->ex_path.dentry->d_inode->i_ino, |
547 | exp->ex_fsid, exp->ex_uuid); | 552 | exp->ex_fsid, exp->ex_uuid); |
548 | 553 | ||
549 | len = key_len(fsid_type); | 554 | len = key_len(fhp->fh_handle.fh_fsid_type); |
550 | datap += len/4; | 555 | datap += len/4; |
551 | fhp->fh_handle.fh_size = 4 + len; | 556 | fhp->fh_handle.fh_size = 4 + len; |
552 | 557 | ||