/* * Copyright (c) 2013 - 2014 Fusion-io, Inc. All rights reserved. * Copyright (C) 2014 - 2018 Western Digital Corporation. * * Synchronization framework of persistent registration data without DLM lock. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation, version 2 * of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifdef INSIDE_KERNEL_TREE #include #include #else #include "scst.h" #include "scst_const.h" #endif #include "scst_priv.h" #include "scst_pres.h" static int scst_no_dlm_pr_init(struct scst_device *dev, const char *cl_dev_id) { return 0; } static void scst_no_dlm_pr_cleanup(struct scst_device *dev) { } static bool scst_no_dlm_pr_is_set(struct scst_device *dev) { return dev->pr_is_set; } static void scst_no_dlm_pr_init_reg(struct scst_device *dev, struct scst_dev_registrant *reg) { } static void scst_no_dlm_pr_rm_reg(struct scst_device *dev, struct scst_dev_registrant *reg) { } static void scst_no_dlm_pr_write_lock(struct scst_device *dev, struct scst_lksb *pr_lksb) { scst_pr_write_lock(dev); } static void scst_no_dlm_pr_write_unlock(struct scst_device *dev, struct scst_lksb *pr_lksb) { scst_pr_write_unlock(dev); } static bool scst_no_dlm_reserved(struct scst_device *dev) { return dev->reserved_by; } static void scst_no_dlm_res_lock(struct scst_device *dev, struct scst_lksb *pr_lksb) __acquires(&dev->dev_lock) { EXTRACHECKS_BUG_ON(in_irq() || irqs_disabled()); spin_lock_bh(&dev->dev_lock); } static void scst_no_dlm_res_unlock(struct scst_device *dev, struct scst_lksb *pr_lksb) __releases(&dev->dev_lock) { spin_unlock_bh(&dev->dev_lock); } static bool scst_no_dlm_is_rsv_holder(struct scst_device *dev, struct scst_session *sess) { EXTRACHECKS_BUG_ON(sess == NULL); return dev->reserved_by == sess; } static bool scst_no_dlm_is_not_rsv_holder(struct scst_device *dev, struct scst_session *sess) { EXTRACHECKS_BUG_ON(sess == NULL); return dev->reserved_by && dev->reserved_by != sess; } static void scst_no_dlm_reserve(struct scst_device *dev, struct scst_session *sess) { dev->reserved_by = sess; } const struct scst_cl_ops scst_no_dlm_cl_ops = { .pr_init = scst_no_dlm_pr_init, .pr_cleanup = scst_no_dlm_pr_cleanup, .pr_is_set = scst_no_dlm_pr_is_set, .pr_init_reg = scst_no_dlm_pr_init_reg, .pr_rm_reg = scst_no_dlm_pr_rm_reg, .pr_write_lock = scst_no_dlm_pr_write_lock, .pr_write_unlock = scst_no_dlm_pr_write_unlock, .reserved = scst_no_dlm_reserved, .res_lock = scst_no_dlm_res_lock, .res_unlock = scst_no_dlm_res_unlock, .is_rsv_holder = scst_no_dlm_is_rsv_holder, .is_not_rsv_holder = scst_no_dlm_is_not_rsv_holder, .reserve = scst_no_dlm_reserve, };