2971 {
2976
2978
2981
2984
2987 }
2988 }
2989
2991
2993
2996
2999 else
3001
3003
3005 ERR(
"do_write returned %08lx\n",
Status);
3008 }
3009
3011
3014
3017 ERR(
"find_item returned %08lx\n",
Status);
3020 }
3021
3023 bool ended1 = false, ended2 = false;
3026 ERR(
"find_item returned %08lx\n",
Status);
3029 }
3030
3031 do {
3033
3036
3038
3042
3043 if (
context->send->cancelling)
3045
3047
3048 if (!ended1) {
3051 ERR(
"find_item returned %08lx\n",
Status);
3054 }
3055
3057 ERR(
"readonly subvolume changed\n");
3061 }
3062 }
3063
3064 if (!ended2) {
3067 ERR(
"find_item returned %08lx\n",
Status);
3070 }
3071
3073 ERR(
"readonly subvolume changed\n");
3077 }
3078 }
3079 }
3080
3084 ERR(
"skip_to_difference returned %08lx\n",
Status);
3087 }
3088 }
3089
3091 bool no_next = false, no_next2 = false;
3092
3094
3098 ERR(
"finish_inode returned %08lx\n",
Status);
3101 }
3102
3103 if (
context->send->cancelling) {
3106 }
3107 }
3108
3112
3113 while (true) {
3115 ended1 = true;
3116 break;
3117 }
3118
3120
3122 break;
3123 }
3124
3125 while (true) {
3127 ended2 = true;
3128 break;
3129 }
3130
3131 tp2 = next_tp;
3132
3134 break;
3135 }
3136
3137 no_next = true;
3140
3143 ERR(
"send_inode returned %08lx\n",
Status);
3146 }
3147
3148 while (true) {
3150 ended2 = true;
3151 break;
3152 }
3153
3154 tp2 = next_tp;
3155
3157 break;
3158
3162 ERR(
"send_inode_ref returned %08lx\n",
Status);
3165 }
3169 ERR(
"send_inode_extref returned %08lx\n",
Status);
3172 }
3173 }
3174 }
3175
3178 ERR(
"finish_inode returned %08lx\n",
Status);
3181 }
3182
3183 if (
context->send->cancelling) {
3186 }
3187
3188 no_next2 = true;
3189
3192 ERR(
"send_inode returned %08lx\n",
Status);
3195 }
3196 } else {
3199 ERR(
"send_inode returned %08lx\n",
Status);
3202 }
3203 }
3207 ERR(
"send_inode_ref returned %08lx\n",
Status);
3210 }
3211
3214 ERR(
"send_inode_ref returned %08lx\n",
Status);
3217 }
3221 ERR(
"send_inode_extref returned %08lx\n",
Status);
3224 }
3225
3228 ERR(
"send_inode_extref returned %08lx\n",
Status);
3231 }
3235 ERR(
"send_extent_data returned %08lx\n",
Status);
3238 }
3239
3240 if (
context->send->cancelling) {
3243 }
3247 ERR(
"send_xattr returned %08lx\n",
Status);
3250 }
3251
3252 if (
context->send->cancelling) {
3255 }
3256 }
3257
3258 if (!no_next) {
3261 else
3262 ended1 = true;
3263
3264 if (!no_next2) {
3266 tp2 = next_tp;
3267 else
3268 ended2 = true;
3269 }
3270 }
3273
3277 ERR(
"finish_inode returned %08lx\n",
Status);
3280 }
3281
3282 if (
context->send->cancelling) {
3285 }
3286 }
3287
3291 ERR(
"send_inode returned %08lx\n",
Status);
3294 }
3298 ERR(
"send_inode_ref returned %08lx\n",
Status);
3301 }
3305 ERR(
"send_inode_extref returned %08lx\n",
Status);
3308 }
3312 ERR(
"send_extent_data returned %08lx\n",
Status);
3315 }
3316
3317 if (
context->send->cancelling) {
3320 }
3324 ERR(
"send_xattr returned %08lx\n",
Status);
3327 }
3328
3329 if (
context->send->cancelling) {
3332 }
3333 }
3334
3337 else
3338 ended1 = true;
3341
3345 ERR(
"finish_inode returned %08lx\n",
Status);
3348 }
3349
3350 if (
context->send->cancelling) {
3353 }
3354 }
3355
3359 ERR(
"send_inode returned %08lx\n",
Status);
3362 }
3366 ERR(
"send_inode_ref returned %08lx\n",
Status);
3369 }
3373 ERR(
"send_inode_extref returned %08lx\n",
Status);
3376 }
3380 ERR(
"send_extent_data returned %08lx\n",
Status);
3383 }
3384
3385 if (
context->send->cancelling) {
3388 }
3392 ERR(
"send_xattr returned %08lx\n",
Status);
3395 }
3396
3397 if (
context->send->cancelling) {
3400 }
3401 }
3402
3404 tp2 = next_tp;
3405 else
3406 ended2 = true;
3407 }
3408 } while (!ended1 || !ended2);
3409 } else {
3410 do {
3412
3415
3417
3421
3422 if (
context->send->cancelling)
3424
3426
3429 ERR(
"find_item returned %08lx\n",
Status);
3432 }
3433
3435 ERR(
"readonly subvolume changed\n");
3439 }
3440 }
3441
3445 ERR(
"finish_inode returned %08lx\n",
Status);
3448 }
3449
3450 if (
context->send->cancelling) {
3453 }
3454 }
3455
3459 ERR(
"send_inode returned %08lx\n",
Status);
3462 }
3466 ERR(
"send_inode_ref returned %08lx\n",
Status);
3469 }
3473 ERR(
"send_inode_extref returned %08lx\n",
Status);
3476 }
3480 ERR(
"send_extent_data returned %08lx\n",
Status);
3483 }
3484
3485 if (
context->send->cancelling) {
3488 }
3492 ERR(
"send_xattr returned %08lx\n",
Status);
3495 }
3496
3497 if (
context->send->cancelling) {
3500 }
3501 }
3502
3505 else
3506 break;
3507 } while (true);
3508 }
3509
3510 if (
context->lastinode.inode != 0) {
3513 ERR(
"finish_inode returned %08lx\n",
Status);
3516 }
3517
3519
3520 if (
context->send->cancelling)
3522 } else
3524
3528
3530
3534
3537 }
3538
3540
3544 }
3545
3548
3551
3555 }
3556
3558 }
3559
3562
3565
3569
3572
3575
3577
3580
3583 }
3584
3586 }
3587
3589
3591}
#define InterlockedIncrement
#define InterlockedDecrement
void void void NTSTATUS void NTSTATUS skip_to_difference(device_extension *Vcb, traverse_ptr *tp, traverse_ptr *tp2, bool *ended1, bool *ended2) __attribute__((nonnull(1
#define keycmp(key1, key2)
void flush_subvol_fcbs(root *subvol)
NTSTATUS do_write(device_extension *Vcb, PIRP Irp)
NTSTATUS NTSTATUS bool bool void free_trees(device_extension *Vcb) __attribute__((nonnull(1)))
NTSTATUS NTSTATUS bool find_next_item(_Requires_lock_held_(_Curr_->tree_lock) device_extension *Vcb, const traverse_ptr *tp, traverse_ptr *next_tp, bool ignore, PIRP Irp) __attribute__((nonnull(1
#define NT_SUCCESS(StatCode)
static LONG find_item(PropertyBag *This, LPCOLESTR name)
_In_ uint64_t _In_ uint64_t _In_ uint64_t _In_opt_ traverse_ptr * tp
#define TYPE_INODE_EXTREF
static NTSTATUS send_inode(send_context *context, traverse_ptr *tp, traverse_ptr *tp2)
static NTSTATUS send_inode_extref(send_context *context, traverse_ptr *tp, bool tree2)
static NTSTATUS send_inode_ref(send_context *context, traverse_ptr *tp, bool tree2)
#define SEND_BUFFER_LENGTH
static NTSTATUS send_extent_data(send_context *context, traverse_ptr *tp, traverse_ptr *tp2)
static NTSTATUS send_xattr(send_context *context, traverse_ptr *tp, traverse_ptr *tp2)
static NTSTATUS finish_inode(send_context *context, traverse_ptr *tp1, traverse_ptr *tp2)
#define RemoveEntryList(Entry)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define RtlCompareMemory(s1, s2, l)
#define ExConvertExclusiveToSharedLite(res)
#define KeSetEvent(pEvt, foo, foo2)
#define ExAcquireResourceExclusiveLite(res, wait)
#define RemoveHeadList(ListHead)
#define ExAcquireResourceSharedLite(res, wait)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
GLuint64EXT GLuint GLuint GLenum GLenum GLuint GLuint GLenum GLuint GLuint key1
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
#define STATUS_INTERNAL_ERROR
#define CONTAINING_RECORD(address, type, field)