vfs_default.c (a638dc4ebc8eaa90a87ee053b7104ee4511f4491) | vfs_default.c (1eaa36523cb921e90d61b20531ed525aba0cfe7e) |
---|---|
1/*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (c) 1989, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed 8 * to Berkeley by John Heidemann of the UCLA Ficus project. --- 1124 unchanged lines hidden (view full) --- 1133 off_t offset, len; 1134 struct ucred *cred; 1135 int error; 1136 struct vattr va; 1137 off_t noff, xfersize, rem; 1138 1139 vp = ap->a_vp; 1140 offset = *ap->a_offset; | 1/*- 2 * SPDX-License-Identifier: BSD-3-Clause 3 * 4 * Copyright (c) 1989, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed 8 * to Berkeley by John Heidemann of the UCLA Ficus project. --- 1124 unchanged lines hidden (view full) --- 1133 off_t offset, len; 1134 struct ucred *cred; 1135 int error; 1136 struct vattr va; 1137 off_t noff, xfersize, rem; 1138 1139 vp = ap->a_vp; 1140 offset = *ap->a_offset; |
1141 len = *ap->a_len; | |
1142 cred = ap->a_cred; 1143 1144 error = VOP_GETATTR(vp, &va, cred); 1145 if (error) 1146 return (error); 1147 | 1141 cred = ap->a_cred; 1142 1143 error = VOP_GETATTR(vp, &va, cred); 1144 if (error) 1145 return (error); 1146 |
1148 len = omin(OFF_MAX - offset, *ap->a_len); | 1147 len = omin((off_t)va.va_size - offset, *ap->a_len); |
1149 while (len > 0) { 1150 noff = offset; 1151 error = vn_bmap_seekhole_locked(vp, FIOSEEKDATA, &noff, cred); 1152 if (error) { 1153 if (error != ENXIO) 1154 /* XXX: Is it okay to fallback further? */ 1155 goto out; 1156 --- 23 unchanged lines hidden (view full) --- 1180 len -= xfersize - rem; 1181 goto out; 1182 } 1183 1184 len -= xfersize; 1185 if (should_yield()) 1186 break; 1187 } | 1148 while (len > 0) { 1149 noff = offset; 1150 error = vn_bmap_seekhole_locked(vp, FIOSEEKDATA, &noff, cred); 1151 if (error) { 1152 if (error != ENXIO) 1153 /* XXX: Is it okay to fallback further? */ 1154 goto out; 1155 --- 23 unchanged lines hidden (view full) --- 1179 len -= xfersize - rem; 1180 goto out; 1181 } 1182 1183 len -= xfersize; 1184 if (should_yield()) 1185 break; 1186 } |
1187 /* Handle the case when offset is beyond EOF */ 1188 if (len < 0) { 1189 offset += len; 1190 len = 0; 1191 } |
|
1188out: 1189 *ap->a_offset = offset; 1190 *ap->a_len = len; 1191 return (error); 1192} 1193 1194int 1195vop_stdadvise(struct vop_advise_args *ap) --- 557 unchanged lines hidden --- | 1192out: 1193 *ap->a_offset = offset; 1194 *ap->a_len = len; 1195 return (error); 1196} 1197 1198int 1199vop_stdadvise(struct vop_advise_args *ap) --- 557 unchanged lines hidden --- |