25
25
* Copyright (c) 2012, 2015 by Delphix. All rights reserved.
26
26
* Copyright (c) 2014 Integros [integros.com]
27
27
* Copyright 2017 Nexenta Systems, Inc.
28
- * Copyright (c) 2025, Klara, Inc.
29
28
*/
30
29
31
30
/* Portions Copyright 2007 Jeremy Teo */
@@ -4300,33 +4299,6 @@ zfs_freebsd_getpages(struct vop_getpages_args *ap)
4300
4299
ap -> a_rahead ));
4301
4300
}
4302
4301
4303
- typedef struct {
4304
- uint_t pca_npages ;
4305
- vm_page_t pca_pages [];
4306
- } putpage_commit_arg_t ;
4307
-
4308
- static void
4309
- zfs_putpage_commit_cb (void * arg )
4310
- {
4311
- putpage_commit_arg_t * pca = arg ;
4312
- vm_object_t object = pca -> pca_pages [0 ]-> object ;
4313
-
4314
- zfs_vmobject_wlock (object );
4315
-
4316
- for (uint_t i = 0 ; i < pca -> pca_npages ; i ++ ) {
4317
- vm_page_t pp = pca -> pca_pages [i ];
4318
- vm_page_undirty (pp );
4319
- vm_page_sunbusy (pp );
4320
- }
4321
-
4322
- vm_object_pip_wakeupn (object , pca -> pca_npages );
4323
-
4324
- zfs_vmobject_wunlock (object );
4325
-
4326
- kmem_free (pca ,
4327
- offsetof(putpage_commit_arg_t , pca_pages [pca -> pca_npages ]));
4328
- }
4329
-
4330
4302
static int
4331
4303
zfs_putpages (struct vnode * vp , vm_page_t * ma , size_t len , int flags ,
4332
4304
int * rtvals )
@@ -4428,12 +4400,10 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
4428
4400
}
4429
4401
4430
4402
if (zp -> z_blksz < PAGE_SIZE ) {
4431
- vm_ooffset_t woff = off ;
4432
- size_t wlen = len ;
4433
- for (i = 0 ; wlen > 0 ; woff += tocopy , wlen -= tocopy , i ++ ) {
4434
- tocopy = MIN (PAGE_SIZE , wlen );
4403
+ for (i = 0 ; len > 0 ; off += tocopy , len -= tocopy , i ++ ) {
4404
+ tocopy = len > PAGE_SIZE ? PAGE_SIZE : len ;
4435
4405
va = zfs_map_page (ma [i ], & sf );
4436
- dmu_write (zfsvfs -> z_os , zp -> z_id , woff , tocopy , va , tx );
4406
+ dmu_write (zfsvfs -> z_os , zp -> z_id , off , tocopy , va , tx );
4437
4407
zfs_unmap_page (sf );
4438
4408
}
4439
4409
} else {
@@ -4454,19 +4424,19 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
4454
4424
zfs_tstamp_update_setup (zp , CONTENT_MODIFIED , mtime , ctime );
4455
4425
err = sa_bulk_update (zp -> z_sa_hdl , bulk , count , tx );
4456
4426
ASSERT0 (err );
4427
+ /*
4428
+ * XXX we should be passing a callback to undirty
4429
+ * but that would make the locking messier
4430
+ */
4431
+ zfs_log_write (zfsvfs -> z_log , tx , TX_WRITE , zp , off ,
4432
+ len , commit , B_FALSE , NULL , NULL );
4457
4433
4458
- putpage_commit_arg_t * pca = kmem_alloc (
4459
- offsetof(putpage_commit_arg_t , pca_pages [ncount ]),
4460
- KM_SLEEP );
4461
- pca -> pca_npages = ncount ;
4462
- memcpy (pca -> pca_pages , ma , sizeof (vm_page_t ) * ncount );
4463
-
4464
- zfs_log_write (zfsvfs -> z_log , tx , TX_WRITE , zp ,
4465
- off , len , commit , B_FALSE , zfs_putpage_commit_cb , pca );
4466
-
4467
- for (i = 0 ; i < ncount ; i ++ )
4468
- rtvals [i ] = zfs_vm_pagerret_pend ;
4469
-
4434
+ zfs_vmobject_wlock (object );
4435
+ for (i = 0 ; i < ncount ; i ++ ) {
4436
+ rtvals [i ] = zfs_vm_pagerret_ok ;
4437
+ vm_page_undirty (ma [i ]);
4438
+ }
4439
+ zfs_vmobject_wunlock (object );
4470
4440
VM_CNT_INC (v_vnodeout );
4471
4441
VM_CNT_ADD (v_vnodepgsout , ncount );
4472
4442
}
0 commit comments