Tue Nov 30 10:49:23 2010 UTC ()
SAVENAME and HASBUF namei flags have been removed; update accordingly.
(pooka@ says not to worry about compat.)


(dholland)
diff -r1.45 -r1.46 src/lib/libp2k/p2k.c

cvs diff -r1.45 -r1.46 src/lib/libp2k/p2k.c (expand / switch to unified diff)

--- src/lib/libp2k/p2k.c 2010/11/26 11:12:06 1.45
+++ src/lib/libp2k/p2k.c 2010/11/30 10:49:22 1.46
@@ -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*/
1023int 1023int
1024p2k_node_abortop(struct puffs_usermount *pu, puffs_cookie_t opc, 1024p2k_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
1046static int 1046static int
1047do_nukenode(struct p2k_node *p2n_dir, struct p2k_node *p2n, 1047do_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 *
1085int 1085int
1086p2k_node_link(struct puffs_usermount *pu, puffs_cookie_t opc, 1086p2k_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*/
1110int 1110int
1111p2k_node_rename(struct puffs_usermount *pu, 1111p2k_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*/
1163int 1163int
1164p2k_node_mkdir(struct puffs_usermount *pu, puffs_cookie_t opc, 1164p2k_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}