Whamcloud - gitweb
Branch: HEAD
authorwangdi <wangdi>
Fri, 8 Apr 2005 07:46:17 +0000 (07:46 +0000)
committerwangdi <wangdi>
Fri, 8 Apr 2005 07:46:17 +0000 (07:46 +0000)
1)minor fix and cleanup dev_rd_only kernel patch on HEAD
2)add sec support on kernel config
3)some cleanup

lustre/autoconf/lustre-core.m4
lustre/include/linux/obd_support.h
lustre/kernel_patches/kernel_configs/kernel-2.6.10-uml.config
lustre/kernel_patches/patches/dev_read_only-2.6.10-fc3.patch
lustre/kernel_patches/series/2.6-fc3.series
lustre/lvfs/lvfs_common.c
lustre/mds/handler.c
lustre/mds/mds_lov.c
lustre/obdfilter/filter.c

index 28a2b2d..bc1cdb3 100644 (file)
@@ -226,6 +226,29 @@ LB_LINUX_TRY_COMPILE([
 ])
 ])
 
+
+#
+# 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
 #
@@ -395,6 +418,7 @@ LC_FUNC_PDE
 LC_FUNC_DIRECT_IO
 LC_HEADER_MM_INLINE
 LC_STRUCT_INODE
+LC_FUNC_DEV_SET_RDONLY
 ])
 
 #
index 06e6144..6464e55 100644 (file)
@@ -28,6 +28,7 @@
 #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>
@@ -243,16 +244,50 @@ do {                                                            \
 #  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)
 {
@@ -260,7 +295,7 @@ 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;
         }
index 9fc008d..83539f1 100644 (file)
@@ -1,7 +1,7 @@
 #
 # 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
@@ -536,17 +536,17 @@ CONFIG_NFS_FS=m
 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
@@ -591,12 +591,12 @@ CONFIG_CRYPTO=y
 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 0398e0e..1b9c58e 100644 (file)
@@ -1,7 +1,7 @@
 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);
  }
@@ -25,7 +25,7 @@ Index: linux-2.6.10/drivers/block/ll_rw_blk.c
                /*
                 * 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);
  
  /*
@@ -34,10 +34,9 @@ Index: linux-2.6.10/drivers/block/ll_rw_blk.c
 + */
 +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) 
@@ -45,13 +44,11 @@ Index: linux-2.6.10/drivers/block/ll_rw_blk.c
 +        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;
@@ -68,18 +65,15 @@ Index: linux-2.6.10/drivers/block/ll_rw_blk.c
 +              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 : "?");
@@ -87,24 +81,18 @@ Index: linux-2.6.10/drivers/block/ll_rw_blk.c
 +
 +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);
 +}
index 8f0e72a..6d97e05 100644 (file)
@@ -23,5 +23,5 @@ vfs_lookup_in_file-2.6.patch
 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 
 
index 744b8fb..aa4d3f3 100644 (file)
@@ -26,6 +26,7 @@
 #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,
@@ -96,6 +97,7 @@ void lvfs_umount_fs(struct lvfs_obd_ctxt *lvfs_ctxt)
 {
         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)
@@ -103,12 +105,11 @@ void lvfs_umount_fs(struct lvfs_obd_ctxt *lvfs_ctxt)
                                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);
index ef0b9e6..3e8e70b 100644 (file)
@@ -2932,7 +2932,6 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
         int rc = 0;
         ENTRY;
 
-        dev_clear_rdonly(2);
 
         if (!lcfg->lcfg_inlbuf1 || !lcfg->lcfg_inlbuf2)
                 RETURN(rc = -EINVAL);
@@ -3012,6 +3011,7 @@ static int mds_setup(struct obd_device *obd, obd_count len, void *buf)
 
         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);
 
index 13d262e..9c58e41 100644 (file)
@@ -487,7 +487,7 @@ int mds_iocontrol(unsigned int cmd, struct obd_export *exp, int len,
                 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);
         }
 
index 4a82b28..0e9bc1b 100644 (file)
@@ -1438,7 +1438,6 @@ int filter_common_setup(struct obd_device *obd, obd_count len, void *buf,
         int rc = 0, i;
         ENTRY;
 
-        dev_clear_rdonly(2);
 
         if (!lcfg->lcfg_inlbuf1 || !lcfg->lcfg_inlbuf2)
                 RETURN(-EINVAL);
@@ -1484,6 +1483,8 @@ int filter_common_setup(struct obd_device *obd, obd_count len, void *buf,
         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);
@@ -1591,6 +1592,7 @@ static int filter_setup(struct obd_device *obd, obd_count len, void *buf)
 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)
@@ -1613,6 +1615,7 @@ static int filter_cleanup(struct obd_device *obd, int flags)
         if (filter->fo_sb == NULL)
                 RETURN(0);
 
+        save_dev = ll_sbdev(filter->fo_sb);
         filter_post_fs_cleanup(obd);
         filter_post(obd);
 
@@ -1626,7 +1629,7 @@ static int filter_cleanup(struct obd_device *obd, int flags)
         fsfilt_put_ops(obd->obd_fsops);
         lock_kernel();
 
-        dev_clear_rdonly(2);
+        ll_clear_rdonly(save_dev);
 
         RETURN(0);
 }
@@ -2921,7 +2924,7 @@ int filter_iocontrol(unsigned int cmd, struct obd_export *exp,
                 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);
         }