Whamcloud - gitweb
LU-10810 osd: implement lseek method in OSD
[fs/lustre-release.git] / lustre / osd-ldiskfs / osd_io.c
index ab48eb8..78f88e6 100644 (file)
@@ -1909,10 +1909,8 @@ static int osd_fallocate(const struct lu_env *env, struct dt_object *dt,
 {
        struct osd_object *obj = osd_dt_obj(dt);
        struct inode *inode = obj->oo_inode;
+       struct file *file;
        int rc = 0;
-       struct osd_thread_info *info = osd_oti_get(env);
-       struct dentry *dentry = &info->oti_obj_dentry;
-       struct file *file = &info->oti_file;
 
        ENTRY;
        /*
@@ -1934,12 +1932,7 @@ static int osd_fallocate(const struct lu_env *env, struct dt_object *dt,
        /*
         * Because f_op->fallocate() does not have an inode arg
         */
-       dentry->d_inode = inode;
-       dentry->d_sb = inode->i_sb;
-       file->f_path.dentry = dentry;
-       file->f_mapping = inode->i_mapping;
-       file->f_op = inode->i_fop;
-       file->f_inode = inode;
+       file = osd_quasi_file(env, inode);
        rc = file->f_op->fallocate(file, mode, start, end - start);
 
        RETURN(rc);
@@ -2154,6 +2147,34 @@ static int osd_ladvise(const struct lu_env *env, struct dt_object *dt,
        RETURN(rc);
 }
 
+static loff_t osd_lseek(const struct lu_env *env, struct dt_object *dt,
+                       loff_t offset, int whence)
+{
+       struct osd_object *obj = osd_dt_obj(dt);
+       struct inode *inode = obj->oo_inode;
+       struct file *file;
+       loff_t result;
+
+       ENTRY;
+
+       LASSERT(dt_object_exists(dt));
+       LASSERT(osd_invariant(obj));
+       LASSERT(inode);
+
+       file = osd_quasi_file(env, inode);
+       result = file->f_op->llseek(file, offset, whence);
+       /* when result is out of file range then it must be virtual hole
+        * at the end of file, but this is not real file end, so return
+        * just -ENXIO and LOV will merge all results
+        */
+       if (result == i_size_read(inode))
+               result = -ENXIO;
+
+       CDEBUG(D_INFO, "seek %s from %lld: %lld\n", whence == SEEK_HOLE ?
+                      "hole" : "data", offset, result);
+       RETURN(result);
+}
+
 /*
  * in some cases we may need declare methods for objects being created
  * e.g., when we create symlink
@@ -2178,6 +2199,7 @@ const struct dt_body_operations osd_body_ops = {
        .dbo_ladvise                    = osd_ladvise,
        .dbo_declare_fallocate          = osd_declare_fallocate,
        .dbo_fallocate                  = osd_fallocate,
+       .dbo_lseek                      = osd_lseek,
 };
 
 /**