X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lustre%2Fllite%2Fllite_lib.c;h=7d332abc6d678e6981b288069ca9d783b81925bb;hb=e709e661395af42471f5ecf3c87f2fa1d3031fbb;hp=7274ff6238dcc9927b51151e7a9048e341fdd41f;hpb=e8f3345b595cad78e64204582c478915f538b0cc;p=fs%2Flustre-release.git diff --git a/lustre/llite/llite_lib.c b/lustre/llite/llite_lib.c index 7274ff6..7d332ab 100644 --- a/lustre/llite/llite_lib.c +++ b/lustre/llite/llite_lib.c @@ -27,7 +27,7 @@ * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. * - * Copyright (c) 2011, 2013, Intel Corporation. + * Copyright (c) 2011, 2014, Intel Corporation. */ /* * This file is part of Lustre, http://www.lustre.org/ @@ -170,7 +170,7 @@ static void ll_free_sbi(struct super_block *sb) static int client_common_fill_super(struct super_block *sb, char *md, char *dt, struct vfsmount *mnt) { - struct inode *root = 0; + struct inode *root = NULL; struct ll_sb_info *sbi = ll_s2sbi(sb); struct obd_device *obd; struct obd_capa *oc = NULL; @@ -180,7 +180,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt, struct obd_uuid *uuid; struct md_op_data *op_data; struct lustre_md lmd; - obd_valid valid; + u64 valid; int size, err, checksum; ENTRY; @@ -653,6 +653,17 @@ int ll_get_max_mdsize(struct ll_sb_info *sbi, int *lmmsize) RETURN(rc); } +/** + * Get the value of the default_easize parameter. + * + * \see client_obd::cl_default_mds_easize + * + * \param[in] sbi superblock info for this filesystem + * \param[out] lmmsize pointer to storage location for value + * + * \retval 0 on success + * \retval negative negated errno on failure + */ int ll_get_default_mdsize(struct ll_sb_info *sbi, int *lmmsize) { int size, rc; @@ -666,6 +677,32 @@ int ll_get_default_mdsize(struct ll_sb_info *sbi, int *lmmsize) RETURN(rc); } +/** + * Set the default_easize parameter to the given value. + * + * \see client_obd::cl_default_mds_easize + * + * \param[in] sbi superblock info for this filesystem + * \param[in] lmmsize the size to set + * + * \retval 0 on success + * \retval negative negated errno on failure + */ +int ll_set_default_mdsize(struct ll_sb_info *sbi, int lmmsize) +{ + int rc; + + if (lmmsize < sizeof(struct lov_mds_md) || + lmmsize > OBD_MAX_DEFAULT_EA_SIZE) + return -EINVAL; + + rc = obd_set_info_async(NULL, sbi->ll_md_exp, + sizeof(KEY_DEFAULT_EASIZE), KEY_DEFAULT_EASIZE, + sizeof(int), &lmmsize, NULL); + + RETURN(rc); +} + int ll_get_max_cookiesize(struct ll_sb_info *sbi, int *lmmsize) { int size, rc; @@ -791,7 +828,7 @@ void ll_kill_super(struct super_block *sb) /* wait running statahead threads to quit */ while (atomic_read(&sbi->ll_sa_running) > 0) schedule_timeout_and_set_state(TASK_UNINTERRUPTIBLE, - HZ >> 3); + msecs_to_jiffies(MSEC_PER_SEC >> 3)); } EXIT; @@ -849,23 +886,6 @@ static int ll_options(char *options, int *flags) *flags &= ~tmp; goto next; } -#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 6, 53, 0) - tmp = ll_set_opt("acl", s1, LL_SBI_ACL); - if (tmp) { - /* Ignore deprecated mount option. The client will - * always try to mount with ACL support, whether this - * is used depends on whether server supports it. */ - LCONSOLE_ERROR_MSG(0x152, "Ignoring deprecated " - "mount option 'acl'.\n"); - goto next; - } - tmp = ll_set_opt("noacl", s1, LL_SBI_ACL); - if (tmp) { - LCONSOLE_ERROR_MSG(0x152, "Ignoring deprecated " - "mount option 'noacl'.\n"); - goto next; - } -#endif tmp = ll_set_opt("remote_client", s1, LL_SBI_RMT_CLIENT); if (tmp) { *flags |= tmp; @@ -988,6 +1008,7 @@ void ll_lli_init(struct ll_inode_info *lli) spin_lock_init(&lli->lli_sa_lock); lli->lli_opendir_pid = 0; lli->lli_sa_enabled = 0; + lli->lli_def_stripe_offset = -1; } else { mutex_init(&lli->lli_size_mutex); lli->lli_symlink_name = NULL; @@ -1312,10 +1333,7 @@ static int ll_init_lsm_md(struct inode *inode, struct lustre_md *md) } } - /* Here is where the lsm is being initialized(fill lmo_info) after - * client retrieve MD stripe information from MDT. */ - return md_update_lsm_md(ll_i2mdexp(inode), lsm, md->body, - ll_md_blocking_ast); + return 0; } static inline int lli_lsm_md_eq(const struct lmv_stripe_md *lsm_md1, @@ -1415,10 +1433,7 @@ static int ll_update_lsm_md(struct inode *inode, struct lustre_md *md) RETURN(-EIO); } - rc = md_update_lsm_md(ll_i2mdexp(inode), ll_i2info(inode)->lli_lsm_md, - md->body, ll_md_blocking_ast); - - RETURN(rc); + RETURN(0); } void ll_clear_inode(struct inode *inode) @@ -1494,8 +1509,8 @@ void ll_clear_inode(struct inode *inode) EXIT; } -int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data, - struct md_open_data **mod) +static int ll_md_setattr(struct dentry *dentry, struct md_op_data *op_data, + struct md_open_data **mod) { struct lustre_md md; struct inode *inode = dentry->d_inode; @@ -1975,7 +1990,7 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md) if (body->mbo_valid & OBD_MD_FLATIME) { if (body->mbo_atime > LTIME_S(inode->i_atime)) LTIME_S(inode->i_atime) = body->mbo_atime; - lli->lli_lvb.lvb_atime = body->mbo_atime; + lli->lli_atime = body->mbo_atime; } if (body->mbo_valid & OBD_MD_FLMTIME) { @@ -1985,13 +2000,13 @@ int ll_update_inode(struct inode *inode, struct lustre_md *md) LTIME_S(inode->i_mtime), body->mbo_mtime); LTIME_S(inode->i_mtime) = body->mbo_mtime; } - lli->lli_lvb.lvb_mtime = body->mbo_mtime; + lli->lli_mtime = body->mbo_mtime; } if (body->mbo_valid & OBD_MD_FLCTIME) { if (body->mbo_ctime > LTIME_S(inode->i_ctime)) LTIME_S(inode->i_ctime) = body->mbo_ctime; - lli->lli_lvb.lvb_ctime = body->mbo_ctime; + lli->lli_ctime = body->mbo_ctime; } if (body->mbo_valid & OBD_MD_FLMODE) @@ -2159,7 +2174,7 @@ int ll_read_inode2(struct inode *inode, void *opaque) void ll_delete_inode(struct inode *inode) { - struct cl_inode_info *lli = cl_i2info(inode); + struct ll_inode_info *lli = ll_i2info(inode); ENTRY; if (S_ISREG(inode->i_mode) && lli->lli_clob != NULL) @@ -2231,7 +2246,7 @@ int ll_iocontrol(struct inode *inode, struct file *file, if (IS_ERR(op_data)) RETURN(PTR_ERR(op_data)); - ((struct ll_iattr *)&op_data->op_attr)->ia_attr_flags = flags; + op_data->op_attr_flags = flags; op_data->op_attr.ia_valid |= ATTR_ATTR_FLAG; rc = md_setattr(sbi->ll_md_exp, op_data, NULL, 0, NULL, 0, &req, NULL); @@ -2377,7 +2392,7 @@ int ll_prep_inode(struct inode **inode, struct ptlrpc_request *req, struct super_block *sb, struct lookup_intent *it) { struct ll_sb_info *sbi = NULL; - struct lustre_md md = { 0 }; + struct lustre_md md = { NULL }; int rc; ENTRY; @@ -2554,8 +2569,12 @@ struct md_op_data * ll_prep_md_op_data(struct md_op_data *op_data, ll_i2gids(op_data->op_suppgids, i1, i2); op_data->op_fid1 = *ll_inode2fid(i1); op_data->op_capa1 = ll_mdscapa_get(i1); - if (S_ISDIR(i1->i_mode)) + op_data->op_default_stripe_offset = -1; + if (S_ISDIR(i1->i_mode)) { op_data->op_mea1 = ll_i2info(i1)->lli_lsm_md; + op_data->op_default_stripe_offset = + ll_i2info(i1)->lli_def_stripe_offset; + } if (i2) { op_data->op_fid2 = *ll_inode2fid(i2); @@ -2718,7 +2737,7 @@ void ll_dirty_page_discard_warn(struct page *page, int ioret) { char *buf, *path = NULL; struct dentry *dentry = NULL; - struct ccc_object *obj = cl_inode2ccc(page->mapping->host); + struct vvp_object *obj = cl_inode2vvp(page->mapping->host); /* this can be called inside spin lock so use GFP_ATOMIC. */ buf = (char *)__get_free_page(GFP_ATOMIC); @@ -2732,7 +2751,7 @@ void ll_dirty_page_discard_warn(struct page *page, int ioret) "%s: dirty page discard: %s/fid: "DFID"/%s may get corrupted " "(rc %d)\n", ll_get_fsname(page->mapping->host->i_sb, NULL, 0), s2lsi(page->mapping->host->i_sb)->lsi_lmd->lmd_dev, - PFID(&obj->cob_header.coh_lu.loh_fid), + PFID(&obj->vob_header.coh_lu.loh_fid), (path && !IS_ERR(path)) ? path : "", ioret); if (dentry != NULL) @@ -2807,20 +2826,18 @@ void ll_compute_rootsquash_state(struct ll_sb_info *sbi) /** * Parse linkea content to extract information about a given hardlink * - * \param[in] ldata - Initialized linkea data - * \param[in] linkno - Link identifier - * \param[out] gpout - Destination structure to fill with linkno, - * parent FID and entry name - * \param[in] size - Size of the gp_name buffer in gpout + * \param[in] ldata - Initialized linkea data + * \param[in] linkno - Link identifier + * \param[out] parent_fid - The entry's parent FID + * \param[out] ln - Entry name destination buffer * * \retval 0 on success * \retval Appropriate negative error code on failure */ static int ll_linkea_decode(struct linkea_data *ldata, unsigned int linkno, - struct getparent *gpout, size_t name_size) + struct lu_fid *parent_fid, struct lu_name *ln) { unsigned int idx; - struct lu_name ln; int rc; ENTRY; @@ -2833,25 +2850,18 @@ static int ll_linkea_decode(struct linkea_data *ldata, unsigned int linkno, RETURN(-ENODATA); linkea_first_entry(ldata); - idx = 0; - while (ldata->ld_lee != NULL) { - linkea_entry_unpack(ldata->ld_lee, &ldata->ld_reclen, &ln, - &gpout->gp_fid); + for (idx = 0; ldata->ld_lee != NULL; idx++) { + linkea_entry_unpack(ldata->ld_lee, &ldata->ld_reclen, ln, + parent_fid); if (idx == linkno) break; linkea_next_entry(ldata); - idx++; } if (idx < linkno) RETURN(-ENODATA); - if (ln.ln_namelen >= name_size) - RETURN(-EOVERFLOW); - - gpout->gp_linkno = linkno; - strlcpy(gpout->gp_name, ln.ln_name, name_size); RETURN(0); } @@ -2874,10 +2884,10 @@ int ll_getparent(struct file *file, struct getparent __user *arg) struct inode *inode = file->f_dentry->d_inode; struct linkea_data *ldata; struct lu_buf buf = LU_BUF_NULL; - struct getparent *gpout; + struct lu_name ln; + struct lu_fid parent_fid; __u32 linkno; __u32 name_size; - size_t out_size; int rc; ENTRY; @@ -2903,27 +2913,26 @@ int ll_getparent(struct file *file, struct getparent __user *arg) if (rc < 0) GOTO(ldata_free, rc); - out_size = sizeof(*gpout) + name_size; - OBD_ALLOC(gpout, out_size); - if (gpout == NULL) - GOTO(lb_free, rc = -ENOMEM); - - if (copy_from_user(gpout, arg, sizeof(*gpout))) - GOTO(gp_free, rc = -EFAULT); - rc = ll_getxattr(dentry, XATTR_NAME_LINK, buf.lb_buf, buf.lb_len); if (rc < 0) - GOTO(gp_free, rc); + GOTO(lb_free, rc); - rc = ll_linkea_decode(ldata, linkno, gpout, name_size); + rc = ll_linkea_decode(ldata, linkno, &parent_fid, &ln); if (rc < 0) - GOTO(gp_free, rc); + GOTO(lb_free, rc); + + if (ln.ln_namelen >= name_size) + GOTO(lb_free, rc = -EOVERFLOW); + + if (copy_to_user(&arg->gp_fid, &parent_fid, sizeof(arg->gp_fid))) + GOTO(lb_free, rc = -EFAULT); + + if (copy_to_user(&arg->gp_name, ln.ln_name, ln.ln_namelen)) + GOTO(lb_free, rc = -EFAULT); - if (copy_to_user(arg, gpout, out_size)) - GOTO(gp_free, rc = -EFAULT); + if (put_user('\0', arg->gp_name + ln.ln_namelen)) + GOTO(lb_free, rc = -EFAULT); -gp_free: - OBD_FREE(gpout, out_size); lb_free: lu_buf_free(&buf); ldata_free: