From: James Simmons <jsimmons@infradead.org>
To: lustre-devel@lists.lustre.org
Subject: [lustre-devel] [PATCH 122/151] lustre: llite: Add tiny write support
Date: Mon, 30 Sep 2019 14:56:21 -0400 [thread overview]
Message-ID: <1569869810-23848-123-git-send-email-jsimmons@infradead.org> (raw)
In-Reply-To: <1569869810-23848-1-git-send-email-jsimmons@infradead.org>
From: Patrick Farrell <pfarrell@whamcloud.com>
If a page is already dirty in the page cache, we can write
to it without a full i/o. This improves performance for
writes of < 1 page dramatically.
Append writes are a bit tricky, requiring us to take the
range lock (which we can normally avoid), but they are
still much faster than the normal i/o path.
Performance numbers with dd, on a VM with an older Xeon.
All numbers in MiB/s.
8 bytes 1KiB
Without patch: .75 75
With patch: 6.5 153
WC-bug-id: https://jira.whamcloud.com/browse/LU-9409
Cray-bug-id: LUS-1705
Lustre-commit: 94470f7eeab5 ("LU-9409 llite: Add tiny write support")
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/27903
Reviewed-by: Jinshan Xiong <jinshan.xiong@gmail.com>
Reviewed-by: Alexey Lyashkov <c17817@cray.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: James Simmons <jsimmons@infradead.org>
---
fs/lustre/include/cl_object.h | 9 ++++
fs/lustre/llite/file.c | 122 ++++++++++++++++++++++++++++++++++++++++--
fs/lustre/llite/rw26.c | 71 ++++++++++++++++++++++--
fs/lustre/obdclass/cl_page.c | 13 +++++
fs/lustre/osc/osc_internal.h | 2 +
fs/lustre/osc/osc_io.c | 16 ++----
fs/lustre/osc/osc_page.c | 12 ++++-
7 files changed, 224 insertions(+), 21 deletions(-)
diff --git a/fs/lustre/include/cl_object.h b/fs/lustre/include/cl_object.h
index 1088fde..c96a5b7 100644
--- a/fs/lustre/include/cl_object.h
+++ b/fs/lustre/include/cl_object.h
@@ -865,6 +865,13 @@ struct cl_page_operations {
*/
int (*cpo_is_vmlocked)(const struct lu_env *env,
const struct cl_page_slice *slice);
+
+ /**
+ * Update file attributes when all we have is this page. Used for tiny
+ * writes to update attributes when we don't have a full cl_io.
+ */
+ void (*cpo_page_touch)(const struct lu_env *env,
+ const struct cl_page_slice *slice, size_t to);
/**
* Page destruction.
*/
@@ -2203,6 +2210,8 @@ void cl_page_discard(const struct lu_env *env, struct cl_io *io,
struct cl_page *pg);
void cl_page_delete(const struct lu_env *env, struct cl_page *pg);
int cl_page_is_vmlocked(const struct lu_env *env, const struct cl_page *pg);
+void cl_page_touch(const struct lu_env *env, const struct cl_page *pg,
+ size_t to);
void cl_page_export(const struct lu_env *env, struct cl_page *pg, int uptodate);
loff_t cl_offset(const struct cl_object *obj, pgoff_t idx);
pgoff_t cl_index(const struct cl_object *obj, loff_t offset);
diff --git a/fs/lustre/llite/file.c b/fs/lustre/llite/file.c
index 92f4a43..da5bf86 100644
--- a/fs/lustre/llite/file.c
+++ b/fs/lustre/llite/file.c
@@ -1475,6 +1475,101 @@ static ssize_t ll_file_read_iter(struct kiocb *iocb, struct iov_iter *to)
return result;
}
+/**
+ * Similar trick to ll_do_fast_read, this improves write speed for tiny writes.
+ * If a page is already in the page cache and dirty (and some other things -
+ * See ll_tiny_write_begin for the instantiation of these rules), then we can
+ * write to it without doing a full I/O, because Lustre already knows about it
+ * and will write it out. This saves a lot of processing time.
+ *
+ * All writes here are within one page, so exclusion is handled by the page
+ * lock on the vm page. Exception is appending, which requires locking the
+ * full file to handle size issues. We do not do tiny writes for writes which
+ * touch multiple pages because it's very unlikely multiple sequential pages
+ * are already dirty.
+ *
+ * We limit these to < PAGE_SIZE because PAGE_SIZE writes are relatively common
+ * and are unlikely to be to already dirty pages.
+ *
+ * Attribute updates are important here, we do it in ll_tiny_write_end.
+ */
+static ssize_t ll_do_tiny_write(struct kiocb *iocb, struct iov_iter *iter)
+{
+ ssize_t count = iov_iter_count(iter);
+ struct file *file = iocb->ki_filp;
+ struct inode *inode = file_inode(file);
+ struct ll_inode_info *lli = ll_i2info(inode);
+ struct range_lock range;
+ ssize_t result = 0;
+ bool append = false;
+
+ /* NB: we can't do direct IO for tiny writes because they use the page
+ * cache, and we can't do sync writes because tiny writes can't flush
+ * pages.
+ */
+ if (file->f_flags & (O_DIRECT | O_SYNC))
+ return 0;
+
+ /* It is relatively unlikely we will overwrite a full dirty page, so
+ * limit tiny writes to < PAGE_SIZE
+ */
+ if (count >= PAGE_SIZE)
+ return 0;
+
+ /* For append writes, we must take the range lock to protect size
+ * and also move pos to current size before writing.
+ */
+ if (file->f_flags & O_APPEND) {
+ struct lu_env *env;
+ u16 refcheck;
+
+ append = true;
+ range_lock_init(&range, 0, LUSTRE_EOF);
+ result = range_lock(&lli->lli_write_tree, &range);
+ if (result)
+ return result;
+ env = cl_env_get(&refcheck);
+ if (IS_ERR(env)) {
+ result = PTR_ERR(env);
+ goto out;
+ }
+ ll_merge_attr(env, inode);
+ cl_env_put(env, &refcheck);
+ iocb->ki_pos = i_size_read(inode);
+ }
+
+ /* Does this write touch multiple pages?
+ *
+ * This partly duplicates the PAGE_SIZE check above, but must come
+ * after range locking for append writes because it depends on the
+ * write position (ki_pos).
+ */
+ if ((iocb->ki_pos & (PAGE_SIZE-1)) + count > PAGE_SIZE)
+ goto out;
+
+ result = __generic_file_write_iter(iocb, iter);
+
+ /* If the page is not already dirty, ll_tiny_write_begin returns
+ * -ENODATA. We continue on to normal write.
+ */
+ if (result == -ENODATA)
+ result = 0;
+
+ if (result > 0) {
+ ll_stats_ops_tally(ll_i2sbi(inode), LPROC_LL_WRITE_BYTES,
+ result);
+ set_bit(LLIF_DATA_MODIFIED, &ll_i2info(inode)->lli_flags);
+ }
+
+out:
+ if (append)
+ range_unlock(&lli->lli_write_tree, &range);
+
+ CDEBUG(D_VFSTRACE, "result: %zu, original count %zu\n", result, count);
+
+ return result;
+}
+
/*
* Write to a file (through the page cache).
*/
@@ -1482,9 +1577,19 @@ static ssize_t ll_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
{
struct lu_env *env;
struct vvp_io_args *args;
- ssize_t result;
+ ssize_t rc_tiny, rc_normal;
u16 refcheck;
+ rc_tiny = ll_do_tiny_write(iocb, from);
+
+ /* In case of error, go on and try normal write - Only stop if tiny
+ * write completed I/O.
+ */
+ if (iov_iter_count(from) == 0) {
+ rc_normal = rc_tiny;
+ goto out;
+ }
+
env = cl_env_get(&refcheck);
if (IS_ERR(env))
return PTR_ERR(env);
@@ -1493,10 +1598,21 @@ static ssize_t ll_file_write_iter(struct kiocb *iocb, struct iov_iter *from)
args->u.normal.via_iter = from;
args->u.normal.via_iocb = iocb;
- result = ll_file_io_generic(env, args, iocb->ki_filp, CIT_WRITE,
+ rc_normal = ll_file_io_generic(env, args, iocb->ki_filp, CIT_WRITE,
&iocb->ki_pos, iov_iter_count(from));
+
+ /* On success, combine bytes written. */
+ if (rc_tiny >= 0 && rc_normal > 0)
+ rc_normal += rc_tiny;
+ /* On error, only return error from normal write if tiny write did not
+ * write any bytes. Otherwise return bytes written by tiny write.
+ */
+ else if (rc_tiny > 0)
+ rc_normal = rc_tiny;
+
cl_env_put(env, &refcheck);
- return result;
+out:
+ return rc_normal;
}
int ll_lov_setstripe_ea_info(struct inode *inode, struct dentry *dentry,
diff --git a/fs/lustre/llite/rw26.c b/fs/lustre/llite/rw26.c
index 37b6755..2baab10 100644
--- a/fs/lustre/llite/rw26.c
+++ b/fs/lustre/llite/rw26.c
@@ -443,13 +443,23 @@ static int ll_prepare_partial_page(const struct lu_env *env, struct cl_io *io,
return result;
}
+static int ll_tiny_write_begin(struct page *vmpage)
+{
+ /* Page must be present, up to date, dirty, and not in writeback. */
+ if (!vmpage || !PageUptodate(vmpage) || !PageDirty(vmpage) ||
+ PageWriteback(vmpage))
+ return -ENODATA;
+
+ return 0;
+}
+
static int ll_write_begin(struct file *file, struct address_space *mapping,
loff_t pos, unsigned int len, unsigned int flags,
struct page **pagep, void **fsdata)
{
- struct ll_cl_context *lcc;
+ struct ll_cl_context *lcc = NULL;
const struct lu_env *env = NULL;
- struct cl_io *io;
+ struct cl_io *io = NULL;
struct cl_page *page = NULL;
struct cl_object *clob = ll_i2info(mapping->host)->lli_clob;
pgoff_t index = pos >> PAGE_SHIFT;
@@ -462,8 +472,8 @@ static int ll_write_begin(struct file *file, struct address_space *mapping,
lcc = ll_cl_find(file);
if (!lcc) {
- io = NULL;
- result = -EIO;
+ vmpage = grab_cache_page_nowait(mapping, index);
+ result = ll_tiny_write_begin(vmpage);
goto out;
}
@@ -479,6 +489,7 @@ static int ll_write_begin(struct file *file, struct address_space *mapping,
result = -EBUSY;
goto out;
}
+
again:
/* To avoid deadlock, try to lock page first. */
vmpage = grab_cache_page_nowait(mapping, index);
@@ -544,7 +555,6 @@ static int ll_write_begin(struct file *file, struct address_space *mapping,
if (result == -EAGAIN)
goto again;
-
goto out;
}
}
@@ -555,6 +565,7 @@ static int ll_write_begin(struct file *file, struct address_space *mapping,
unlock_page(vmpage);
put_page(vmpage);
}
+ /* On tiny_write failure, page and io are always null. */
if (!IS_ERR_OR_NULL(page)) {
lu_ref_del(&page->cp_reference, "cl_io", io);
cl_page_put(env, page);
@@ -568,6 +579,45 @@ static int ll_write_begin(struct file *file, struct address_space *mapping,
return result;
}
+static int ll_tiny_write_end(struct file *file, struct address_space *mapping,
+ loff_t pos, unsigned int len, unsigned int copied,
+ struct page *vmpage)
+{
+ struct cl_page *clpage = (struct cl_page *) vmpage->private;
+ loff_t kms = pos+copied;
+ loff_t to = kms & (PAGE_SIZE-1) ? kms & (PAGE_SIZE-1) : PAGE_SIZE;
+ u16 refcheck;
+ struct lu_env *env = cl_env_get(&refcheck);
+ int rc = 0;
+
+ if (IS_ERR(env)) {
+ rc = PTR_ERR(env);
+ goto out;
+ }
+
+ /* This page is dirty in cache, so it should have a cl_page pointer
+ * set in vmpage->private.
+ */
+ LASSERT(clpage);
+
+ if (copied == 0)
+ goto out_env;
+
+ /* Update the underlying size information in the OSC/LOV objects this
+ * page is part of.
+ */
+ cl_page_touch(env, clpage, to);
+
+out_env:
+ cl_env_put(env, &refcheck);
+
+out:
+ /* Must return page unlocked. */
+ unlock_page(vmpage);
+
+ return rc;
+}
+
static int ll_write_end(struct file *file, struct address_space *mapping,
loff_t pos, unsigned int len, unsigned int copied,
struct page *vmpage, void *fsdata)
@@ -583,6 +633,14 @@ static int ll_write_end(struct file *file, struct address_space *mapping,
put_page(vmpage);
+ CDEBUG(D_VFSTRACE, "pos %llu, len %u, copied %u\n", pos, len, copied);
+
+ if (!lcc) {
+ result = ll_tiny_write_end(file, mapping, pos, len, copied,
+ vmpage);
+ goto out;
+ }
+
env = lcc->lcc_env;
page = lcc->lcc_page;
io = lcc->lcc_io;
@@ -632,6 +690,9 @@ static int ll_write_end(struct file *file, struct address_space *mapping,
if (result < 0)
io->ci_result = result;
+
+
+out:
return result >= 0 ? copied : result;
}
diff --git a/fs/lustre/obdclass/cl_page.c b/fs/lustre/obdclass/cl_page.c
index 8ea63f7..8dbd312 100644
--- a/fs/lustre/obdclass/cl_page.c
+++ b/fs/lustre/obdclass/cl_page.c
@@ -681,6 +681,19 @@ int cl_page_is_vmlocked(const struct lu_env *env, const struct cl_page *pg)
}
EXPORT_SYMBOL(cl_page_is_vmlocked);
+void cl_page_touch(const struct lu_env *env, const struct cl_page *pg,
+ size_t to)
+{
+ const struct cl_page_slice *slice;
+
+ list_for_each_entry(slice, &pg->cp_layers, cpl_linkage) {
+ if (slice->cpl_ops->cpo_page_touch)
+ (*slice->cpl_ops->cpo_page_touch)(env, slice, to);
+ }
+
+}
+EXPORT_SYMBOL(cl_page_touch);
+
static enum cl_page_state cl_req_type_state(enum cl_req_type crt)
{
return crt == CRT_WRITE ? CPS_PAGEOUT : CPS_PAGEIN;
diff --git a/fs/lustre/osc/osc_internal.h b/fs/lustre/osc/osc_internal.h
index 1194033..3ba209f 100644
--- a/fs/lustre/osc/osc_internal.h
+++ b/fs/lustre/osc/osc_internal.h
@@ -143,6 +143,8 @@ int osc_quotactl(struct obd_device *unused, struct obd_export *exp,
void osc_inc_unstable_pages(struct ptlrpc_request *req);
void osc_dec_unstable_pages(struct ptlrpc_request *req);
bool osc_over_unstable_soft_limit(struct client_obd *cli);
+void osc_page_touch_at(const struct lu_env *env, struct cl_object *obj,
+ pgoff_t idx, size_t to);
struct ldlm_lock *osc_obj_dlmlock_at_pgoff(const struct lu_env *env,
struct osc_object *obj,
diff --git a/fs/lustre/osc/osc_io.c b/fs/lustre/osc/osc_io.c
index d8fa8cc..98726cd 100644
--- a/fs/lustre/osc/osc_io.c
+++ b/fs/lustre/osc/osc_io.c
@@ -216,14 +216,13 @@ int osc_io_submit(const struct lu_env *env, const struct cl_io_slice *ios,
EXPORT_SYMBOL(osc_io_submit);
/**
- * This is called when a page is accessed within file in a way that creates
- * new page, if one were missing (i.e., if there were a hole at that place in
- * the file, or accessed page is beyond the current file size).
+ * This is called to update the attributes when modifying a specific page,
+ * both when making new pages and when doing updates to existing cached pages.
*
* Expand stripe KMS if necessary.
*/
-static void osc_page_touch_at(const struct lu_env *env,
- struct cl_object *obj, pgoff_t idx, size_t to)
+void osc_page_touch_at(const struct lu_env *env, struct cl_object *obj,
+ pgoff_t idx, size_t to)
{
struct lov_oinfo *loi = cl2osc(obj)->oo_oinfo;
struct cl_attr *attr = &osc_env_info(env)->oti_attr;
@@ -234,13 +233,6 @@ static void osc_page_touch_at(const struct lu_env *env,
kms = cl_offset(obj, idx) + to;
cl_object_attr_lock(obj);
- /*
- * XXX old code used
- *
- * ll_inode_size_lock(inode, 0); lov_stripe_lock(lsm);
- *
- * here
- */
CDEBUG(D_INODE, "stripe KMS %sincreasing %llu->%llu %llu\n",
kms > loi->loi_kms ? "" : "not ", loi->loi_kms, kms,
loi->loi_lvb.lvb_size);
diff --git a/fs/lustre/osc/osc_page.c b/fs/lustre/osc/osc_page.c
index 96d1385..731fd27 100644
--- a/fs/lustre/osc/osc_page.c
+++ b/fs/lustre/osc/osc_page.c
@@ -228,11 +228,21 @@ static int osc_page_flush(const struct lu_env *env,
return rc;
}
+static void osc_page_touch(const struct lu_env *env,
+ const struct cl_page_slice *slice, size_t to)
+{
+ struct osc_page *opg = cl2osc_page(slice);
+ struct cl_object *obj = opg->ops_cl.cpl_obj;
+
+ osc_page_touch_at(env, obj, osc_index(opg), to);
+}
+
static const struct cl_page_operations osc_page_ops = {
.cpo_print = osc_page_print,
.cpo_delete = osc_page_delete,
.cpo_clip = osc_page_clip,
- .cpo_flush = osc_page_flush
+ .cpo_flush = osc_page_flush,
+ .cpo_page_touch = osc_page_touch,
};
int osc_page_init(const struct lu_env *env, struct cl_object *obj,
--
1.8.3.1
next prev parent reply other threads:[~2019-09-30 18:56 UTC|newest]
Thread overview: 165+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-30 18:54 [lustre-devel] [PATCH 000/151] lustre: update to 2.11 support James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 001/151] lnet: fix needed headers for lnet headers James Simmons
2019-10-01 7:24 ` NeilBrown
2019-10-01 17:52 ` James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 002/151] lustre: fix signal handling in abortable waits James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 003/151] lnet: ksocklnd: add secondary IP address handling James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 004/151] lnet: o2iblnd: " James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 005/151] lnet: consoldate " James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 006/151] lustre: support for gcc8 James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 007/151] lnet: Allocate MEs and small MDs in own kmem_caches James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 008/151] lustre: seq: make seq_proc_write_common() safer James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 009/151] lustre: ptlrpc: Fix an rq_no_reply assertion failure James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 010/151] lustre: fld: resend seq lookup RPC if it is on LWP James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 011/151] lustre: fld: retry fld rpc even for ESHUTDOWN James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 012/151] lustre: fld: retry fld rpc until the import is closed James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 013/151] lustre: fld: fld client lookup should retry James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 014/151] lustre: ldlm: testcases for multiple modify RPCs feature James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 015/151] lustre: ldlm: Don't check opcode with NULL rq_reqmsg James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 016/151] lustre: all: remove all Sun license and URL references James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 017/151] lustre: ldlm: Use interval tree to update kms James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 018/151] lustre: osc: prepare OSC code to be used from MDC James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 019/151] lustre: statahead: support striped directory James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 020/151] lustre: readdir: improve striped readdir James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 021/151] lustre: llog: consolidate common error checking James Simmons
2019-10-01 1:29 ` NeilBrown
2019-10-01 17:51 ` James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 022/151] lustre: llite: NULL pointer dereference in cl_object_top() James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 023/151] lustre: ptlrpc: remove incorrect pid printing James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 024/151] lnet: Fix lost lock James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 025/151] lustre: llite: Reduce overhead for ll_do_fast_read James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 026/151] lustre: ptlrpc: change cr_sent_tv from timespec to ktime James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 027/151] lustre: ptlrpc: Use C99 initializer in ptlrpc_register_rqbd() James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 028/151] lustre: lmv: stripe dir page may be released mistakenly James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 029/151] lnet: selftest: Use C99 struct initializer in framework.c James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 030/151] lnet: fix memory leak and lnet_interfaces_max James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 031/151] lnet: decref on peer after use James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 032/151] lnet: rediscover peer if it changed James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 033/151] lnet: resolve unsafe list access James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 034/151] lustre: llite: Implement ladvise lockahead James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 035/151] lustre: jobstats: move jobstats code into separate file James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 036/151] lustre: ldlm: don't use jiffies as sysfs parameter James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 037/151] lnet: Handle ping buffer with only loopback NID James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 038/151] lustre: llite: enable readahead for small read_ahead_per_file James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 039/151] lnet: don't discover loopback interface James Simmons
2019-09-30 18:54 ` [lustre-devel] [PATCH 040/151] lnet: reduce logging severity James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 041/151] lustre: ptlrpc: migrate pinger to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 042/151] lustre: mdc: add cl_device to the MDC James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 043/151] lustre: lov: add MDT target to the LOV device James Simmons
2019-10-01 0:33 ` NeilBrown
2019-10-01 18:03 ` James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 044/151] lustre: mdt: IO request handling in MDT James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 045/151] lustre: osc: common client setup/cleanup James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 046/151] lustre: mdc: add IO methods to the MDC James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 047/151] lustre: lvbo: pass lock as parameter to lvbo_update() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 048/151] lustre: mds: add IO locking to the MDC and MDT James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 049/151] lustre: mdc: add IO stats in mdc James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 050/151] lustre: lov: add Data-on-MDT tests and fixes James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 051/151] lustre: mdc: use generic grant code at MDT James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 052/151] lustre: mds: combine DoM bit with other IBITS James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 053/151] lustre: llite: increase whole-file readahead to RPC size James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 054/151] lustre: ldlm: remove liblustre remnants James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 055/151] lustre: misc: replace LASSERT() with BUILD_BUG_ON() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 056/151] lustre: llite: check layout size after cl_object_layout_get James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 057/151] lustre: mdc: implement own mdc_io_fsync_start() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 058/151] lustre: ldlm: migrate the rest of the code to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 059/151] lustre: llite: sync bdi sysfs name with lustre sysfs tree James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 060/151] lustre: lov: allow lov.*.stripe{size, count}=-1 param James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 061/151] lustre: brw: add short io osc/ost transfer James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 062/151] lustre: lov: take lov layout lock for I/O with ignore_layout James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 063/151] lustre: lov: pack lsm_flags from layout James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 064/151] lustre: clio: introduce CIT_GLIMPSE for glimpse James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 065/151] lustre: flr: add infrastructure to create a new mirror James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 066/151] lustre: clio: no glimpse for data immutable file James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 067/151] lustre: flr: read support for flr James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 068/151] lustre: lov: rework write intent on componect instantiation James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 069/151] lustre: ptlrpc: use lu_extent in layout_intent James Simmons
2019-10-01 3:26 ` NeilBrown
2019-10-01 17:54 ` James Simmons
2019-10-01 23:19 ` NeilBrown
2019-10-04 20:39 ` Cory Spitz
2019-09-30 18:55 ` [lustre-devel] [PATCH 070/151] lustre: flr: Send write intent RPC to mdt James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 071/151] lustre: flr: extend DATA_VERSION API to read layout version James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 072/151] lustre: lov: skip empty pages in lov_io_submit() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 073/151] lustre: mdc: don't assert on name pack James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 074/151] lustre: flr: mirror read and write James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 075/151] lustre: flr: resync support and test tool James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 076/151] lustre: flr: randomize mirror pick James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 077/151] lustre: flr: instantiate component for truncate James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 078/151] lustre: hsm: don't release with wrong size James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 079/151] lustre: mdc: Add an additional set of 64 changelog flags James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 080/151] lustre: ldlm: assume OBD_CONNECT_IBITS James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 081/151] lustre: llite: assume OBD_CONNECT_ATTRFID James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 082/151] lustre: llite: simplify ll_inode_revalidate() James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 083/151] lustre: obd: free obd_svc_stats when all users are gone James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 084/151] lustre: mdc: add uid/gid to Changelogs entries James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 085/151] lustre: scrub: general framework for OI scrub James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 086/151] lustre: idl: clean up and document ptlrpc structures James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 087/151] lustre: idl: remove obsolete RPC MSG flags James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 088/151] lnet: libcfs: call proper crypto algo when keys are passed in James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 089/151] lustre: clio: remove unused cl_lock layers James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 090/151] lustre: sec: migrate to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 091/151] lustre: llite: avoid live-lock when concurrent mmap()s James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 092/151] lustre: llite: change lli_glimpse_time to ktime James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 093/151] lustre: hsm: filter kkuc write by client UUID James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 094/151] lustre: dne: allow mkdir with specific MDTs James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 095/151] lustre: misc: update Intel copyright messages for 2017 James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 096/151] lustre: fid: improve seq allocation error messages James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 097/151] lustre: mdc: interruptable during RPC retry for EINPROGRESS James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 098/151] lustre: osc: migrate to 64 bit time James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 099/151] lustre: vvp: Print discarded page warning on -EIO James Simmons
2019-09-30 18:55 ` [lustre-devel] [PATCH 100/151] lustre: clio: Use readahead for partial page write James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 101/151] lustre: flr: comp-flags support when creating mirrors James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 102/151] lustre: libcfs: remove cfs_time_XXX_64 wrappers James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 103/151] lustre: address issues raised by gcc7 James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 104/151] lustre: lov: fill no-extent fiemap on object with no stripe James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 105/151] lustre: ptlrpc: allow to limit number of service's rqbds James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 106/151] lnet: ensure peer put back on dc request queue James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 107/151] lustre: recovery: support setstripe replay James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 108/151] lustre: lustre: move LA_* flags to lustre_user.h James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 109/151] lustre: flr: revise lease API James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 110/151] lustre: idl: add PTLRPC definitions to enum James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 111/151] lustre: obd: remove s2dhms time function James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 112/151] lustre: mdc: add client NID to Changelogs entries James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 113/151] lustre: mdc: implement CL_OPEN for Changelogs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 114/151] lustre: acl: prepare small buffer for ACL RPC reply James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 115/151] lnet: safe access in debug print James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 116/151] lnet: Remove LASSERT on userspace data James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 117/151] lustre: flr: split a mirror from mirrored file James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 118/151] lustre: llite: deny 2.10 clients to open mirrored files James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 119/151] lustre: uapi: rename LCM_FL_NOT_FLR to LCM_FL_NONE James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 120/151] lustre: flr: layout truncate compatibility James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 121/151] lustre: mdc: high-priority request handling for DOM James Simmons
2019-09-30 18:56 ` James Simmons [this message]
2019-09-30 18:56 ` [lustre-devel] [PATCH 123/151] lustre: mdc: add CL_GETXATTR for Changelogs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 124/151] lustre: uapi: record denied OPEN in Changelogs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 125/151] lustre: llite: have ll_write_end to sync for DIO James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 126/151] lustre: obd: add check to obd_statfs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 127/151] lustre: obd: fix statfs handling James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 128/151] lustre: dom: support DATA_VERSION IO type James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 129/151] lnet: fix contiguous range support James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 130/151] lustre: osc: add a bit to indicate osc_page in cache tree James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 131/151] lustre: ldlm: fix export reference James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 132/151] lustre: llite: Add exit for filedata allocation failed James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 133/151] lustre: misc: Wrong checksum return value James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 134/151] lustre: llite: fix mount error handing James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 135/151] lustre: llite: Disable tiny writes for append James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 136/151] lustre: uapi: replace FMODE_{READ, WRITE} with MDS_* equivs James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 137/151] lnet: reduce discovery timeout James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 138/151] lustre: update version to 2.10.99 James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 139/151] lustre: ptlrpc: clarify 64 bit time usage James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 140/151] lustre: ptlrpc: add watchdog for ptlrpc service threads James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 141/151] lustre: handles: discard h_owner in favour of h_ops James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 142/151] lustre: ldlm: Remove use of SLAB_DESTROY_BY_RCU for ldlm lock slab James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 143/151] lustre: ldlm: simplify lock_mode_to_index() James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 144/151] lustre: ptlrpc: use list_move where appropriate James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 145/151] lustre: ptlrpc: simplify locking in ptlrpc_add_rqs_to_pool() James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 146/151] lustre: ptlrpc: incorporate BUILD_BUG_ON into ptlrpc_req_async_args() James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 147/151] lustre: introduce CONFIG_LUSTRE_FS_POSIX_ACL James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 148/151] lustre: ptlrpc: discard a server-only waitq James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 149/151] lustre: llite: remove // comments James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 150/151] lustre: remove outdated comments about ->ap_* functions James Simmons
2019-09-30 18:56 ` [lustre-devel] [PATCH 151/151] lustre: clean up some comment alignment James Simmons
2019-10-01 7:01 ` [lustre-devel] [PATCH 000/151] lustre: update to 2.11 support NeilBrown
2019-10-01 18:07 ` James Simmons
2019-10-02 0:52 ` NeilBrown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1569869810-23848-123-git-send-email-jsimmons@infradead.org \
--to=jsimmons@infradead.org \
--cc=lustre-devel@lists.lustre.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).