mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Simplify BDI integration
Update the code to use the bdi_setup_and_register() helper to simplify the bdi integration code. The updated code now just registers the bdi during mount and destroys it during unmount. The only complication is that for 2.6.32 - 2.6.33 kernels the helper wasn't available so in these cases the zfs code must provide it. Luckily the bdi_setup_and_register() function is trivial. Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #367
This commit is contained in:
+23
-25
@@ -600,12 +600,6 @@ zfs_sb_create(const char *osname, zfs_sb_t **zsbp)
|
||||
zsb->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
|
||||
zsb->z_os = os;
|
||||
|
||||
error = -bdi_init(&zsb->z_bdi);
|
||||
if (error) {
|
||||
kmem_free(zsb, sizeof (zfs_sb_t));
|
||||
return (error);
|
||||
}
|
||||
|
||||
error = zfs_get_zplprop(os, ZFS_PROP_VERSION, &zsb->z_version);
|
||||
if (error) {
|
||||
goto out;
|
||||
@@ -807,7 +801,6 @@ zfs_sb_free(zfs_sb_t *zsb)
|
||||
|
||||
zfs_fuid_destroy(zsb);
|
||||
|
||||
bdi_destroy(&zsb->z_bdi);
|
||||
mutex_destroy(&zsb->z_znodes_lock);
|
||||
mutex_destroy(&zsb->z_lock);
|
||||
list_destroy(&zsb->z_all_znodes);
|
||||
@@ -1089,9 +1082,9 @@ zfs_sb_teardown(zfs_sb_t *zsb, boolean_t unmounting)
|
||||
}
|
||||
EXPORT_SYMBOL(zfs_sb_teardown);
|
||||
|
||||
#ifdef HAVE_BDI
|
||||
static atomic_long_t bdi_seq = ATOMIC_LONG_INIT(0);
|
||||
#endif /* HAVE_BDI */
|
||||
#if defined(HAVE_BDI) && !defined(HAVE_BDI_SETUP_AND_REGISTER)
|
||||
atomic_long_t zfs_bdi_seq = ATOMIC_LONG_INIT(0);
|
||||
#endif /* HAVE_BDI && !HAVE_BDI_SETUP_AND_REGISTER */
|
||||
|
||||
int
|
||||
zfs_domount(struct super_block *sb, void *data, int silent)
|
||||
@@ -1118,7 +1111,23 @@ zfs_domount(struct super_block *sb, void *data, int silent)
|
||||
sb->s_time_gran = 1;
|
||||
sb->s_blocksize = recordsize;
|
||||
sb->s_blocksize_bits = ilog2(recordsize);
|
||||
bdi_put_sb(sb, NULL);
|
||||
|
||||
#ifdef HAVE_BDI
|
||||
/*
|
||||
* 2.6.32 API change,
|
||||
* Added backing_device_info (BDI) per super block interfaces. A BDI
|
||||
* must be configured when using a non-device backed filesystem for
|
||||
* proper writeback. This is not required for older pdflush kernels.
|
||||
*
|
||||
* NOTE: Linux read-ahead is disabled in favor of zfs read-ahead.
|
||||
*/
|
||||
zsb->z_bdi.ra_pages = 0;
|
||||
sb->s_bdi = &zsb->z_bdi;
|
||||
|
||||
error = -bdi_setup_and_register(&zsb->z_bdi, "zfs", BDI_CAP_MAP_COPY);
|
||||
if (error)
|
||||
goto out;
|
||||
#endif /* HAVE_BDI */
|
||||
|
||||
/* Set callback operations for the file system. */
|
||||
sb->s_op = &zpl_super_operations;
|
||||
@@ -1143,16 +1152,6 @@ zfs_domount(struct super_block *sb, void *data, int silent)
|
||||
dmu_objset_set_user(zsb->z_os, zsb);
|
||||
mutex_exit(&zsb->z_os->os_user_ptr_lock);
|
||||
} else {
|
||||
/* Disable Linux read-ahead handled by lower layers */
|
||||
zsb->z_bdi.ra_pages = 0;
|
||||
|
||||
error = -bdi_register(&zsb->z_bdi, NULL, "zfs-%d",
|
||||
atomic_long_inc_return(&bdi_seq));
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
bdi_put_sb(sb, &zsb->z_bdi);
|
||||
|
||||
error = zfs_sb_setup(zsb, B_TRUE);
|
||||
#ifdef HAVE_SNAPSHOT
|
||||
(void) zfs_snap_create(zsb);
|
||||
@@ -1193,10 +1192,9 @@ zfs_umount(struct super_block *sb)
|
||||
VERIFY(zfs_sb_teardown(zsb, B_TRUE) == 0);
|
||||
os = zsb->z_os;
|
||||
|
||||
if (bdi_get_sb(sb)) {
|
||||
bdi_unregister(bdi_get_sb(sb));
|
||||
bdi_put_sb(sb, NULL);
|
||||
}
|
||||
#ifdef HAVE_BDI
|
||||
bdi_destroy(sb->s_bdi);
|
||||
#endif /* HAVE_BDI */
|
||||
|
||||
/*
|
||||
* z_os will be NULL if there was an error in
|
||||
|
||||
Reference in New Issue
Block a user