From b67a949985e20d56dacb70730976146b3a2e4a88 Mon Sep 17 00:00:00 2001 From: yury Date: Thu, 23 Jun 2005 14:52:51 +0000 Subject: [PATCH] - numerous fixes from b_cray, b_1_4 and Andreas' comments. --- lustre/llite/file.c | 3 ++- lustre/lov/lov_obd.c | 6 ++++++ lustre/lvfs/llog_lvfs.c | 2 +- lustre/lvfs/lvfs_reint.c | 10 +++++----- lustre/obdclass/class_obd.c | 6 ++---- lustre/obdfilter/filter.c | 15 +++++++++++++-- lustre/obdfilter/filter_lvb.c | 6 +++++- lustre/obdfilter/filter_san.c | 25 +++++++++++++++++-------- 8 files changed, 51 insertions(+), 22 deletions(-) diff --git a/lustre/llite/file.c b/lustre/llite/file.c index b522d89..7505f9d 100644 --- a/lustre/llite/file.c +++ b/lustre/llite/file.c @@ -393,7 +393,8 @@ int ll_file_open(struct inode *inode, struct file *file) down(&lli->lli_och_sem); if (*och_p) { /* Open handle is present */ - if (LUSTRE_IT(it)->it_disposition) { + if (it_disposition(it, DISP_LOOKUP_POS) && /* Positive lookup */ + it_disposition(it, DISP_OPEN_OPEN)) { /* & OPEN happened */ struct obd_client_handle *och; /* Well, there's extra open request that we do not need, let's close it somehow*/ diff --git a/lustre/lov/lov_obd.c b/lustre/lov/lov_obd.c index ae74d22..9baefff 100644 --- a/lustre/lov/lov_obd.c +++ b/lustre/lov/lov_obd.c @@ -976,6 +976,12 @@ static int lov_setattr(struct obd_export *exp, struct obdo *src_oa, if (!exp || !exp->exp_obd) RETURN(-ENODEV); + LASSERT(!(src_oa->o_valid & ~(OBD_MD_FLID|OBD_MD_FLTYPE | OBD_MD_FLMODE| + OBD_MD_FLATIME | OBD_MD_FLMTIME | + OBD_MD_FLCTIME | OBD_MD_FLFLAGS | + OBD_MD_FLSIZE | OBD_MD_FLGROUP | + OBD_MD_FLUID | OBD_MD_FLGID))); + LASSERT(!(src_oa->o_valid & OBD_MD_FLGROUP) || src_oa->o_gr > 0); lov = &exp->exp_obd->u.lov; diff --git a/lustre/lvfs/llog_lvfs.c b/lustre/lvfs/llog_lvfs.c index 3a9dd92..a72b329 100644 --- a/lustre/lvfs/llog_lvfs.c +++ b/lustre/lvfs/llog_lvfs.c @@ -915,7 +915,7 @@ static int llog_lvfs_destroy(struct llog_handle *loghandle) down(&ctxt->loc_objects_dir->d_inode->i_sem); fdentry = lookup_one_len(id_name, ctxt->loc_objects_dir, id_len); - if (fdentry == NULL || fdentry->d_inode == NULL) { + if (IS_ERR(fdentry) || fdentry->d_inode == NULL) { CERROR("destroy non_existent object %s\n", id_name); GOTO(out_err, rc = IS_ERR(fdentry) ? diff --git a/lustre/lvfs/lvfs_reint.c b/lustre/lvfs/lvfs_reint.c index fbcf400..dbaf1ff 100644 --- a/lustre/lvfs/lvfs_reint.c +++ b/lustre/lvfs/lvfs_reint.c @@ -267,7 +267,7 @@ static int lvfs_reint_link(struct super_block *sb, struct reint_record *r_rec) old_dentry = lookup_one_len(old_nd.last.name, old_dparent, old_nd.last.len); - if (!old_dentry || !old_dentry->d_inode || + if (IS_ERR(old_dentry) || !old_dentry->d_inode || is_bad_inode(old_dentry->d_inode)) GOTO(cleanup, rc = -ENODEV); if (dir->i_rdev != old_dentry->d_inode->i_rdev) @@ -321,7 +321,7 @@ static int lvfs_reint_unlink(struct super_block *sb, struct reint_record *r_rec) dir = dparent->d_inode; dentry = lookup_one_len(nd.last.name, dparent, nd.last.len); - if (!dentry || !dentry->d_inode || is_bad_inode(dentry->d_inode)) + if (IS_ERR(dentry) || !dentry->d_inode || is_bad_inode(dentry->d_inode)) GOTO(cleanup, rc = -ENODEV); if (!SMFS_DO_WRITE_KML(r_rec->u_rec.ur_flags)) @@ -390,7 +390,7 @@ static int lvfs_reint_rename(struct super_block *sb, struct reint_record *r_rec) dir = dparent->d_inode; dentry = lookup_one_len(nd.last.name, dparent, nd.last.len); - if (!dentry || !dentry->d_inode || is_bad_inode(dentry->d_inode)) { + if (IS_ERR(dentry) || !dentry->d_inode || is_bad_inode(dentry->d_inode)) { path_release(&nd); RETURN(rc); } @@ -466,7 +466,7 @@ static int lvfs_reint_setattr(struct super_block *sb, dir = dparent->d_inode; dentry = lookup_one_len(nd.last.name, dparent, nd.last.len); - if (!dentry || !dentry->d_inode || is_bad_inode(dentry->d_inode)) { + if (IS_ERR(dentry) || !dentry->d_inode || is_bad_inode(dentry->d_inode)) { path_release(&nd); RETURN(rc); } @@ -508,7 +508,7 @@ static int lvfs_reint_close(struct super_block *sb, struct reint_record *r_rec) dir = dparent->d_inode; dentry = lookup_one_len(nd.last.name, dparent, nd.last.len); - if (!dentry || !dentry->d_inode || is_bad_inode(dentry->d_inode)) { + if (IS_ERR(dentry) || !dentry->d_inode || is_bad_inode(dentry->d_inode)) { path_release(&nd); RETURN(rc); } diff --git a/lustre/obdclass/class_obd.c b/lustre/obdclass/class_obd.c index b108412..82fc52c 100644 --- a/lustre/obdclass/class_obd.c +++ b/lustre/obdclass/class_obd.c @@ -208,10 +208,8 @@ int class_handle_ioctl(unsigned int cmd, unsigned long arg) OBD_ALLOC(lcfg, data->ioc_plen1); err = copy_from_user(lcfg, data->ioc_pbuf1, data->ioc_plen1); - if (err) - GOTO(out, err); - - err = class_process_config(lcfg); + if (!err) + err = class_process_config(lcfg); OBD_FREE(lcfg, data->ioc_plen1); GOTO(out, err); } diff --git a/lustre/obdfilter/filter.c b/lustre/obdfilter/filter.c index 05c54f8..517285f 100644 --- a/lustre/obdfilter/filter.c +++ b/lustre/obdfilter/filter.c @@ -1574,18 +1574,29 @@ static int filter_detach(struct obd_device *dev) static int filter_setup(struct obd_device *obd, obd_count len, void *buf) { - struct lustre_cfg* lcfg = buf; struct filter_obd *filter = &obd->u.filter; + struct lustre_cfg *lcfg = buf; + unsigned long page; int rc; ENTRY; spin_lock_init(&filter->fo_denylist_lock); INIT_LIST_HEAD(&filter->fo_denylist); + /* 2.6.9 selinux wants a full option page for do_kern_mount (bug6471) */ + page = get_zeroed_page(GFP_KERNEL); + if (!page) + RETURN(-ENOMEM); + + memcpy((void *)page, lustre_cfg_buf(lcfg, 4), + LUSTRE_CFG_BUFLEN(lcfg, 4)); + /* all mount options including errors=remount-ro and asyncdel are passed * using 4th lcfg param. And it is good, finally we have got rid of * hardcoded fs types in the code. */ - rc = filter_common_setup(obd, len, buf, lustre_cfg_buf(lcfg, 4)); + rc = filter_common_setup(obd, len, buf, (void *)page); + free_page(page); + if (rc) RETURN(rc); rc = filter_post_fs_setup(obd); diff --git a/lustre/obdfilter/filter_lvb.c b/lustre/obdfilter/filter_lvb.c index 500ff07..b539f3f 100644 --- a/lustre/obdfilter/filter_lvb.c +++ b/lustre/obdfilter/filter_lvb.c @@ -79,7 +79,11 @@ static int filter_lvbo_init(struct ldlm_resource *res) if (dentry->d_inode == NULL) { lvb->lvb_size = 0; lvb->lvb_blocks = 0; - lvb->lvb_mtime = LTIME_S(CURRENT_TIME); + + /* making client use MDS mtime as this one is zero, bigger one + * will be taken and this does not break POSIX. Thanks to + * Andreas. --umka */ + lvb->lvb_mtime = 0; } else { lvb->lvb_size = dentry->d_inode->i_size; lvb->lvb_blocks = dentry->d_inode->i_blocks; diff --git a/lustre/obdfilter/filter_san.c b/lustre/obdfilter/filter_san.c index ed4da89..c504e01 100644 --- a/lustre/obdfilter/filter_san.c +++ b/lustre/obdfilter/filter_san.c @@ -37,21 +37,30 @@ /* sanobd setup methods - use a specific mount option */ int filter_san_setup(struct obd_device *obd, obd_count len, void *buf) { - struct lustre_cfg* lcfg = buf; - char *option = NULL; - - if (!lustre_cfg_buf(lcfg, 2)) + struct lustre_cfg *lcfg = buf; + unsigned long page; + int rc; + + if (lcfg->lcfg_bufcount < 3 || LUSTRE_CFG_BUFLEN(lcfg, 2) < 1) RETURN(-EINVAL); + /* 2.6.9 selinux wants a full option page for do_kern_mount (bug6471) */ + page = get_zeroed_page(GFP_KERNEL); + if (!page) + RETURN(-ENOMEM); + /* for extN/ext3 filesystem, we must mount it with 'writeback' mode */ - if (!strcmp(lustre_cfg_string(lcfg, 2), "extN")) - option = "data=writeback"; + if (!strcmp(lustre_cfg_string(lcfg, 2), "ldiskfs")) + strcpy((void *)page, "data=writeback"); else if (!strcmp(lustre_cfg_string(lcfg, 2), "ext3")) - option = "data=writeback,asyncdel"; + strcpy((void *)page, "data=writeback,asyncdel"); else LBUG(); /* just a reminder */ - return filter_common_setup(obd, len, buf, option); + rc = filter_common_setup(obd, len, buf, (void *)page); + free_page(page); + + return rc; } int filter_san_preprw(int cmd, struct obd_export *exp, struct obdo *oa, -- 1.8.3.1