Whamcloud - gitweb
LU-5549 mdc: cl_default_mds_easize not refreshed
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index 17e388f..7d332ab 100644 (file)
@@ -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;
 
@@ -2527,9 +2542,9 @@ int ll_process_config(struct lustre_cfg *lcfg)
 
 /* this function prepares md_op_data hint for passing ot down to MD stack. */
 struct md_op_data * ll_prep_md_op_data(struct md_op_data *op_data,
-                                       struct inode *i1, struct inode *i2,
-                                       const char *name, int namelen,
-                                       int mode, __u32 opc, void *data)
+                                      struct inode *i1, struct inode *i2,
+                                      const char *name, size_t namelen,
+                                      __u32 mode, __u32 opc, void *data)
 {
         LASSERT(i1 != NULL);
 
@@ -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)
@@ -2742,6 +2761,32 @@ void ll_dirty_page_discard_warn(struct page *page, int ioret)
                free_page((unsigned long)buf);
 }
 
+ssize_t ll_copy_user_md(const struct lov_user_md __user *md,
+                       struct lov_user_md **kbuf)
+{
+       struct lov_user_md      lum;
+       ssize_t                 lum_size;
+       ENTRY;
+
+       if (copy_from_user(&lum, md, sizeof(lum)))
+               RETURN(-EFAULT);
+
+       lum_size = ll_lov_user_md_size(&lum);
+       if (lum_size < 0)
+               RETURN(lum_size);
+
+       OBD_ALLOC(*kbuf, lum_size);
+       if (*kbuf == NULL)
+               RETURN(-ENOMEM);
+
+       if (copy_from_user(*kbuf, md, lum_size) != 0) {
+               OBD_FREE(*kbuf, lum_size);
+               RETURN(-EFAULT);
+       }
+
+       RETURN(lum_size);
+}
+
 /*
  * Compute llite root squash state after a change of root squash
  * configuration setting or add/remove of a lnet nid
@@ -2781,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;
 
@@ -2807,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);
 }
 
@@ -2848,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;
@@ -2877,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: