])
])
+
+#
+# LC_FUNC_DEV_SET_RDONLY
+#
+# check for the old-style dev_set_rdonly which took an extra "devno" param
+# and can only set a single device to discard writes at one time
+#
+AC_DEFUN([LC_FUNC_DEV_SET_RDONLY],
+[AC_MSG_CHECKING([if kernel has old single-device dev_set_rdonly])
+HAVE_OLD_DSR="`grep -c -s 'dev_set_rdonly.*no_write' $LINUX/drivers/block/ll_rw_blk.c`"
+if test x$HAVE_OLD_DSR != "x1" ; then
+ HAVE_OLD_DSR="`grep -c -s 'dev_set_rdonly.*no_write' $LINUX/drivers/block/blkpg.c`"
+fi
+if test x$HAVE_OLD_DSR = "x1" ; then
+ AC_DEFINE(HAVE_OLD_DEV_SET_RDONLY, 1,
+ [kernel has old single-device dev_set_rdonly])
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_RESULT(no)
+fi
+])
+
+
#
# LC_CONFIG_BACKINGFS
#
LC_FUNC_DIRECT_IO
LC_HEADER_MM_INLINE
LC_STRUCT_INODE
+LC_FUNC_DEV_SET_RDONLY
])
#
#include <linux/autoconf.h>
#include <linux/slab.h>
#include <linux/highmem.h>
+#include <linux/buffer_head.h>
#endif
#include <libcfs/kp30.h>
#include <linux/lustre_compat25.h>
# define ll_bdevname(SB, STORAGE) __bdevname(kdev_t_to_nr(SB->s_dev), STORAGE)
# define ll_lock_kernel lock_kernel()
# define ll_sbdev(SB) ((SB)->s_bdev)
-void dev_set_rdonly(struct block_device *, int);
+# define ll_sbdev_type struct block_device *
+# define ll_sbdev_sync fsync_bdev
# else
# define BDEVNAME_DECLARE_STORAGE(foo) char __unused_##foo
# define ll_sbdev(SB) (kdev_t_to_nr((SB)->s_dev))
+# define ll_sbdev_type kdev_t
+# define ll_sbdev_sync fsync_dev
# define ll_bdevname(SB,STORAGE) ((void)__unused_##STORAGE,bdevname(ll_sbdev(SB)))
# define ll_lock_kernel
-void dev_set_rdonly(kdev_t, int);
# endif
-void dev_clear_rdonly(int);
+#ifdef HAVE_OLD_DEV_SET_RDONLY
+ void dev_set_rdonly(ll_sbdev_type dev, int no_write);
+ void dev_clear_rdonly(int no_write);
+#else
+ void dev_set_rdonly(ll_sbdev_type dev);
+ void dev_clear_rdonly(ll_sbdev_type dev);
+#endif
+int dev_check_rdonly(ll_sbdev_type dev);
+#define ll_check_rdonly(dev) dev_check_rdonly(dev)
+
+static inline void ll_set_rdonly(ll_sbdev_type dev)
+{
+ CDEBUG(D_IOCTL | D_HA, "set dev %ld rdonly\n", (long)dev);
+ ll_sbdev_sync(dev);
+#ifdef HAVE_OLD_DEV_SET_RDONLY
+ dev_set_rdonly(dev, 2);
+#else
+ dev_set_rdonly(dev);
+#endif
+}
+
+static inline void ll_clear_rdonly(ll_sbdev_type dev)
+{
+ CDEBUG(D_IOCTL | D_HA, "unset dev %ld rdonly\n", (long)dev);
+ if (ll_check_rdonly(dev)) {
+ ll_sbdev_sync(dev);
+#ifdef HAVE_OLD_DEV_SET_RDONLY
+ dev_clear_rdonly(2);
+#else
+ dev_clear_rdonly(dev);
+#endif
+ }
+}
static inline void OBD_FAIL_WRITE(int id, struct super_block *sb)
{
BDEVNAME_DECLARE_STORAGE(tmp);
CERROR("obd_fail_loc=%x, fail write operation on %s\n",
id, ll_bdevname(sb, tmp));
- dev_set_rdonly(ll_sbdev(sb), 2);
+ ll_set_rdonly(ll_sbdev(sb));
/* We set FAIL_ONCE because we never "un-fail" a device */
obd_fail_loc |= OBD_FAILED | OBD_FAIL_ONCE;
}
#
# Automatically generated make config: don't edit
-# Linux kernel version: 2.6.10-prep-skas3-v8-rc1-bs7
-# Mon Apr 4 16:54:58 2005
+# Linux kernel version: 2.6.10-ac12
+# Thu Apr 7 23:47:40 2005
#
CONFIG_GENERIC_HARDIRQS=y
CONFIG_USERMODE=y
CONFIG_NFS_V3=y
CONFIG_NFS_V4=y
CONFIG_NFS_DIRECTIO=y
-CONFIG_NFSD=m
+CONFIG_NFSD=y
CONFIG_NFSD_V3=y
CONFIG_NFSD_V4=y
CONFIG_NFSD_TCP=y
-CONFIG_LOCKD=m
+CONFIG_LOCKD=y
CONFIG_LOCKD_V4=y
-CONFIG_EXPORTFS=m
-CONFIG_SUNRPC=m
-CONFIG_SUNRPC_GSS=m
-CONFIG_RPCSEC_GSS_KRB5=m
-# CONFIG_RPCSEC_GSS_SPKM3 is not set
+CONFIG_EXPORTFS=y
+CONFIG_SUNRPC=y
+CONFIG_SUNRPC_GSS=y
+CONFIG_RPCSEC_GSS_KRB5=y
+CONFIG_RPCSEC_GSS_SPKM3=y
# CONFIG_SMB_FS is not set
# CONFIG_CIFS is not set
# CONFIG_NCP_FS is not set
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_NULL=m
CONFIG_CRYPTO_MD4=m
-CONFIG_CRYPTO_MD5=m
+CONFIG_CRYPTO_MD5=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_SHA512=m
CONFIG_CRYPTO_WP512=m
-CONFIG_CRYPTO_DES=m
+CONFIG_CRYPTO_DES=y
CONFIG_CRYPTO_BLOWFISH=m
CONFIG_CRYPTO_TWOFISH=m
CONFIG_CRYPTO_SERPENT=m
Index: linux-2.6.10/drivers/block/ll_rw_blk.c
===================================================================
--- linux-2.6.10.orig/drivers/block/ll_rw_blk.c 2004-12-25 05:33:59.000000000 +0800
-+++ linux-2.6.10/drivers/block/ll_rw_blk.c 2005-04-07 00:37:34.299974720 +0800
++++ linux-2.6.10/drivers/block/ll_rw_blk.c 2005-04-08 12:35:49.785573840 +0800
@@ -2598,6 +2598,8 @@
set_bit(BIO_EOF, &bio->bi_flags);
}
/*
* If this device has partitions, remap block n
* of partition p to block n+start(p) of the disk.
-@@ -3156,6 +3165,91 @@
+@@ -3156,6 +3165,79 @@
EXPORT_SYMBOL(swap_io_context);
/*
+ */
+struct deventry {
+ dev_t dev;
-+ struct deventry *next;
++ struct list_head dev_list;
+};
-+
-+static struct deventry *devlist = NULL;
++static struct list_head devlist = LIST_HEAD_INIT(devlist);
+static spinlock_t devlock = SPIN_LOCK_UNLOCKED;
+
+int dev_check_rdonly(struct block_device *bdev)
+ struct deventry *cur;
+ if (!bdev) return 0;
+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
++ list_for_each_entry(cur, &devlist, dev_list) {
+ if (bdev->bd_dev == cur->dev) {
+ spin_unlock(&devlock);
+ return 1;
+ }
-+ cur = cur->next;
+ }
+ spin_unlock(&devlock);
+ return 0;
+ return;
+
+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
++ list_for_each_entry(cur, &devlist, dev_list) {
+ if (bdev->bd_dev == cur->dev) {
+ spin_unlock(&devlock);
+ kfree(newdev);
+ return;
+ }
-+ cur = cur->next;
+ }
+ newdev->dev = bdev->bd_dev;
-+ newdev->next = devlist;
-+ devlist = newdev;
++ list_add(&newdev->dev_list, &devlist);
+ spin_unlock(&devlock);
+ printk(KERN_WARNING "Turning device %s read-only\n",
+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
+
+void dev_clear_rdonly(struct block_device *bdev)
+{
-+ struct deventry *cur, *last = NULL;
++ struct deventry *cur, *tmp;
+ if (!bdev) return;
+ spin_lock(&devlock);
-+ cur = devlist;
-+ while(cur) {
++ list_for_each_entry_safe(cur, tmp, &devlist, dev_list) {
+ if (bdev->bd_dev == cur->dev) {
-+ if (last)
-+ last->next = cur->next;
-+ else
-+ devlist = cur->next;
++ list_del_init(&cur->dev_list);
++ kfree(cur);
+ spin_unlock(&devlock);
-+ kfree(cur);
+ printk(KERN_WARNING "Removing read-only on %s\n",
+ bdev->bd_disk ? bdev->bd_disk->disk_name : "?");
+ return;
+ }
-+ last = cur;
-+ cur = cur->next;
+ }
+ spin_unlock(&devlock);
+}
jbd-2.6.10-jcberr.patch
hostfs_readdir_large.patch
linux-2.6.10-fc3-left.patch
-linux-2.6.10-fc3-lkcd.patch
+linux-2.6.10-fc3-lkcd.patch
#define DEBUG_SUBSYSTEM S_FILTER
#include <linux/obd.h>
+#include <linux/obd_support.h>
#include <linux/lvfs.h>
struct dentry *lvfs_id2dentry(struct lvfs_run_ctxt *ctxt, __u64 id,
{
if (lvfs_ctxt && atomic_dec_and_test(&lvfs_ctxt->loc_refcount)) {
struct vfsmount *mnt = lvfs_ctxt->loc_mnt;
+ ll_sbdev_type save_dev = ll_sbdev(mnt->mnt_sb);
list_del(&lvfs_ctxt->loc_list);
if (atomic_read(&mnt->mnt_count) > 2)
atomic_read(&mnt->mnt_count));
mntput(mnt);
-
if (lvfs_ctxt->loc_name)
OBD_FREE(lvfs_ctxt->loc_name,
strlen(lvfs_ctxt->loc_name) + 1);
OBD_FREE(lvfs_ctxt, sizeof(*lvfs_ctxt));
- dev_clear_rdonly(2);
+ ll_clear_rdonly(save_dev);
}
}
EXPORT_SYMBOL(lvfs_umount_fs);
int rc = 0;
ENTRY;
- dev_clear_rdonly(2);
if (!lcfg->lcfg_inlbuf1 || !lcfg->lcfg_inlbuf2)
RETURN(rc = -EINVAL);
mnt = lvfs_ctxt->loc_mnt;
mds->mds_lvfs_ctxt = lvfs_ctxt;
+ ll_clear_rdonly(ll_sbdev(mnt->mnt_sb));
CDEBUG(D_SUPER, "%s: mnt = %p\n", lcfg->lcfg_inlbuf1, mnt);
LASSERT(handle);
rc = fsfilt_commit(obd, obd->u.mds.mds_sb, inode, handle, 1);
- dev_set_rdonly(ll_sbdev(obd->u.mds.mds_sb), 2);
+ ll_set_rdonly(ll_sbdev(obd->u.mds.mds_sb));
RETURN(0);
}
int rc = 0, i;
ENTRY;
- dev_clear_rdonly(2);
if (!lcfg->lcfg_inlbuf1 || !lcfg->lcfg_inlbuf2)
RETURN(-EINVAL);
obd->obd_lvfs_ctxt.fs = get_ds();
obd->obd_lvfs_ctxt.cb_ops = filter_lvfs_ops;
+ ll_clear_rdonly(ll_sbdev(filter->fo_sb));
+
rc = fsfilt_setup(obd, mnt->mnt_sb);
if (rc)
GOTO(err_mntput, rc);
static int filter_cleanup(struct obd_device *obd, int flags)
{
struct filter_obd *filter = &obd->u.filter;
+ ll_sbdev_type save_dev;
ENTRY;
if (flags & OBD_OPT_FAILOVER)
if (filter->fo_sb == NULL)
RETURN(0);
+ save_dev = ll_sbdev(filter->fo_sb);
filter_post_fs_cleanup(obd);
filter_post(obd);
fsfilt_put_ops(obd->obd_fsops);
lock_kernel();
- dev_clear_rdonly(2);
+ ll_clear_rdonly(save_dev);
RETURN(0);
}
LASSERT(handle);
(void)fsfilt_commit(obd, sb, inode, handle, 1);
- dev_set_rdonly(ll_sbdev(obd->u.filter.fo_sb), 2);
+ ll_set_rdonly(ll_sbdev(obd->u.filter.fo_sb));
RETURN(0);
}