From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 18378 invoked by alias); 12 Aug 2008 16:53:28 -0000 Received: (qmail 18368 invoked by alias); 12 Aug 2008 16:53:28 -0000 X-Spam-Status: No, hits=3.9 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_42,J_CHICKENPOX_44,J_CHICKENPOX_46,J_CHICKENPOX_63,KAM_MX,SPF_HELO_PASS X-Spam-Check-By: sourceware.org X-Spam-Checker-Version: SpamAssassin 3.2.4 (2008-01-01) on bastion.fedora.phx.redhat.com X-Spam-Level: Subject: master - gfs-kernel: bug 450209 - addendum to previous patch. Removes extraneous lock_dlm_plock.c To: cluster-cvs-relay@redhat.com X-Project: Cluster Project X-Git-Module: cluster.git X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: 0bf52c81c902a73a3b4b7021e9cd6ac192f1e72d X-Git-Newrev: 0fd02f3baed4dd5d8ce6c523d8e52de49a4da3c3 From: Abhijith Das Message-Id: <20080812165157.E4F5D12002B@lists.fedorahosted.org> Date: Wed, 13 Aug 2008 07:37:00 -0000 X-Scanned-By: MIMEDefang 2.58 on 172.16.52.254 Mailing-List: contact cluster-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: cluster-cvs-owner@sourceware.org X-SW-Source: 2008-q3/txt/msg00247.txt.bz2 Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=0fd02f3baed4dd5d8ce6c523d8e52de49a4da3c3 Commit: 0fd02f3baed4dd5d8ce6c523d8e52de49a4da3c3 Parent: 0bf52c81c902a73a3b4b7021e9cd6ac192f1e72d Author: Abhijith Das AuthorDate: Tue Aug 12 11:49:45 2008 -0500 Committer: Abhijith Das CommitterDate: Tue Aug 12 11:49:45 2008 -0500 gfs-kernel: bug 450209 - addendum to previous patch. Removes extraneous lock_dlm_plock.c I accidentally added this file to the patch I posted earlier to this bug. It's just an extra file at this point; Makefile doesn't even compile it. This commit removes it. --- gfs-kernel/src/gfs/lock_dlm_plock.c | 439 ----------------------------------- 1 files changed, 0 insertions(+), 439 deletions(-) diff --git a/gfs-kernel/src/gfs/lock_dlm_plock.c b/gfs-kernel/src/gfs/lock_dlm_plock.c deleted file mode 100644 index d6d6e37..0000000 --- a/gfs-kernel/src/gfs/lock_dlm_plock.c +++ /dev/null @@ -1,439 +0,0 @@ -/* - * Copyright (C) 2005-2008 Red Hat, Inc. All rights reserved. - * - * This copyrighted material is made available to anyone wishing to use, - * modify, copy, or redistribute it subject to the terms and conditions - * of the GNU General Public License version 2. - */ - -#include -#include -#include -#include -#include - -#include "dlm_internal.h" -#include "lockspace.h" - -static spinlock_t ops_lock; -static struct list_head send_list; -static struct list_head recv_list; -static wait_queue_head_t send_wq; -static wait_queue_head_t recv_wq; - -struct plock_op { - struct list_head list; - int done; - struct dlm_plock_info info; -}; - -struct plock_xop { - struct plock_op xop; - void *callback; - void *fl; - void *file; - struct file_lock flc; -}; - - -static inline void set_version(struct dlm_plock_info *info) -{ - info->version[0] = DLM_PLOCK_VERSION_MAJOR; - info->version[1] = DLM_PLOCK_VERSION_MINOR; - info->version[2] = DLM_PLOCK_VERSION_PATCH; -} - -static int check_version(struct dlm_plock_info *info) -{ - if ((DLM_PLOCK_VERSION_MAJOR != info->version[0]) || - (DLM_PLOCK_VERSION_MINOR < info->version[1])) { - log_print("plock device version mismatch: " - "kernel (%u.%u.%u), user (%u.%u.%u)", - DLM_PLOCK_VERSION_MAJOR, - DLM_PLOCK_VERSION_MINOR, - DLM_PLOCK_VERSION_PATCH, - info->version[0], - info->version[1], - info->version[2]); - return -EINVAL; - } - return 0; -} - -static void send_op(struct plock_op *op) -{ - set_version(&op->info); - INIT_LIST_HEAD(&op->list); - spin_lock(&ops_lock); - list_add_tail(&op->list, &send_list); - spin_unlock(&ops_lock); - wake_up(&send_wq); -} - -int dlm_posix_lock(dlm_lockspace_t *lockspace, u64 number, struct file *file, - int cmd, struct file_lock *fl) -{ - struct dlm_ls *ls; - struct plock_op *op; - struct plock_xop *xop; - int rv; - - ls = dlm_find_lockspace_local(lockspace); - if (!ls) - return -EINVAL; - - xop = kzalloc(sizeof(*xop), GFP_KERNEL); - if (!xop) { - rv = -ENOMEM; - goto out; - } - - op = &xop->xop; - op->info.optype = DLM_PLOCK_OP_LOCK; - op->info.pid = fl->fl_pid; - op->info.ex = (fl->fl_type == F_WRLCK); - op->info.wait = IS_SETLKW(cmd); - op->info.fsid = ls->ls_global_id; - op->info.number = number; - op->info.start = fl->fl_start; - op->info.end = fl->fl_end; - if (fl->fl_lmops && fl->fl_lmops->fl_grant) { - /* fl_owner is lockd which doesn't distinguish - processes on the nfs client */ - op->info.owner = (__u64) fl->fl_pid; - xop->callback = fl->fl_lmops->fl_grant; - locks_init_lock(&xop->flc); - locks_copy_lock(&xop->flc, fl); - xop->fl = fl; - xop->file = file; - } else { - op->info.owner = (__u64)(long) fl->fl_owner; - xop->callback = NULL; - } - - send_op(op); - - if (xop->callback == NULL) - wait_event(recv_wq, (op->done != 0)); - else { - rv = -EINPROGRESS; - goto out; - } - - spin_lock(&ops_lock); - if (!list_empty(&op->list)) { - log_error(ls, "dlm_posix_lock: op on list %llx", - (unsigned long long)number); - list_del(&op->list); - } - spin_unlock(&ops_lock); - - rv = op->info.rv; - - if (!rv) { - if (posix_lock_file_wait(file, fl) < 0) - log_error(ls, "dlm_posix_lock: vfs lock error %llx", - (unsigned long long)number); - } - - kfree(xop); -out: - dlm_put_lockspace(ls); - return rv; -} -EXPORT_SYMBOL_GPL(dlm_posix_lock); - -/* Returns failure iff a succesful lock operation should be canceled */ -static int dlm_plock_callback(struct plock_op *op) -{ - struct file *file; - struct file_lock *fl; - struct file_lock *flc; - int (*notify)(void *, void *, int) = NULL; - struct plock_xop *xop = (struct plock_xop *)op; - int rv = 0; - - spin_lock(&ops_lock); - if (!list_empty(&op->list)) { - log_print("dlm_plock_callback: op on list %llx", - (unsigned long long)op->info.number); - list_del(&op->list); - } - spin_unlock(&ops_lock); - - /* check if the following 2 are still valid or make a copy */ - file = xop->file; - flc = &xop->flc; - fl = xop->fl; - notify = xop->callback; - - if (op->info.rv) { - notify(flc, NULL, op->info.rv); - goto out; - } - - /* got fs lock; bookkeep locally as well: */ - flc->fl_flags &= ~FL_SLEEP; - if (posix_lock_file(file, flc, NULL)) { - /* - * This can only happen in the case of kmalloc() failure. - * The filesystem's own lock is the authoritative lock, - * so a failure to get the lock locally is not a disaster. - * As long as the fs cannot reliably cancel locks (especially - * in a low-memory situation), we're better off ignoring - * this failure than trying to recover. - */ - log_print("dlm_plock_callback: vfs lock error %llx file %p fl %p", - (unsigned long long)op->info.number, file, fl); - } - - rv = notify(flc, NULL, 0); - if (rv) { - /* XXX: We need to cancel the fs lock here: */ - log_print("dlm_plock_callback: lock granted after lock request " - "failed; dangling lock!\n"); - goto out; - } - -out: - kfree(xop); - return rv; -} - -int dlm_posix_unlock(dlm_lockspace_t *lockspace, u64 number, struct file *file, - struct file_lock *fl) -{ - struct dlm_ls *ls; - struct plock_op *op; - int rv; - - ls = dlm_find_lockspace_local(lockspace); - if (!ls) - return -EINVAL; - - op = kzalloc(sizeof(*op), GFP_KERNEL); - if (!op) { - rv = -ENOMEM; - goto out; - } - - if (posix_lock_file_wait(file, fl) < 0) - log_error(ls, "dlm_posix_unlock: vfs unlock error %llx", - (unsigned long long)number); - - op->info.optype = DLM_PLOCK_OP_UNLOCK; - op->info.pid = fl->fl_pid; - op->info.fsid = ls->ls_global_id; - op->info.number = number; - op->info.start = fl->fl_start; - op->info.end = fl->fl_end; - if (fl->fl_lmops && fl->fl_lmops->fl_grant) - op->info.owner = (__u64) fl->fl_pid; - else - op->info.owner = (__u64)(long) fl->fl_owner; - - send_op(op); - wait_event(recv_wq, (op->done != 0)); - - spin_lock(&ops_lock); - if (!list_empty(&op->list)) { - log_error(ls, "dlm_posix_unlock: op on list %llx", - (unsigned long long)number); - list_del(&op->list); - } - spin_unlock(&ops_lock); - - rv = op->info.rv; - - if (rv == -ENOENT) - rv = 0; - - kfree(op); -out: - dlm_put_lockspace(ls); - return rv; -} -EXPORT_SYMBOL_GPL(dlm_posix_unlock); - -int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file, - struct file_lock *fl) -{ - struct dlm_ls *ls; - struct plock_op *op; - int rv; - - ls = dlm_find_lockspace_local(lockspace); - if (!ls) - return -EINVAL; - - op = kzalloc(sizeof(*op), GFP_KERNEL); - if (!op) { - rv = -ENOMEM; - goto out; - } - - op->info.optype = DLM_PLOCK_OP_GET; - op->info.pid = fl->fl_pid; - op->info.ex = (fl->fl_type == F_WRLCK); - op->info.fsid = ls->ls_global_id; - op->info.number = number; - op->info.start = fl->fl_start; - op->info.end = fl->fl_end; - if (fl->fl_lmops && fl->fl_lmops->fl_grant) - op->info.owner = (__u64) fl->fl_pid; - else - op->info.owner = (__u64)(long) fl->fl_owner; - - send_op(op); - wait_event(recv_wq, (op->done != 0)); - - spin_lock(&ops_lock); - if (!list_empty(&op->list)) { - log_error(ls, "dlm_posix_get: op on list %llx", - (unsigned long long)number); - list_del(&op->list); - } - spin_unlock(&ops_lock); - - /* info.rv from userspace is 1 for conflict, 0 for no-conflict, - -ENOENT if there are no locks on the file */ - - rv = op->info.rv; - - fl->fl_type = F_UNLCK; - if (rv == -ENOENT) - rv = 0; - else if (rv > 0) { - fl->fl_type = (op->info.ex) ? F_WRLCK : F_RDLCK; - fl->fl_pid = op->info.pid; - fl->fl_start = op->info.start; - fl->fl_end = op->info.end; - rv = 0; - } - - kfree(op); -out: - dlm_put_lockspace(ls); - return rv; -} -EXPORT_SYMBOL_GPL(dlm_posix_get); - -/* a read copies out one plock request from the send list */ -static ssize_t dev_read(struct file *file, char __user *u, size_t count, - loff_t *ppos) -{ - struct dlm_plock_info info; - struct plock_op *op = NULL; - - if (count < sizeof(info)) - return -EINVAL; - - spin_lock(&ops_lock); - if (!list_empty(&send_list)) { - op = list_entry(send_list.next, struct plock_op, list); - list_move(&op->list, &recv_list); - memcpy(&info, &op->info, sizeof(info)); - } - spin_unlock(&ops_lock); - - if (!op) - return -EAGAIN; - - if (copy_to_user(u, &info, sizeof(info))) - return -EFAULT; - return sizeof(info); -} - -/* a write copies in one plock result that should match a plock_op - on the recv list */ -static ssize_t dev_write(struct file *file, const char __user *u, size_t count, - loff_t *ppos) -{ - struct dlm_plock_info info; - struct plock_op *op; - int found = 0; - - if (count != sizeof(info)) - return -EINVAL; - - if (copy_from_user(&info, u, sizeof(info))) - return -EFAULT; - - if (check_version(&info)) - return -EINVAL; - - spin_lock(&ops_lock); - list_for_each_entry(op, &recv_list, list) { - if (op->info.fsid == info.fsid && op->info.number == info.number && - op->info.owner == info.owner) { - list_del_init(&op->list); - found = 1; - op->done = 1; - memcpy(&op->info, &info, sizeof(info)); - break; - } - } - spin_unlock(&ops_lock); - - if (found) { - struct plock_xop *xop; - xop = (struct plock_xop *)op; - if (xop->callback) - count = dlm_plock_callback(op); - else - wake_up(&recv_wq); - } else - log_print("dev_write no op %x %llx", info.fsid, - (unsigned long long)info.number); - return count; -} - -static unsigned int dev_poll(struct file *file, poll_table *wait) -{ - unsigned int mask = 0; - - poll_wait(file, &send_wq, wait); - - spin_lock(&ops_lock); - if (!list_empty(&send_list)) - mask = POLLIN | POLLRDNORM; - spin_unlock(&ops_lock); - - return mask; -} - -static const struct file_operations dev_fops = { - .read = dev_read, - .write = dev_write, - .poll = dev_poll, - .owner = THIS_MODULE -}; - -static struct miscdevice plock_dev_misc = { - .minor = MISC_DYNAMIC_MINOR, - .name = DLM_PLOCK_MISC_NAME, - .fops = &dev_fops -}; - -int dlm_plock_init(void) -{ - int rv; - - spin_lock_init(&ops_lock); - INIT_LIST_HEAD(&send_list); - INIT_LIST_HEAD(&recv_list); - init_waitqueue_head(&send_wq); - init_waitqueue_head(&recv_wq); - - rv = misc_register(&plock_dev_misc); - if (rv) - log_print("dlm_plock_init: misc_register failed %d", rv); - return rv; -} - -void dlm_plock_exit(void) -{ - if (misc_deregister(&plock_dev_misc) < 0) - log_print("dlm_plock_exit: misc_deregister failed"); -} -