Whamcloud - gitweb
LU-10810 clio: SEEK_HOLE/SEEK_DATA on client side
[fs/lustre-release.git] / lustre / llite / llite_lib.c
index 66b3d2b..5e6bfd3 100644 (file)
@@ -129,11 +129,13 @@ static struct ll_sb_info *ll_init_sbi(void)
        if (sbi->ll_cache == NULL)
                GOTO(out_destroy_ra, rc = -ENOMEM);
 
-       sbi->ll_ra_info.ra_max_pages_per_file = min(pages / 32,
-                                                   SBI_DEFAULT_READ_AHEAD_MAX);
+       sbi->ll_ra_info.ra_max_pages =
+               min(pages / 32, SBI_DEFAULT_READ_AHEAD_MAX);
+       sbi->ll_ra_info.ra_max_pages_per_file =
+               min(sbi->ll_ra_info.ra_max_pages / 4,
+                   SBI_DEFAULT_READ_AHEAD_PER_FILE_MAX);
        sbi->ll_ra_info.ra_async_pages_per_file_threshold =
                                sbi->ll_ra_info.ra_max_pages_per_file;
-       sbi->ll_ra_info.ra_max_pages = sbi->ll_ra_info.ra_max_pages_per_file;
        sbi->ll_ra_info.ra_max_read_ahead_whole_pages = -1;
        atomic_set(&sbi->ll_ra_info.ra_async_inflight, 0);
 
@@ -276,7 +278,8 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
                                   OBD_CONNECT2_LSOM |
                                   OBD_CONNECT2_ASYNC_DISCARD |
                                   OBD_CONNECT2_PCC |
-                                  OBD_CONNECT2_CRUSH;
+                                  OBD_CONNECT2_CRUSH | OBD_CONNECT2_LSEEK |
+                                  OBD_CONNECT2_GETATTR_PFID;
 
 #ifdef HAVE_LRU_RESIZE_SUPPORT
         if (sbi->ll_flags & LL_SBI_LRU_RESIZE)
@@ -474,7 +477,7 @@ static int client_common_fill_super(struct super_block *sb, char *md, char *dt)
                                  OBD_CONNECT_BULK_MBITS | OBD_CONNECT_SHORTIO |
                                  OBD_CONNECT_FLAGS2 | OBD_CONNECT_GRANT_SHRINK;
        data->ocd_connect_flags2 = OBD_CONNECT2_LOCKAHEAD |
-                                  OBD_CONNECT2_INC_XID;
+                                  OBD_CONNECT2_INC_XID | OBD_CONNECT2_LSEEK;
 
        if (!OBD_FAIL_CHECK(OBD_FAIL_OSC_CONNECT_GRANT_PARAM))
                data->ocd_connect_flags |= OBD_CONNECT_GRANT_PARAM;
@@ -2034,7 +2037,15 @@ int ll_setattr_raw(struct dentry *dentry, struct iattr *attr,
                            attr->ia_valid & ATTR_SIZE) {
                                xvalid |= OP_XVALID_FLAGS;
                                flags = LUSTRE_ENCRYPT_FL;
-                               if (attr->ia_size & ~PAGE_MASK) {
+                               /* Call to ll_io_zero_page is not necessary if
+                                * truncating on PAGE_SIZE boundary, because
+                                * whole pages will be wiped.
+                                * In case of Direct IO, all we need is to set
+                                * new size.
+                                */
+                               if (attr->ia_size & ~PAGE_MASK &&
+                                   !(attr->ia_valid & ATTR_FILE &&
+                                     attr->ia_file->f_flags & O_DIRECT)) {
                                        pgoff_t offset =
                                                attr->ia_size & (PAGE_SIZE - 1);
 
@@ -2900,7 +2911,9 @@ struct md_op_data *ll_prep_md_op_data(struct md_op_data *op_data,
                if (namelen > ll_i2sbi(i1)->ll_namelen)
                        return ERR_PTR(-ENAMETOOLONG);
 
-               if (!lu_name_is_valid_2(name, namelen))
+               /* "/" is not valid name, but it's allowed */
+               if (!lu_name_is_valid_2(name, namelen) &&
+                   strncmp("/", name, namelen) != 0)
                        return ERR_PTR(-EINVAL);
        }
 
@@ -2966,7 +2979,8 @@ void ll_finish_md_op_data(struct md_op_data *op_data)
        ll_unlock_md_op_lsm(op_data);
        security_release_secctx(op_data->op_file_secctx,
                                op_data->op_file_secctx_size);
-        OBD_FREE_PTR(op_data);
+       llcrypt_free_ctx(op_data->op_file_encctx, op_data->op_file_encctx_size);
+       OBD_FREE_PTR(op_data);
 }
 
 int ll_show_options(struct seq_file *seq, struct dentry *dentry)