void *, bool);
extern bool llcrypt_policy_has_filename_enc(struct inode *inode);
/* keyring.c */
-extern void llcrypt_sb_free(struct super_block *sb);
+extern void llcrypt_sb_free(struct lustre_sb_info *lsi);
extern int llcrypt_ioctl_add_key(struct file *filp, void __user *arg);
extern int llcrypt_ioctl_remove_key(struct file *filp, void __user *arg);
extern int llcrypt_ioctl_remove_key_all_users(struct file *filp,
}
/* keyring.c */
-static inline void llcrypt_sb_free(struct super_block *sb)
+static inline void llcrypt_sb_free(struct lustre_sb_info *lsi)
{
}
s2lsi_nocast(sb) = lsi;
/* we take 1 extra ref for our setup */
- atomic_set(&lsi->lsi_mounts, 1);
+ kref_init(&lsi->lsi_mounts);
/* Default umount style */
lsi->lsi_flags = LSI_UMOUNT_FAILOVER;
}
EXPORT_SYMBOL(lustre_init_lsi);
-static int lustre_free_lsi(struct super_block *sb)
+static int lustre_free_lsi(struct lustre_sb_info *lsi)
{
- struct lustre_sb_info *lsi = s2lsi(sb);
-
ENTRY;
LASSERT(lsi != NULL);
CDEBUG(D_MOUNT, "Freeing lsi %p\n", lsi);
/* someone didn't call server_put_mount. */
- LASSERT(atomic_read(&lsi->lsi_mounts) == 0);
+ LASSERT(kref_read(&lsi->lsi_mounts) == 0);
- llcrypt_sb_free(sb);
+ llcrypt_sb_free(lsi);
if (lsi->lsi_lmd != NULL) {
if (lsi->lsi_lmd->lmd_dev != NULL)
OBD_FREE(lsi->lsi_lmd->lmd_dev,
LASSERT(lsi->lsi_llsbi == NULL);
OBD_FREE_PTR(lsi);
- s2lsi_nocast(sb) = NULL;
RETURN(0);
}
+static void lustre_put_lsi_free(struct kref *kref)
+{
+ struct lustre_sb_info *lsi = container_of(kref, struct lustre_sb_info,
+ lsi_mounts);
+
+ if (IS_SERVER(lsi) && lsi->lsi_osd_exp) {
+ lu_device_put(&lsi->lsi_dt_dev->dd_lu_dev);
+ lsi->lsi_osd_exp->exp_obd->obd_lvfs_ctxt.dt = NULL;
+ lsi->lsi_dt_dev = NULL;
+ obd_disconnect(lsi->lsi_osd_exp);
+ /* wait till OSD is gone */
+ obd_zombie_barrier();
+ }
+ lustre_free_lsi(lsi);
+}
+
/*
* The lsi has one reference for every server that is using the disk -
* e.g. MDT, MGS, and potentially MGC
LASSERT(lsi != NULL);
- CDEBUG(D_MOUNT, "put %p %d\n", sb, atomic_read(&lsi->lsi_mounts));
- if (atomic_dec_and_test(&lsi->lsi_mounts)) {
- if (IS_SERVER(lsi) && lsi->lsi_osd_exp) {
- lu_device_put(&lsi->lsi_dt_dev->dd_lu_dev);
- lsi->lsi_osd_exp->exp_obd->obd_lvfs_ctxt.dt = NULL;
- lsi->lsi_dt_dev = NULL;
- obd_disconnect(lsi->lsi_osd_exp);
- /* wait till OSD is gone */
- obd_zombie_barrier();
- }
- lustre_free_lsi(sb);
+ CDEBUG(D_MOUNT, "put %p %d\n", sb, kref_read(&lsi->lsi_mounts));
+ if (kref_put(&lsi->lsi_mounts, lustre_put_lsi_free)) {
+ s2lsi_nocast(sb) = NULL;
RETURN(1);
}
RETURN(0);
}
lsi = s2lsi(lmi->lmi_sb);
- atomic_inc(&lsi->lsi_mounts);
+ kref_get(&lsi->lsi_mounts);
CDEBUG(D_MOUNT, "get mount %p from %s, refs=%d\n", lmi->lmi_sb,
- name, atomic_read(&lsi->lsi_mounts));
+ name, kref_read(&lsi->lsi_mounts));
RETURN(lmi);
}
lsi = s2lsi(lmi->lmi_sb);
CDEBUG(D_MOUNT, "put mount %p from %s, refs=%d\n",
- lmi->lmi_sb, name, atomic_read(&lsi->lsi_mounts));
+ lmi->lmi_sb, name, kref_read(&lsi->lsi_mounts));
if (lustre_put_lsi(lmi->lmi_sb))
CDEBUG(D_MOUNT, "Last put of mount %p from %s\n",