X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fmdd%2Fmdd_lproc.c;h=5b8f488bc1a18c2a50a9fac88f3ae85f371d797a;hb=e3a7c58aebafce40323db54bf6056029e5af4a70;hp=903a6754918581a72777ba331155d41bda3d8482;hpb=1829e654506c5b798eae5ef4a91948f1411513b4;p=fs%2Flustre-release.git diff --git a/lustre/mdd/mdd_lproc.c b/lustre/mdd/mdd_lproc.c index 903a675..5b8f488 100644 --- a/lustre/mdd/mdd_lproc.c +++ b/lustre/mdd/mdd_lproc.c @@ -1,6 +1,4 @@ -/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*- - * vim:expandtab:shiftwidth=8:tabstop=8: - * +/* * GPL HEADER START * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -26,7 +24,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -131,7 +129,7 @@ static int lprocfs_wr_atime_diff(struct file *file, const char *buffer, if (count > (sizeof(kernbuf) - 1)) return -EINVAL; - if (copy_from_user(kernbuf, buffer, count)) + if (cfs_copy_from_user(kernbuf, buffer, count)) return -EFAULT; kernbuf[count] = '\0'; @@ -155,15 +153,6 @@ static int lprocfs_rd_atime_diff(char *page, char **start, off_t off, /**** changelogs ****/ -DECLARE_CHANGELOG_NAMES; - -const char *changelog_bit2str(int bit) -{ - if (bit < CL_LAST) - return changelog_str[bit]; - return NULL; -} - static int lprocfs_rd_changelog_mask(char *page, char **start, off_t off, int count, int *eof, void *data) { @@ -174,7 +163,7 @@ static int lprocfs_rd_changelog_mask(char *page, char **start, off_t off, while (i < CL_LAST) { if (mdd->mdd_cl.mc_mask & (1 << i)) rc += snprintf(page + rc, count - rc, "%s ", - changelog_str[i]); + changelog_type2str(i)); i++; } return rc; @@ -193,12 +182,12 @@ static int lprocfs_wr_changelog_mask(struct file *file, const char *buffer, OBD_ALLOC(kernbuf, CFS_PAGE_SIZE); if (kernbuf == NULL) RETURN(-ENOMEM); - if (copy_from_user(kernbuf, buffer, count)) + if (cfs_copy_from_user(kernbuf, buffer, count)) GOTO(out, rc = -EFAULT); kernbuf[count] = 0; - rc = libcfs_str2mask(kernbuf, changelog_bit2str, &mdd->mdd_cl.mc_mask, - CHANGELOG_MINMASK, CHANGELOG_ALLMASK); + rc = cfs_str2mask(kernbuf, changelog_type2str, &mdd->mdd_cl.mc_mask, + CHANGELOG_MINMASK, CHANGELOG_ALLMASK); if (rc == 0) rc = count; out: @@ -246,9 +235,9 @@ static int lprocfs_rd_changelog_users(char *page, char **start, off_t off, return -ENXIO; LASSERT(ctxt->loc_handle->lgh_hdr->llh_flags & LLOG_F_IS_CAT); - spin_lock(&mdd->mdd_cl.mc_lock); + cfs_spin_lock(&mdd->mdd_cl.mc_lock); cur = mdd->mdd_cl.mc_index; - spin_unlock(&mdd->mdd_cl.mc_lock); + cfs_spin_unlock(&mdd->mdd_cl.mc_lock); cucb.count = count; cucb.page = page; @@ -267,153 +256,6 @@ static int lprocfs_rd_changelog_users(char *page, char **start, off_t off, return cucb.idx; } -/* non-seq version for direct calling by class_process_proc_param */ -static int mdd_changelog_write(struct file *file, const char *buffer, - unsigned long count, void *data) -{ - struct mdd_device *mdd = (struct mdd_device *)data; - char kernbuf[32]; - char *end; - int rc; - - if (count > (sizeof(kernbuf) - 1)) - goto out_usage; - - count = min_t(unsigned long, count, sizeof(kernbuf)); - if (copy_from_user(kernbuf, buffer, count)) - return -EFAULT; - - kernbuf[count] = '\0'; - /* strip trailing newline from "echo blah" */ - if (kernbuf[count - 1] == '\n') - kernbuf[count - 1] = '\0'; - - /* Forced on/off/purge rec, independent of changelog users! */ - if (strcmp(kernbuf, "on") == 0) { - rc = mdd_changelog_on(mdd, 1); - } else if (strcmp(kernbuf, "off") == 0) { - rc = mdd_changelog_on(mdd, 0); - } else { - /* purge to an index */ - long long unsigned endrec; - - endrec = (long long)simple_strtoull(kernbuf, &end, 0); - if (end == kernbuf) - goto out_usage; - - LCONSOLE_INFO("changelog purge to %llu\n", endrec); - - rc = mdd_changelog_llog_cancel(mdd, endrec); - } - - if (rc < 0) - return rc; - return count; - -out_usage: - CWARN("changelog write usage: [on|off] | \n"); - return -EINVAL; -} - -static ssize_t mdd_changelog_seq_write(struct file *file, const char *buffer, - size_t count, loff_t *off) -{ - struct seq_file *seq = file->private_data; - struct changelog_seq_iter *csi = seq->private; - struct mdd_device *mdd = (struct mdd_device *)csi->csi_dev; - - return mdd_changelog_write(file, buffer, count, mdd); -} - -static int mdd_changelog_done(struct changelog_seq_iter *csi) -{ - struct mdd_device *mdd = (struct mdd_device *)csi->csi_dev; - int done = 0; - - spin_lock(&mdd->mdd_cl.mc_lock); - done = (csi->csi_endrec >= mdd->mdd_cl.mc_index); - spin_unlock(&mdd->mdd_cl.mc_lock); - return done; -} - -/* handle nonblocking */ -static ssize_t mdd_changelog_seq_read(struct file *file, char __user *buf, - size_t count, loff_t *ppos) -{ - struct seq_file *seq = (struct seq_file *)file->private_data; - struct changelog_seq_iter *csi = seq->private; - int rc; - ENTRY; - - if ((file->f_flags & O_NONBLOCK) && mdd_changelog_done(csi)) - RETURN(-EAGAIN); - - csi->csi_done = 0; - rc = seq_read(file, buf, count, ppos); - RETURN(rc); -} - -/* handle nonblocking */ -static unsigned int mdd_changelog_seq_poll(struct file *file, poll_table *wait) -{ - struct seq_file *seq = (struct seq_file *)file->private_data; - struct changelog_seq_iter *csi = seq->private; - struct mdd_device *mdd = (struct mdd_device *)csi->csi_dev; - ENTRY; - - csi->csi_done = 0; - poll_wait(file, &mdd->mdd_cl.mc_waitq, wait); - if (!mdd_changelog_done(csi)) - RETURN(POLLIN | POLLRDNORM); - - RETURN(0); -} - -static int mdd_changelog_seq_open(struct inode *inode, struct file *file) -{ - struct changelog_seq_iter *csi; - struct obd_device *obd; - int rc; - ENTRY; - - rc = changelog_seq_open(inode, file, &csi); - if (rc) - RETURN(rc); - - /* The proc file is set up with mdd in data, not obd */ - obd = mdd2obd_dev((struct mdd_device *)csi->csi_dev); - csi->csi_ctxt = llog_get_context(obd, LLOG_CHANGELOG_ORIG_CTXT); - if (csi->csi_ctxt == NULL) { - changelog_seq_release(inode, file); - RETURN(-ENOENT); - } - /* The handle is set up in llog_obd_origin_setup */ - csi->csi_llh = csi->csi_ctxt->loc_handle; - RETURN(rc); -} - -static int mdd_changelog_seq_release(struct inode *inode, struct file *file) -{ - struct seq_file *seq = file->private_data; - struct changelog_seq_iter *csi = seq->private; - - if (csi && csi->csi_ctxt) - llog_ctxt_put(csi->csi_ctxt); - - return (changelog_seq_release(inode, file)); -} - -/* mdd changelog proc can handle nonblocking ops and writing to purge recs */ -struct file_operations mdd_changelog_fops = { - .owner = THIS_MODULE, - .open = mdd_changelog_seq_open, - .read = mdd_changelog_seq_read, - .write = mdd_changelog_seq_write, - .llseek = changelog_seq_lseek, - .poll = mdd_changelog_seq_poll, - .release = mdd_changelog_seq_release, -}; - #ifdef HAVE_QUOTA_SUPPORT static int mdd_lprocfs_quota_rd_type(char *page, char **start, off_t off, int count, int *eof, void *data) @@ -431,16 +273,40 @@ static int mdd_lprocfs_quota_wr_type(struct file *file, const char *buffer, } #endif +static int lprocfs_rd_sync_perm(char *page, char **start, off_t off, + int count, int *eof, void *data) +{ + struct mdd_device *mdd = data; + + LASSERT(mdd != NULL); + return snprintf(page, count, "%d\n", mdd->mdd_sync_permission); +} + +static int lprocfs_wr_sync_perm(struct file *file, const char *buffer, + unsigned long count, void *data) +{ + struct mdd_device *mdd = data; + int val, rc; + + LASSERT(mdd != NULL); + rc = lprocfs_write_helper(buffer, count, &val); + if (rc) + return rc; + + mdd->mdd_sync_permission = !!val; + return count; +} + static struct lprocfs_vars lprocfs_mdd_obd_vars[] = { { "atime_diff", lprocfs_rd_atime_diff, lprocfs_wr_atime_diff, 0 }, { "changelog_mask", lprocfs_rd_changelog_mask, lprocfs_wr_changelog_mask, 0 }, { "changelog_users", lprocfs_rd_changelog_users, 0, 0}, - { "changelog", 0, mdd_changelog_write, 0, &mdd_changelog_fops, 0600 }, #ifdef HAVE_QUOTA_SUPPORT { "quota_type", mdd_lprocfs_quota_rd_type, mdd_lprocfs_quota_wr_type, 0 }, #endif + { "sync_permission", lprocfs_rd_sync_perm, lprocfs_wr_sync_perm, 0 }, { 0 } };