From b3d95c9cba66aa985efea888a58c358ed788297b Mon Sep 17 00:00:00 2001 From: wangdi Date: Fri, 8 Apr 2005 07:46:17 +0000 Subject: [PATCH] Branch: HEAD 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 | 24 ++++++++++++ lustre/include/linux/obd_support.h | 43 ++++++++++++++++++++-- .../kernel_configs/kernel-2.6.10-uml.config | 22 +++++------ .../patches/dev_read_only-2.6.10-fc3.patch | 34 ++++++----------- lustre/kernel_patches/series/2.6-fc3.series | 2 +- lustre/lvfs/lvfs_common.c | 5 ++- lustre/mds/handler.c | 2 +- lustre/mds/mds_lov.c | 2 +- lustre/obdfilter/filter.c | 9 +++-- 9 files changed, 97 insertions(+), 46 deletions(-) diff --git a/lustre/autoconf/lustre-core.m4 b/lustre/autoconf/lustre-core.m4 index 28a2b2d..bc1cdb3 100644 --- a/lustre/autoconf/lustre-core.m4 +++ b/lustre/autoconf/lustre-core.m4 @@ -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 ]) # diff --git a/lustre/include/linux/obd_support.h b/lustre/include/linux/obd_support.h index 06e6144..6464e55 100644 --- a/lustre/include/linux/obd_support.h +++ b/lustre/include/linux/obd_support.h @@ -28,6 +28,7 @@ #include #include #include +#include #endif #include #include @@ -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; } diff --git a/lustre/kernel_patches/kernel_configs/kernel-2.6.10-uml.config b/lustre/kernel_patches/kernel_configs/kernel-2.6.10-uml.config index 9fc008d..83539f1 100644 --- a/lustre/kernel_patches/kernel_configs/kernel-2.6.10-uml.config +++ b/lustre/kernel_patches/kernel_configs/kernel-2.6.10-uml.config @@ -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 diff --git a/lustre/kernel_patches/patches/dev_read_only-2.6.10-fc3.patch b/lustre/kernel_patches/patches/dev_read_only-2.6.10-fc3.patch index 0398e0e..1b9c58e 100644 --- a/lustre/kernel_patches/patches/dev_read_only-2.6.10-fc3.patch +++ b/lustre/kernel_patches/patches/dev_read_only-2.6.10-fc3.patch @@ -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); +} diff --git a/lustre/kernel_patches/series/2.6-fc3.series b/lustre/kernel_patches/series/2.6-fc3.series index 8f0e72a..6d97e05 100644 --- a/lustre/kernel_patches/series/2.6-fc3.series +++ b/lustre/kernel_patches/series/2.6-fc3.series @@ -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 diff --git a/lustre/lvfs/lvfs_common.c b/lustre/lvfs/lvfs_common.c index 744b8fb..aa4d3f3 100644 --- a/lustre/lvfs/lvfs_common.c +++ b/lustre/lvfs/lvfs_common.c @@ -26,6 +26,7 @@ #define DEBUG_SUBSYSTEM S_FILTER #include +#include #include 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); diff --git a/lustre/mds/handler.c b/lustre/mds/handler.c index ef0b9e6..3e8e70b 100644 --- a/lustre/mds/handler.c +++ b/lustre/mds/handler.c @@ -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); diff --git a/lustre/mds/mds_lov.c b/lustre/mds/mds_lov.c index 13d262e..9c58e41 100644 --- a/lustre/mds/mds_lov.c +++ b/lustre/mds/mds_lov.c @@ -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); } diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c index 4a82b28..0e9bc1b 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -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); } -- 1.8.3.1