Whamcloud - gitweb
git://git.whamcloud.com
/
fs
/
lustre-release.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
| inline |
side by side
LU-10810 osd: implement lseek method in OSD
[fs/lustre-release.git]
/
lustre
/
osd-ldiskfs
/
osd_io.c
diff --git
a/lustre/osd-ldiskfs/osd_io.c
b/lustre/osd-ldiskfs/osd_io.c
index
ab48eb8
..
78f88e6
100644
(file)
--- a/
lustre/osd-ldiskfs/osd_io.c
+++ b/
lustre/osd-ldiskfs/osd_io.c
@@
-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,
};
/**