X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fllite_lib.c;h=5ae049ddf1308718430524965bd5dfffa538174b;hb=bd1b99d7caa6ab2b7c771524af9178a3da69eeab;hp=bc4172308303cf1513e37ab6918d322dc3e0fe68;hpb=fe79e1b3a463c6ff8d6a8c8be2b9505df5a5702a;p=fs%2Flustre-release.git diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index bc417230..5ae049d 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -24,6 +24,7 @@ #define DEBUG_SUBSYSTEM S_LLITE #include +#include #include #include @@ -37,7 +38,6 @@ kmem_cache_t *ll_file_data_slab; extern struct address_space_operations ll_aops; extern struct address_space_operations ll_dir_aops; -extern struct super_operations ll_super_operations; #ifndef log2 #define log2(n) ffz(~(n)) @@ -192,6 +192,14 @@ int lustre_common_fill_super(struct super_block *sb, char *mdc, char *osc) GOTO(out_root, err); } + /* making vm readahead 0 for 2.4.x. In the case of 2.6.x, + backing dev info assigned to inode mapping is used for + determining maximal readahead. */ +#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)) + /* bug 2805 - set VM readahead to zero */ + vm_max_readahead = vm_min_readahead = 0; +#endif + sb->s_root = d_alloc_root(root); RETURN(err); @@ -355,19 +363,6 @@ out: RETURN(err); } /* ll_read_super */ -void ll_put_super(struct super_block *sb) -{ - ENTRY; - - CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb); - - lustre_common_put_super(sb); - - lustre_free_sbi(sb); - - EXIT; -} /* ll_put_super */ - int lustre_process_log(struct lustre_mount_data *lmd, char * profile, struct config_llog_instance *cfg, int allow_recov) { @@ -385,6 +380,9 @@ int lustre_process_log(struct lustre_mount_data *lmd, char * profile, int err; ENTRY; + if (lmd_bad_magic(lmd)) + RETURN(-EINVAL); + generate_random_uuid(uuid); class_uuid_unparse(uuid, &mdc_uuid); @@ -392,7 +390,7 @@ int lustre_process_log(struct lustre_mount_data *lmd, char * profile, PCFG_INIT(pcfg, NAL_CMD_REGISTER_MYNID); pcfg.pcfg_nal = lmd->lmd_nal; pcfg.pcfg_nid = lmd->lmd_local_nid; - err = kportal_nal_cmd(&pcfg); + err = libcfs_nal_cmd(&pcfg); if (err <0) GOTO(out, err); } @@ -405,7 +403,7 @@ int lustre_process_log(struct lustre_mount_data *lmd, char * profile, pcfg.pcfg_misc = lmd->lmd_port; pcfg.pcfg_size = 8388608; pcfg.pcfg_flags = 0x4; /*share*/ - err = kportal_nal_cmd(&pcfg); + err = libcfs_nal_cmd(&pcfg); if (err <0) GOTO(out, err); } @@ -457,7 +455,14 @@ int lustre_process_log(struct lustre_mount_data *lmd, char * profile, exp = class_conn2export(&mdc_conn); ctxt = llog_get_context(exp->exp_obd, LLOG_CONFIG_REPL_CTXT); +#if 1 rc = class_config_parse_llog(ctxt, profile, cfg); +#else + /* + * For debugging, it's useful to just dump the log + */ + rc = class_config_dump_llog(ctxt, profile, cfg); +#endif if (rc) { CERROR("class_config_parse_llog failed: rc = %d\n", rc); } @@ -489,7 +494,7 @@ out_del_conn: pcfg.pcfg_nid = lmd->lmd_server_nid; pcfg.pcfg_id = lmd->lmd_server_ipaddr; pcfg.pcfg_flags = 1; /*share*/ - err = kportal_nal_cmd(&pcfg); + err = libcfs_nal_cmd(&pcfg); if (err <0) GOTO(out, err); } @@ -510,6 +515,9 @@ int lustre_fill_super(struct super_block *sb, void *data, int silent) ENTRY; CDEBUG(D_VFSTRACE, "VFS Op: sb %p\n", sb); + if (lmd_bad_magic(lmd)) + RETURN(-EINVAL); + sbi = lustre_init_sbi(sb); if (!sbi) RETURN(-ENOMEM); @@ -863,10 +871,10 @@ int ll_setattr_raw(struct inode *inode, struct iattr *attr) (rc=ll_permission(inode,MAY_WRITE,NULL))!=0) RETURN(rc); } else { - /* from inode_change_ok() */ - if (current->fsuid != inode->i_uid && - !capable(CAP_FOWNER)) - RETURN(-EPERM); + /* from inode_change_ok() */ + if (current->fsuid != inode->i_uid && + !capable(CAP_FOWNER)) + RETURN(-EPERM); } } @@ -1047,6 +1055,9 @@ void ll_update_inode(struct inode *inode, struct mds_body *body, LBUG(); } } + /* bug 2844 - limit i_blksize for broken user-space apps */ + LASSERTF(lsm->lsm_xfersize != 0, "%lu\n", lsm->lsm_xfersize); + inode->i_blksize = min(lsm->lsm_xfersize, LL_MAX_BLKSIZE); if (lli->lli_smd != lsm) obd_free_memmd(ll_i2obdexp(inode), &lsm); } @@ -1093,6 +1104,13 @@ void ll_update_inode(struct inode *inode, struct mds_body *body, set_bit(LLI_F_HAVE_MDS_SIZE_LOCK, &lli->lli_flags); } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)) +static struct backing_dev_info ll_backing_dev_info = { + .ra_pages = 0, /* No readahead */ + .memory_backed = 0, /* Does contribute to dirty memory */ +}; +#endif + void ll_read_inode2(struct inode *inode, void *opaque) { struct lustre_md *md = opaque; @@ -1132,12 +1150,34 @@ void ll_read_inode2(struct inode *inode, void *opaque) EXIT; } else { inode->i_op = &ll_special_inode_operations; + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) init_special_inode(inode, inode->i_mode, kdev_t_to_nr(inode->i_rdev)); + + /* initializing backing dev info. */ + inode->i_mapping->backing_dev_info = &ll_backing_dev_info; #else init_special_inode(inode, inode->i_mode, inode->i_rdev); #endif + lli->ll_save_ifop = inode->i_fop; + + if (S_ISCHR(inode->i_mode)) + inode->i_fop = &ll_special_chr_inode_fops; + else if (S_ISBLK(inode->i_mode)) + inode->i_fop = &ll_special_blk_inode_fops; + else if (S_ISFIFO(inode->i_mode)) + inode->i_fop = &ll_special_fifo_inode_fops; + else if (S_ISSOCK(inode->i_mode)) + inode->i_fop = &ll_special_sock_inode_fops; + + CWARN("saved %p, replaced with %p\n", lli->ll_save_ifop, + inode->i_fop); + + if (lli->ll_save_ifop->owner) { + CWARN("%p has owner %p\n", lli->ll_save_ifop, + lli->ll_save_ifop->owner); + } EXIT; } }