| @@ -1,14 +1,14 @@ | | | @@ -1,14 +1,14 @@ |
1 | /* $NetBSD: p2k.c,v 1.45 2010/11/26 11:12:06 pooka Exp $ */ | | 1 | /* $NetBSD: p2k.c,v 1.46 2010/11/30 10:49:22 dholland Exp $ */ |
2 | | | 2 | |
3 | /* | | 3 | /* |
4 | * Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved. | | 4 | * Copyright (c) 2007, 2008, 2009 Antti Kantee. All Rights Reserved. |
5 | * | | 5 | * |
6 | * Development of this software was supported by the | | 6 | * Development of this software was supported by the |
7 | * Finnish Cultural Foundation. | | 7 | * Finnish Cultural Foundation. |
8 | * | | 8 | * |
9 | * Redistribution and use in source and binary forms, with or without | | 9 | * Redistribution and use in source and binary forms, with or without |
10 | * modification, are permitted provided that the following conditions | | 10 | * modification, are permitted provided that the following conditions |
11 | * are met: | | 11 | * are met: |
12 | * 1. Redistributions of source code must retain the above copyright | | 12 | * 1. Redistributions of source code must retain the above copyright |
13 | * notice, this list of conditions and the following disclaimer. | | 13 | * notice, this list of conditions and the following disclaimer. |
14 | * 2. Redistributions in binary form must reproduce the above copyright | | 14 | * 2. Redistributions in binary form must reproduce the above copyright |
| @@ -686,37 +686,37 @@ p2k_node_lookup(struct puffs_usermount * | | | @@ -686,37 +686,37 @@ p2k_node_lookup(struct puffs_usermount * |
686 | * without SAVESTART 3) RENAME. Hold on to this like | | 686 | * without SAVESTART 3) RENAME. Hold on to this like |
687 | * it were the absolute truth for now. However, do | | 687 | * it were the absolute truth for now. However, do |
688 | * not sprinkle asserts based on this due to abovementioned | | 688 | * not sprinkle asserts based on this due to abovementioned |
689 | * brokenness -- some file system drivers might not | | 689 | * brokenness -- some file system drivers might not |
690 | * even issue ABORT properly, so just free resources | | 690 | * even issue ABORT properly, so just free resources |
691 | * on the fly and hope for the best. PR kern/42348 | | 691 | * on the fly and hope for the best. PR kern/42348 |
692 | */ | | 692 | */ |
693 | if (pcn->pcn_flags & RUMP_NAMEI_INRENAME) { | | 693 | if (pcn->pcn_flags & RUMP_NAMEI_INRENAME) { |
694 | if (pcn->pcn_nameiop == RUMP_NAMEI_DELETE) { | | 694 | if (pcn->pcn_nameiop == RUMP_NAMEI_DELETE) { |
695 | /* save path from the first lookup */ | | 695 | /* save path from the first lookup */ |
696 | if (pcn->pcn_flags & RUMP_NAMEI_SAVESTART) { | | 696 | if (pcn->pcn_flags & RUMP_NAMEI_SAVESTART) { |
697 | if (p2n_dir->p2n_cn_ren_src) | | 697 | if (p2n_dir->p2n_cn_ren_src) |
698 | freecn(p2n_dir->p2n_cn_ren_src, | | 698 | freecn(p2n_dir->p2n_cn_ren_src, |
699 | RUMPCN_FORCEFREE); | | 699 | 0); |
700 | p2n_dir->p2n_cn_ren_src = cn; | | 700 | p2n_dir->p2n_cn_ren_src = cn; |
701 | } else { | | 701 | } else { |
702 | freecn(cn, RUMPCN_FORCEFREE); | | 702 | freecn(cn, 0); |
703 | cn = NULL; | | 703 | cn = NULL; |
704 | } | | 704 | } |
705 | } else { | | 705 | } else { |
706 | assert(pcn->pcn_nameiop == RUMP_NAMEI_RENAME); | | 706 | assert(pcn->pcn_nameiop == RUMP_NAMEI_RENAME); |
707 | if (p2n_dir->p2n_cn_ren_targ) | | 707 | if (p2n_dir->p2n_cn_ren_targ) |
708 | freecn(p2n_dir->p2n_cn_ren_targ, | | 708 | freecn(p2n_dir->p2n_cn_ren_targ, |
709 | RUMPCN_FORCEFREE); | | 709 | 0); |
710 | p2n_dir->p2n_cn_ren_targ = cn; | | 710 | p2n_dir->p2n_cn_ren_targ = cn; |
711 | } | | 711 | } |
712 | } else { | | 712 | } else { |
713 | assert(p2n_dir->p2n_cn == NULL); | | 713 | assert(p2n_dir->p2n_cn == NULL); |
714 | p2n_dir->p2n_cn = cn; | | 714 | p2n_dir->p2n_cn = cn; |
715 | } | | 715 | } |
716 | } else { | | 716 | } else { |
717 | freecn(cn, 0); | | 717 | freecn(cn, 0); |
718 | cn = NULL; | | 718 | cn = NULL; |
719 | } | | 719 | } |
720 | if (rv) { | | 720 | if (rv) { |
721 | if (rv == EJUSTRETURN) { | | 721 | if (rv == EJUSTRETURN) { |
722 | rv = ENOENT; | | 722 | rv = ENOENT; |
| @@ -793,27 +793,27 @@ do_makenode(struct puffs_usermount *pu, | | | @@ -793,27 +793,27 @@ do_makenode(struct puffs_usermount *pu, |
793 | struct vattr *va_x; | | 793 | struct vattr *va_x; |
794 | struct vnode *vp; | | 794 | struct vnode *vp; |
795 | int rv; | | 795 | int rv; |
796 | | | 796 | |
797 | p2n = malloc(sizeof(*p2n)); | | 797 | p2n = malloc(sizeof(*p2n)); |
798 | if (p2n == NULL) | | 798 | if (p2n == NULL) |
799 | return ENOMEM; | | 799 | return ENOMEM; |
800 | DOCOMPAT(vap, va_x); | | 800 | DOCOMPAT(vap, va_x); |
801 | | | 801 | |
802 | if (p2n_dir->p2n_cn) { | | 802 | if (p2n_dir->p2n_cn) { |
803 | cn = p2n_dir->p2n_cn; | | 803 | cn = p2n_dir->p2n_cn; |
804 | p2n_dir->p2n_cn = NULL; | | 804 | p2n_dir->p2n_cn = NULL; |
805 | } else { | | 805 | } else { |
806 | cn = makecn(pcn, RUMP_NAMEI_HASBUF); | | 806 | cn = makecn(pcn, 0); |
807 | } | | 807 | } |
808 | | | 808 | |
809 | RUMP_VOP_LOCK(dvp, LK_EXCLUSIVE); | | 809 | RUMP_VOP_LOCK(dvp, LK_EXCLUSIVE); |
810 | rump_pub_vp_incref(dvp); | | 810 | rump_pub_vp_incref(dvp); |
811 | if (makefn) { | | 811 | if (makefn) { |
812 | rv = makefn(dvp, &vp, cn, va_x); | | 812 | rv = makefn(dvp, &vp, cn, va_x); |
813 | } else { | | 813 | } else { |
814 | rv = symfn(dvp, &vp, cn, va_x, link_target); | | 814 | rv = symfn(dvp, &vp, cn, va_x, link_target); |
815 | } | | 815 | } |
816 | assert(RUMP_VOP_ISLOCKED(dvp) == 0); | | 816 | assert(RUMP_VOP_ISLOCKED(dvp) == 0); |
817 | freecn(cn, 0); | | 817 | freecn(cn, 0); |
818 | | | 818 | |
819 | if (rv == 0) { | | 819 | if (rv == 0) { |
| @@ -1022,51 +1022,51 @@ p2k_node_seek(struct puffs_usermount *pu | | | @@ -1022,51 +1022,51 @@ p2k_node_seek(struct puffs_usermount *pu |
1022 | /*ARGSUSED*/ | | 1022 | /*ARGSUSED*/ |
1023 | int | | 1023 | int |
1024 | p2k_node_abortop(struct puffs_usermount *pu, puffs_cookie_t opc, | | 1024 | p2k_node_abortop(struct puffs_usermount *pu, puffs_cookie_t opc, |
1025 | const struct puffs_cn *pcn) | | 1025 | const struct puffs_cn *pcn) |
1026 | { | | 1026 | { |
1027 | struct p2k_node *p2n_dir = opc; | | 1027 | struct p2k_node *p2n_dir = opc; |
1028 | struct componentname *cnp; | | 1028 | struct componentname *cnp; |
1029 | | | 1029 | |
1030 | if ((cnp = p2n_dir->p2n_cn) != NULL) { | | 1030 | if ((cnp = p2n_dir->p2n_cn) != NULL) { |
1031 | freecn(cnp, 0); | | 1031 | freecn(cnp, 0); |
1032 | p2n_dir->p2n_cn = NULL; | | 1032 | p2n_dir->p2n_cn = NULL; |
1033 | } | | 1033 | } |
1034 | if ((cnp = p2n_dir->p2n_cn_ren_src) != NULL) { | | 1034 | if ((cnp = p2n_dir->p2n_cn_ren_src) != NULL) { |
1035 | freecn(cnp, RUMPCN_FORCEFREE); | | 1035 | freecn(cnp, 0); |
1036 | p2n_dir->p2n_cn_ren_src = NULL; | | 1036 | p2n_dir->p2n_cn_ren_src = NULL; |
1037 | } | | 1037 | } |
1038 | if ((cnp = p2n_dir->p2n_cn_ren_targ) != NULL) { | | 1038 | if ((cnp = p2n_dir->p2n_cn_ren_targ) != NULL) { |
1039 | freecn(cnp, RUMPCN_FORCEFREE); | | 1039 | freecn(cnp, 0); |
1040 | p2n_dir->p2n_cn_ren_targ = NULL; | | 1040 | p2n_dir->p2n_cn_ren_targ = NULL; |
1041 | } | | 1041 | } |
1042 | | | 1042 | |
1043 | return 0; | | 1043 | return 0; |
1044 | } | | 1044 | } |
1045 | | | 1045 | |
1046 | static int | | 1046 | static int |
1047 | do_nukenode(struct p2k_node *p2n_dir, struct p2k_node *p2n, | | 1047 | do_nukenode(struct p2k_node *p2n_dir, struct p2k_node *p2n, |
1048 | const struct puffs_cn *pcn, | | 1048 | const struct puffs_cn *pcn, |
1049 | int (*nukefn)(struct vnode *, struct vnode *, struct componentname *)) | | 1049 | int (*nukefn)(struct vnode *, struct vnode *, struct componentname *)) |
1050 | { | | 1050 | { |
1051 | struct vnode *dvp = p2n_dir->p2n_vp, *vp = p2n->p2n_vp; | | 1051 | struct vnode *dvp = p2n_dir->p2n_vp, *vp = p2n->p2n_vp; |
1052 | struct componentname *cn; | | 1052 | struct componentname *cn; |
1053 | int rv; | | 1053 | int rv; |
1054 | | | 1054 | |
1055 | if (p2n_dir->p2n_cn) { | | 1055 | if (p2n_dir->p2n_cn) { |
1056 | cn = p2n_dir->p2n_cn; | | 1056 | cn = p2n_dir->p2n_cn; |
1057 | p2n_dir->p2n_cn = NULL; | | 1057 | p2n_dir->p2n_cn = NULL; |
1058 | } else { | | 1058 | } else { |
1059 | cn = makecn(pcn, RUMP_NAMEI_HASBUF); | | 1059 | cn = makecn(pcn, 0); |
1060 | } | | 1060 | } |
1061 | | | 1061 | |
1062 | RUMP_VOP_LOCK(dvp, LK_EXCLUSIVE); | | 1062 | RUMP_VOP_LOCK(dvp, LK_EXCLUSIVE); |
1063 | rump_pub_vp_incref(dvp); | | 1063 | rump_pub_vp_incref(dvp); |
1064 | RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); | | 1064 | RUMP_VOP_LOCK(vp, LK_EXCLUSIVE); |
1065 | rump_pub_vp_incref(vp); | | 1065 | rump_pub_vp_incref(vp); |
1066 | rv = nukefn(dvp, vp, cn); | | 1066 | rv = nukefn(dvp, vp, cn); |
1067 | assert(RUMP_VOP_ISLOCKED(dvp) == 0); | | 1067 | assert(RUMP_VOP_ISLOCKED(dvp) == 0); |
1068 | assert(RUMP_VOP_ISLOCKED(vp) == 0); | | 1068 | assert(RUMP_VOP_ISLOCKED(vp) == 0); |
1069 | freecn(cn, 0); | | 1069 | freecn(cn, 0); |
1070 | | | 1070 | |
1071 | return rv; | | 1071 | return rv; |
1072 | | | 1072 | |
| @@ -1085,27 +1085,27 @@ p2k_node_remove(struct puffs_usermount * | | | @@ -1085,27 +1085,27 @@ p2k_node_remove(struct puffs_usermount * |
1085 | int | | 1085 | int |
1086 | p2k_node_link(struct puffs_usermount *pu, puffs_cookie_t opc, | | 1086 | p2k_node_link(struct puffs_usermount *pu, puffs_cookie_t opc, |
1087 | puffs_cookie_t targ, const struct puffs_cn *pcn) | | 1087 | puffs_cookie_t targ, const struct puffs_cn *pcn) |
1088 | { | | 1088 | { |
1089 | struct vnode *dvp = OPC2VP(opc); | | 1089 | struct vnode *dvp = OPC2VP(opc); |
1090 | struct p2k_node *p2n_dir = opc; | | 1090 | struct p2k_node *p2n_dir = opc; |
1091 | struct componentname *cn; | | 1091 | struct componentname *cn; |
1092 | int rv; | | 1092 | int rv; |
1093 | | | 1093 | |
1094 | if (p2n_dir->p2n_cn) { | | 1094 | if (p2n_dir->p2n_cn) { |
1095 | cn = p2n_dir->p2n_cn; | | 1095 | cn = p2n_dir->p2n_cn; |
1096 | p2n_dir->p2n_cn = NULL; | | 1096 | p2n_dir->p2n_cn = NULL; |
1097 | } else { | | 1097 | } else { |
1098 | cn = makecn(pcn, RUMP_NAMEI_HASBUF); | | 1098 | cn = makecn(pcn, 0); |
1099 | } | | 1099 | } |
1100 | | | 1100 | |
1101 | RUMP_VOP_LOCK(dvp, LK_EXCLUSIVE); | | 1101 | RUMP_VOP_LOCK(dvp, LK_EXCLUSIVE); |
1102 | rump_pub_vp_incref(dvp); | | 1102 | rump_pub_vp_incref(dvp); |
1103 | rv = RUMP_VOP_LINK(dvp, OPC2VP(targ), cn); | | 1103 | rv = RUMP_VOP_LINK(dvp, OPC2VP(targ), cn); |
1104 | freecn(cn, 0); | | 1104 | freecn(cn, 0); |
1105 | | | 1105 | |
1106 | return rv; | | 1106 | return rv; |
1107 | } | | 1107 | } |
1108 | | | 1108 | |
1109 | /*ARGSUSED*/ | | 1109 | /*ARGSUSED*/ |
1110 | int | | 1110 | int |
1111 | p2k_node_rename(struct puffs_usermount *pu, | | 1111 | p2k_node_rename(struct puffs_usermount *pu, |
| @@ -1113,58 +1113,58 @@ p2k_node_rename(struct puffs_usermount * | | | @@ -1113,58 +1113,58 @@ p2k_node_rename(struct puffs_usermount * |
1113 | const struct puffs_cn *pcn_src, | | 1113 | const struct puffs_cn *pcn_src, |
1114 | puffs_cookie_t targ_dir, puffs_cookie_t targ, | | 1114 | puffs_cookie_t targ_dir, puffs_cookie_t targ, |
1115 | const struct puffs_cn *pcn_targ) | | 1115 | const struct puffs_cn *pcn_targ) |
1116 | { | | 1116 | { |
1117 | struct p2k_node *p2n_srcdir = src_dir, *p2n_targdir = targ_dir; | | 1117 | struct p2k_node *p2n_srcdir = src_dir, *p2n_targdir = targ_dir; |
1118 | struct vnode *dvp, *vp, *tdvp, *tvp = NULL; | | 1118 | struct vnode *dvp, *vp, *tdvp, *tvp = NULL; |
1119 | struct componentname *cn_src, *cn_targ; | | 1119 | struct componentname *cn_src, *cn_targ; |
1120 | int rv; | | 1120 | int rv; |
1121 | | | 1121 | |
1122 | if (p2n_srcdir->p2n_cn_ren_src) { | | 1122 | if (p2n_srcdir->p2n_cn_ren_src) { |
1123 | cn_src = p2n_srcdir->p2n_cn_ren_src; | | 1123 | cn_src = p2n_srcdir->p2n_cn_ren_src; |
1124 | p2n_srcdir->p2n_cn_ren_src = NULL; | | 1124 | p2n_srcdir->p2n_cn_ren_src = NULL; |
1125 | } else { | | 1125 | } else { |
1126 | cn_src = makecn(pcn_src, RUMP_NAMEI_HASBUF); | | 1126 | cn_src = makecn(pcn_src, 0); |
1127 | } | | 1127 | } |
1128 | | | 1128 | |
1129 | if (p2n_targdir->p2n_cn_ren_targ) { | | 1129 | if (p2n_targdir->p2n_cn_ren_targ) { |
1130 | cn_targ = p2n_targdir->p2n_cn_ren_targ; | | 1130 | cn_targ = p2n_targdir->p2n_cn_ren_targ; |
1131 | p2n_targdir->p2n_cn_ren_targ = NULL; | | 1131 | p2n_targdir->p2n_cn_ren_targ = NULL; |
1132 | } else { | | 1132 | } else { |
1133 | cn_targ = makecn(pcn_targ, RUMP_NAMEI_HASBUF); | | 1133 | cn_targ = makecn(pcn_targ, 0); |
1134 | } | | 1134 | } |
1135 | | | 1135 | |
1136 | dvp = OPC2VP(src_dir); | | 1136 | dvp = OPC2VP(src_dir); |
1137 | vp = OPC2VP(src); | | 1137 | vp = OPC2VP(src); |
1138 | tdvp = OPC2VP(targ_dir); | | 1138 | tdvp = OPC2VP(targ_dir); |
1139 | if (targ) { | | 1139 | if (targ) { |
1140 | tvp = OPC2VP(targ); | | 1140 | tvp = OPC2VP(targ); |
1141 | } | | 1141 | } |
1142 | | | 1142 | |
1143 | rump_pub_vp_incref(dvp); | | 1143 | rump_pub_vp_incref(dvp); |
1144 | rump_pub_vp_incref(vp); | | 1144 | rump_pub_vp_incref(vp); |
1145 | RUMP_VOP_LOCK(tdvp, LK_EXCLUSIVE); | | 1145 | RUMP_VOP_LOCK(tdvp, LK_EXCLUSIVE); |
1146 | rump_pub_vp_incref(tdvp); | | 1146 | rump_pub_vp_incref(tdvp); |
1147 | if (tvp) { | | 1147 | if (tvp) { |
1148 | RUMP_VOP_LOCK(tvp, LK_EXCLUSIVE); | | 1148 | RUMP_VOP_LOCK(tvp, LK_EXCLUSIVE); |
1149 | rump_pub_vp_incref(tvp); | | 1149 | rump_pub_vp_incref(tvp); |
1150 | } | | 1150 | } |
1151 | rv = RUMP_VOP_RENAME(dvp, vp, cn_src, tdvp, tvp, cn_targ); | | 1151 | rv = RUMP_VOP_RENAME(dvp, vp, cn_src, tdvp, tvp, cn_targ); |
1152 | assert(RUMP_VOP_ISLOCKED(tdvp) == 0); | | 1152 | assert(RUMP_VOP_ISLOCKED(tdvp) == 0); |
1153 | if (tvp) { | | 1153 | if (tvp) { |
1154 | assert(RUMP_VOP_ISLOCKED(tvp) == 0); | | 1154 | assert(RUMP_VOP_ISLOCKED(tvp) == 0); |
1155 | } | | 1155 | } |
1156 | freecn(cn_src, RUMPCN_FORCEFREE); | | 1156 | freecn(cn_src, 0); |
1157 | freecn(cn_targ, RUMPCN_FORCEFREE); | | 1157 | freecn(cn_targ, 0); |
1158 | | | 1158 | |
1159 | return rv; | | 1159 | return rv; |
1160 | } | | 1160 | } |
1161 | | | 1161 | |
1162 | /*ARGSUSED*/ | | 1162 | /*ARGSUSED*/ |
1163 | int | | 1163 | int |
1164 | p2k_node_mkdir(struct puffs_usermount *pu, puffs_cookie_t opc, | | 1164 | p2k_node_mkdir(struct puffs_usermount *pu, puffs_cookie_t opc, |
1165 | struct puffs_newinfo *pni, const struct puffs_cn *pcn, | | 1165 | struct puffs_newinfo *pni, const struct puffs_cn *pcn, |
1166 | const struct vattr *vap) | | 1166 | const struct vattr *vap) |
1167 | { | | 1167 | { |
1168 | | | 1168 | |
1169 | return do_makenode(pu, opc, pni, pcn, vap, NULL, RUMP_VOP_MKDIR, NULL); | | 1169 | return do_makenode(pu, opc, pni, pcn, vap, NULL, RUMP_VOP_MKDIR, NULL); |
1170 | } | | 1170 | } |