Commit cdb897e3 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'ceph-for-4.14-rc1' of git://github.com/ceph/ceph-client

Pull ceph updates from Ilya Dryomov:
 "The highlights include:

   - a large series of fixes and improvements to the snapshot-handling
     code (Zheng Yan)

   - individual read/write OSD requests passed down to libceph are now
     limited to 16M in size to avoid hitting OSD-side limits (Zheng Yan)

   - encode MStatfs v2 message to allow for more accurate space usage
     reporting (Douglas Fuller)

   - switch to the new writeback error tracking infrastructure (Jeff
     Layton)"

* tag 'ceph-for-4.14-rc1' of git://github.com/ceph/ceph-client: (35 commits)
  ceph: stop on-going cached readdir if mds revokes FILE_SHARED cap
  ceph: wait on writeback after writing snapshot data
  ceph: fix capsnap dirty pages accounting
  ceph: ignore wbc->range_{start,end} when write back snapshot data
  ceph: fix "range cyclic" mode writepages
  ceph: cleanup local variables in ceph_writepages_start()
  ceph: optimize pagevec iterating in ceph_writepages_start()
  ceph: make writepage_nounlock() invalidate page that beyonds EOF
  ceph: properly get capsnap's size in get_oldest_context()
  ceph: remove stale check in ceph_invalidatepage()
  ceph: queue cap snap only when snap realm's context changes
  ceph: handle race between vmtruncate and queuing cap snap
  ceph: fix message order check in handle_cap_export()
  ceph: fix NULL pointer dereference in ceph_flush_snaps()
  ceph: adjust 36 checks for NULL pointers
  ceph: delete an unnecessary return statement in update_dentry_lease()
  ceph: ENOMEM pr_err in __get_or_create_frag() is redundant
  ceph: check negative offsets in ceph_llseek()
  ceph: more accurate statfs
  ceph: properly set snap follows for cap reconnect
  ...
parents b31ff3cd 15b51bd6
...@@ -3435,7 +3435,7 @@ static void rbd_acquire_lock(struct work_struct *work) ...@@ -3435,7 +3435,7 @@ static void rbd_acquire_lock(struct work_struct *work)
struct rbd_device *rbd_dev = container_of(to_delayed_work(work), struct rbd_device *rbd_dev = container_of(to_delayed_work(work),
struct rbd_device, lock_dwork); struct rbd_device, lock_dwork);
enum rbd_lock_state lock_state; enum rbd_lock_state lock_state;
int ret; int ret = 0;
dout("%s rbd_dev %p\n", __func__, rbd_dev); dout("%s rbd_dev %p\n", __func__, rbd_dev);
again: again:
......
This diff is collapsed.
...@@ -209,7 +209,7 @@ void ceph_fscache_register_inode_cookie(struct inode *inode) ...@@ -209,7 +209,7 @@ void ceph_fscache_register_inode_cookie(struct inode *inode)
struct ceph_fs_client *fsc = ceph_inode_to_client(inode); struct ceph_fs_client *fsc = ceph_inode_to_client(inode);
/* No caching for filesystem */ /* No caching for filesystem */
if (fsc->fscache == NULL) if (!fsc->fscache)
return; return;
/* Only cache for regular files that are read only */ /* Only cache for regular files that are read only */
......
...@@ -490,13 +490,14 @@ static void __check_cap_issue(struct ceph_inode_info *ci, struct ceph_cap *cap, ...@@ -490,13 +490,14 @@ static void __check_cap_issue(struct ceph_inode_info *ci, struct ceph_cap *cap,
} }
/* /*
* if we are newly issued FILE_SHARED, mark dir not complete; we * If FILE_SHARED is newly issued, mark dir not complete. We don't
* don't know what happened to this directory while we didn't * know what happened to this directory while we didn't have the cap.
* have the cap. * If FILE_SHARED is being revoked, also mark dir not complete. It
* stops on-going cached readdir.
*/ */
if ((issued & CEPH_CAP_FILE_SHARED) && if ((issued & CEPH_CAP_FILE_SHARED) != (had & CEPH_CAP_FILE_SHARED)) {
(had & CEPH_CAP_FILE_SHARED) == 0) { if (issued & CEPH_CAP_FILE_SHARED)
ci->i_shared_gen++; ci->i_shared_gen++;
if (S_ISDIR(ci->vfs_inode.i_mode)) { if (S_ISDIR(ci->vfs_inode.i_mode)) {
dout(" marking %p NOT complete\n", &ci->vfs_inode); dout(" marking %p NOT complete\n", &ci->vfs_inode);
__ceph_dir_clear_complete(ci); __ceph_dir_clear_complete(ci);
...@@ -611,7 +612,7 @@ void ceph_add_cap(struct inode *inode, ...@@ -611,7 +612,7 @@ void ceph_add_cap(struct inode *inode,
} }
if (flags & CEPH_CAP_FLAG_AUTH) { if (flags & CEPH_CAP_FLAG_AUTH) {
if (ci->i_auth_cap == NULL || if (!ci->i_auth_cap ||
ceph_seq_cmp(ci->i_auth_cap->mseq, mseq) < 0) { ceph_seq_cmp(ci->i_auth_cap->mseq, mseq) < 0) {
ci->i_auth_cap = cap; ci->i_auth_cap = cap;
cap->mds_wanted = wanted; cap->mds_wanted = wanted;
...@@ -728,7 +729,7 @@ static void __touch_cap(struct ceph_cap *cap) ...@@ -728,7 +729,7 @@ static void __touch_cap(struct ceph_cap *cap)
struct ceph_mds_session *s = cap->session; struct ceph_mds_session *s = cap->session;
spin_lock(&s->s_cap_lock); spin_lock(&s->s_cap_lock);
if (s->s_cap_iterator == NULL) { if (!s->s_cap_iterator) {
dout("__touch_cap %p cap %p mds%d\n", &cap->ci->vfs_inode, cap, dout("__touch_cap %p cap %p mds%d\n", &cap->ci->vfs_inode, cap,
s->s_mds); s->s_mds);
list_move_tail(&cap->session_caps, &s->s_caps); list_move_tail(&cap->session_caps, &s->s_caps);
...@@ -1248,7 +1249,10 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap, ...@@ -1248,7 +1249,10 @@ static int __send_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap,
arg.mode = inode->i_mode; arg.mode = inode->i_mode;
arg.inline_data = ci->i_inline_version != CEPH_INLINE_NONE; arg.inline_data = ci->i_inline_version != CEPH_INLINE_NONE;
arg.flags = 0; if (list_empty(&ci->i_cap_snaps))
arg.flags = CEPH_CLIENT_CAPS_NO_CAPSNAP;
else
arg.flags = CEPH_CLIENT_CAPS_PENDING_CAPSNAP;
if (sync) if (sync)
arg.flags |= CEPH_CLIENT_CAPS_SYNC; arg.flags |= CEPH_CLIENT_CAPS_SYNC;
...@@ -1454,13 +1458,19 @@ void ceph_flush_snaps(struct ceph_inode_info *ci, ...@@ -1454,13 +1458,19 @@ void ceph_flush_snaps(struct ceph_inode_info *ci,
goto retry; goto retry;
} }
// make sure flushsnap messages are sent in proper order.
if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
__kick_flushing_caps(mdsc, session, ci, 0);
ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
}
__ceph_flush_snaps(ci, session); __ceph_flush_snaps(ci, session);
out: out:
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
if (psession) { if (psession) {
*psession = session; *psession = session;
} else { } else if (session) {
mutex_unlock(&session->s_mutex); mutex_unlock(&session->s_mutex);
ceph_put_mds_session(session); ceph_put_mds_session(session);
} }
...@@ -1901,11 +1911,7 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags, ...@@ -1901,11 +1911,7 @@ void ceph_check_caps(struct ceph_inode_info *ci, int flags,
(ci->i_ceph_flags & (ci->i_ceph_flags &
(CEPH_I_KICK_FLUSH | CEPH_I_FLUSH_SNAPS))) { (CEPH_I_KICK_FLUSH | CEPH_I_FLUSH_SNAPS))) {
if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) { if (ci->i_ceph_flags & CEPH_I_KICK_FLUSH) {
spin_lock(&mdsc->cap_dirty_lock); __kick_flushing_caps(mdsc, session, ci, 0);
oldest_flush_tid = __get_oldest_flush_tid(mdsc);
spin_unlock(&mdsc->cap_dirty_lock);
__kick_flushing_caps(mdsc, session, ci,
oldest_flush_tid);
ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH; ci->i_ceph_flags &= ~CEPH_I_KICK_FLUSH;
} }
if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS) if (ci->i_ceph_flags & CEPH_I_FLUSH_SNAPS)
...@@ -2110,7 +2116,7 @@ int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync) ...@@ -2110,7 +2116,7 @@ int ceph_fsync(struct file *file, loff_t start, loff_t end, int datasync)
dout("fsync %p%s\n", inode, datasync ? " datasync" : ""); dout("fsync %p%s\n", inode, datasync ? " datasync" : "");
ret = filemap_write_and_wait_range(inode->i_mapping, start, end); ret = file_write_and_wait_range(file, start, end);
if (ret < 0) if (ret < 0)
goto out; goto out;
...@@ -3422,7 +3428,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex, ...@@ -3422,7 +3428,7 @@ static void handle_cap_export(struct inode *inode, struct ceph_mds_caps *ex,
tcap = __get_cap_for_mds(ci, target); tcap = __get_cap_for_mds(ci, target);
if (tcap) { if (tcap) {
/* already have caps from the target */ /* already have caps from the target */
if (tcap->cap_id != t_cap_id || if (tcap->cap_id == t_cap_id &&
ceph_seq_cmp(tcap->seq, t_seq) < 0) { ceph_seq_cmp(tcap->seq, t_seq) < 0) {
dout(" updating import cap %p mds%d\n", tcap, target); dout(" updating import cap %p mds%d\n", tcap, target);
tcap->cap_id = t_cap_id; tcap->cap_id = t_cap_id;
......
...@@ -24,7 +24,7 @@ static int mdsmap_show(struct seq_file *s, void *p) ...@@ -24,7 +24,7 @@ static int mdsmap_show(struct seq_file *s, void *p)
struct ceph_fs_client *fsc = s->private; struct ceph_fs_client *fsc = s->private;
struct ceph_mdsmap *mdsmap; struct ceph_mdsmap *mdsmap;
if (fsc->mdsc == NULL || fsc->mdsc->mdsmap == NULL) if (!fsc->mdsc || !fsc->mdsc->mdsmap)
return 0; return 0;
mdsmap = fsc->mdsc->mdsmap; mdsmap = fsc->mdsc->mdsmap;
seq_printf(s, "epoch %d\n", mdsmap->m_epoch); seq_printf(s, "epoch %d\n", mdsmap->m_epoch);
......
...@@ -377,8 +377,10 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx) ...@@ -377,8 +377,10 @@ static int ceph_readdir(struct file *file, struct dir_context *ctx)
} }
/* hints to request -> mds selection code */ /* hints to request -> mds selection code */
req->r_direct_mode = USE_AUTH_MDS; req->r_direct_mode = USE_AUTH_MDS;
req->r_direct_hash = ceph_frag_value(frag); if (op == CEPH_MDS_OP_READDIR) {
__set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags); req->r_direct_hash = ceph_frag_value(frag);
__set_bit(CEPH_MDS_R_DIRECT_IS_HASH, &req->r_req_flags);
}
if (fi->last_name) { if (fi->last_name) {
req->r_path2 = kstrdup(fi->last_name, GFP_KERNEL); req->r_path2 = kstrdup(fi->last_name, GFP_KERNEL);
if (!req->r_path2) { if (!req->r_path2) {
......
...@@ -175,7 +175,7 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode) ...@@ -175,7 +175,7 @@ static int ceph_init_file(struct inode *inode, struct file *file, int fmode)
dout("init_file %p %p 0%o (regular)\n", inode, file, dout("init_file %p %p 0%o (regular)\n", inode, file,
inode->i_mode); inode->i_mode);
cf = kmem_cache_zalloc(ceph_file_cachep, GFP_KERNEL); cf = kmem_cache_zalloc(ceph_file_cachep, GFP_KERNEL);
if (cf == NULL) { if (!cf) {
ceph_put_fmode(ceph_inode(inode), fmode); /* clean up */ ceph_put_fmode(ceph_inode(inode), fmode); /* clean up */
return -ENOMEM; return -ENOMEM;
} }
...@@ -562,8 +562,7 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to, ...@@ -562,8 +562,7 @@ static ssize_t ceph_sync_read(struct kiocb *iocb, struct iov_iter *to,
ssize_t ret; ssize_t ret;
size_t len = iov_iter_count(to); size_t len = iov_iter_count(to);
dout("sync_read on file %p %llu~%u %s\n", file, off, dout("sync_read on file %p %llu~%u %s\n", file, off, (unsigned)len,
(unsigned)len,
(file->f_flags & O_DIRECT) ? "O_DIRECT" : ""); (file->f_flags & O_DIRECT) ? "O_DIRECT" : "");
if (!len) if (!len)
...@@ -788,7 +787,7 @@ static void ceph_aio_retry_work(struct work_struct *work) ...@@ -788,7 +787,7 @@ static void ceph_aio_retry_work(struct work_struct *work)
goto out; goto out;
} }
req->r_flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE; req->r_flags = /* CEPH_OSD_FLAG_ORDERSNAP | */ CEPH_OSD_FLAG_WRITE;
ceph_oloc_copy(&req->r_base_oloc, &orig_req->r_base_oloc); ceph_oloc_copy(&req->r_base_oloc, &orig_req->r_base_oloc);
ceph_oid_copy(&req->r_base_oid, &orig_req->r_base_oid); ceph_oid_copy(&req->r_base_oid, &orig_req->r_base_oid);
...@@ -800,7 +799,6 @@ static void ceph_aio_retry_work(struct work_struct *work) ...@@ -800,7 +799,6 @@ static void ceph_aio_retry_work(struct work_struct *work)
} }
req->r_ops[0] = orig_req->r_ops[0]; req->r_ops[0] = orig_req->r_ops[0];
osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC, 0);
req->r_mtime = aio_req->mtime; req->r_mtime = aio_req->mtime;
req->r_data_offset = req->r_ops[0].extent.offset; req->r_data_offset = req->r_ops[0].extent.offset;
...@@ -847,8 +845,9 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, ...@@ -847,8 +845,9 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
if (write && ceph_snap(file_inode(file)) != CEPH_NOSNAP) if (write && ceph_snap(file_inode(file)) != CEPH_NOSNAP)
return -EROFS; return -EROFS;
dout("sync_direct_read_write (%s) on file %p %lld~%u\n", dout("sync_direct_%s on file %p %lld~%u snapc %p seq %lld\n",
(write ? "write" : "read"), file, pos, (unsigned)count); (write ? "write" : "read"), file, pos, (unsigned)count,
snapc, snapc->seq);
ret = filemap_write_and_wait_range(inode->i_mapping, pos, pos + count); ret = filemap_write_and_wait_range(inode->i_mapping, pos, pos + count);
if (ret < 0) if (ret < 0)
...@@ -861,7 +860,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, ...@@ -861,7 +860,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
if (ret2 < 0) if (ret2 < 0)
dout("invalidate_inode_pages2_range returned %d\n", ret2); dout("invalidate_inode_pages2_range returned %d\n", ret2);
flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE; flags = /* CEPH_OSD_FLAG_ORDERSNAP | */ CEPH_OSD_FLAG_WRITE;
} else { } else {
flags = CEPH_OSD_FLAG_READ; flags = CEPH_OSD_FLAG_READ;
} }
...@@ -874,8 +873,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, ...@@ -874,8 +873,7 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
vino = ceph_vino(inode); vino = ceph_vino(inode);
req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout, req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
vino, pos, &size, 0, vino, pos, &size, 0,
/*include a 'startsync' command*/ 1,
write ? 2 : 1,
write ? CEPH_OSD_OP_WRITE : write ? CEPH_OSD_OP_WRITE :
CEPH_OSD_OP_READ, CEPH_OSD_OP_READ,
flags, snapc, flags, snapc,
...@@ -887,6 +885,11 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, ...@@ -887,6 +885,11 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
break; break;
} }
if (write)
size = min_t(u64, size, fsc->mount_options->wsize);
else
size = min_t(u64, size, fsc->mount_options->rsize);
len = size; len = size;
pages = dio_get_pages_alloc(iter, len, &start, &num_pages); pages = dio_get_pages_alloc(iter, len, &start, &num_pages);
if (IS_ERR(pages)) { if (IS_ERR(pages)) {
...@@ -922,7 +925,6 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter, ...@@ -922,7 +925,6 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
truncate_inode_pages_range(inode->i_mapping, pos, truncate_inode_pages_range(inode->i_mapping, pos,
(pos+len) | (PAGE_SIZE - 1)); (pos+len) | (PAGE_SIZE - 1));
osd_req_op_init(req, 1, CEPH_OSD_OP_STARTSYNC, 0);
req->r_mtime = mtime; req->r_mtime = mtime;
} }
...@@ -1048,7 +1050,8 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos, ...@@ -1048,7 +1050,8 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
if (ceph_snap(file_inode(file)) != CEPH_NOSNAP) if (ceph_snap(file_inode(file)) != CEPH_NOSNAP)
return -EROFS; return -EROFS;
dout("sync_write on file %p %lld~%u\n", file, pos, (unsigned)count); dout("sync_write on file %p %lld~%u snapc %p seq %lld\n",
file, pos, (unsigned)count, snapc, snapc->seq);
ret = filemap_write_and_wait_range(inode->i_mapping, pos, pos + count); ret = filemap_write_and_wait_range(inode->i_mapping, pos, pos + count);
if (ret < 0) if (ret < 0)
...@@ -1060,7 +1063,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos, ...@@ -1060,7 +1063,7 @@ ceph_sync_write(struct kiocb *iocb, struct iov_iter *from, loff_t pos,
if (ret < 0) if (ret < 0)
dout("invalidate_inode_pages2_range returned %d\n", ret); dout("invalidate_inode_pages2_range returned %d\n", ret);
flags = CEPH_OSD_FLAG_ORDERSNAP | CEPH_OSD_FLAG_WRITE; flags = /* CEPH_OSD_FLAG_ORDERSNAP | */ CEPH_OSD_FLAG_WRITE;
while ((len = iov_iter_count(from)) > 0) { while ((len = iov_iter_count(from)) > 0) {
size_t left; size_t left;
...@@ -1307,6 +1310,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -1307,6 +1310,7 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
if (!prealloc_cf) if (!prealloc_cf)
return -ENOMEM; return -ENOMEM;
retry_snap:
inode_lock(inode); inode_lock(inode);
/* We can write back this queue in page reclaim */ /* We can write back this queue in page reclaim */
...@@ -1338,7 +1342,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -1338,7 +1342,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
goto out; goto out;
} }
retry_snap:
/* FIXME: not complete since it doesn't account for being at quota */ /* FIXME: not complete since it doesn't account for being at quota */
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL)) { if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_FULL)) {
err = -ENOSPC; err = -ENOSPC;
...@@ -1387,14 +1390,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -1387,14 +1390,6 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
&prealloc_cf); &prealloc_cf);
else else
written = ceph_sync_write(iocb, &data, pos, snapc); written = ceph_sync_write(iocb, &data, pos, snapc);
if (written == -EOLDSNAPC) {
dout("aio_write %p %llx.%llx %llu~%u"
"got EOLDSNAPC, retrying\n",
inode, ceph_vinop(inode),
pos, (unsigned)count);
inode_lock(inode);
goto retry_snap;
}
if (written > 0) if (written > 0)
iov_iter_advance(from, written); iov_iter_advance(from, written);
ceph_put_snap_context(snapc); ceph_put_snap_context(snapc);
...@@ -1428,10 +1423,15 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from) ...@@ -1428,10 +1423,15 @@ static ssize_t ceph_write_iter(struct kiocb *iocb, struct iov_iter *from)
ceph_cap_string(got)); ceph_cap_string(got));
ceph_put_cap_refs(ci, got); ceph_put_cap_refs(ci, got);
if (written == -EOLDSNAPC) {
dout("aio_write %p %llx.%llx %llu~%u" "got EOLDSNAPC, retrying\n",
inode, ceph_vinop(inode), pos, (unsigned)count);
goto retry_snap;
}
if (written >= 0) { if (written >= 0) {
if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_NEARFULL)) if (ceph_osdmap_flag(osdc, CEPH_OSDMAP_NEARFULL))
iocb->ki_flags |= IOCB_DSYNC; iocb->ki_flags |= IOCB_DSYNC;
written = generic_write_sync(iocb, written); written = generic_write_sync(iocb, written);
} }
...@@ -1481,13 +1481,13 @@ static loff_t ceph_llseek(struct file *file, loff_t offset, int whence) ...@@ -1481,13 +1481,13 @@ static loff_t ceph_llseek(struct file *file, loff_t offset, int whence)
offset += file->f_pos; offset += file->f_pos;
break; break;
case SEEK_DATA: case SEEK_DATA:
if (offset >= i_size) { if (offset < 0 || offset >= i_size) {
ret = -ENXIO; ret = -ENXIO;
goto out; goto out;
} }
break; break;
case SEEK_HOLE: case SEEK_HOLE:
if (offset >= i_size) { if (offset < 0 || offset >= i_size) {
ret = -ENXIO; ret = -ENXIO;
goto out; goto out;
} }
......
...@@ -52,7 +52,7 @@ struct inode *ceph_get_inode(struct super_block *sb, struct ceph_vino vino) ...@@ -52,7 +52,7 @@ struct inode *ceph_get_inode(struct super_block *sb, struct ceph_vino vino)
ino_t t = ceph_vino_to_ino(vino); ino_t t = ceph_vino_to_ino(vino);
inode = iget5_locked(sb, t, ceph_ino_compare, ceph_set_ino_cb, &vino); inode = iget5_locked(sb, t, ceph_ino_compare, ceph_set_ino_cb, &vino);
if (inode == NULL) if (!inode)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
if (inode->i_state & I_NEW) { if (inode->i_state & I_NEW) {
dout("get_inode created new inode %p %llx.%llx ino %llx\n", dout("get_inode created new inode %p %llx.%llx ino %llx\n",
...@@ -133,12 +133,9 @@ static struct ceph_inode_frag *__get_or_create_frag(struct ceph_inode_info *ci, ...@@ -133,12 +133,9 @@ static struct ceph_inode_frag *__get_or_create_frag(struct ceph_inode_info *ci,
} }
frag = kmalloc(sizeof(*frag), GFP_NOFS); frag = kmalloc(sizeof(*frag), GFP_NOFS);
if (!frag) { if (!frag)
pr_err("__get_or_create_frag ENOMEM on %p %llx.%llx "
"frag %x\n", &ci->vfs_inode,
ceph_vinop(&ci->vfs_inode), f);
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
}
frag->frag = f; frag->frag = f;
frag->split_by = 0; frag->split_by = 0;
frag->mds = -1; frag->mds = -1;
...@@ -1070,7 +1067,6 @@ static void update_dentry_lease(struct dentry *dentry, ...@@ -1070,7 +1067,6 @@ static void update_dentry_lease(struct dentry *dentry,
spin_unlock(&dentry->d_lock); spin_unlock(&dentry->d_lock);
if (old_lease_session) if (old_lease_session)
ceph_put_mds_session(old_lease_session); ceph_put_mds_session(old_lease_session);
return;
} }
/* /*
...@@ -1177,7 +1173,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req) ...@@ -1177,7 +1173,7 @@ int ceph_fill_trace(struct super_block *sb, struct ceph_mds_request *req)
dn = d_alloc(parent, &dname); dn = d_alloc(parent, &dname);
dout("d_alloc %p '%.*s' = %p\n", parent, dout("d_alloc %p '%.*s' = %p\n", parent,
dname.len, dname.name, dn); dname.len, dname.name, dn);
if (dn == NULL) { if (!dn) {
dput(parent); dput(parent);
err = -ENOMEM; err = -ENOMEM;
goto done; goto done;
...@@ -1477,7 +1473,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, ...@@ -1477,7 +1473,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
struct dentry *dn; struct dentry *dn;
struct inode *in; struct inode *in;
int err = 0, skipped = 0, ret, i; int err = 0, skipped = 0, ret, i;
struct inode *snapdir = NULL;
struct ceph_mds_request_head *rhead = req->r_request->front.iov_base; struct ceph_mds_request_head *rhead = req->r_request->front.iov_base;
u32 frag = le32_to_cpu(rhead->args.readdir.frag); u32 frag = le32_to_cpu(rhead->args.readdir.frag);
u32 last_hash = 0; u32 last_hash = 0;
...@@ -1510,8 +1505,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, ...@@ -1510,8 +1505,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
} }
if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) { if (le32_to_cpu(rinfo->head->op) == CEPH_MDS_OP_LSSNAP) {
snapdir = ceph_get_snapdir(d_inode(parent));
parent = d_find_alias(snapdir);
dout("readdir_prepopulate %d items under SNAPDIR dn %p\n", dout("readdir_prepopulate %d items under SNAPDIR dn %p\n",
rinfo->dir_nr, parent); rinfo->dir_nr, parent);
} else { } else {
...@@ -1519,15 +1512,18 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, ...@@ -1519,15 +1512,18 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
rinfo->dir_nr, parent); rinfo->dir_nr, parent);
if (rinfo->dir_dir) if (rinfo->dir_dir)
ceph_fill_dirfrag(d_inode(parent), rinfo->dir_dir); ceph_fill_dirfrag(d_inode(parent), rinfo->dir_dir);
}
if (ceph_frag_is_leftmost(frag) && req->r_readdir_offset == 2 && if (ceph_frag_is_leftmost(frag) &&
!(rinfo->hash_order && last_hash)) { req->r_readdir_offset == 2 &&
/* note dir version at start of readdir so we can tell !(rinfo->hash_order && last_hash)) {
* if any dentries get dropped */ /* note dir version at start of readdir so we can
req->r_dir_release_cnt = atomic64_read(&ci->i_release_count); * tell if any dentries get dropped */
req->r_dir_ordered_cnt = atomic64_read(&ci->i_ordered_count); req->r_dir_release_cnt =
req->r_readdir_cache_idx = 0; atomic64_read(&ci->i_release_count);
req->r_dir_ordered_cnt =
atomic64_read(&ci->i_ordered_count);
req->r_readdir_cache_idx = 0;
}
} }
cache_ctl.index = req->r_readdir_cache_idx; cache_ctl.index = req->r_readdir_cache_idx;
...@@ -1566,7 +1562,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, ...@@ -1566,7 +1562,7 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
dn = d_alloc(parent, &dname); dn = d_alloc(parent, &dname);
dout("d_alloc %p '%.*s' = %p\n", parent, dout("d_alloc %p '%.*s' = %p\n", parent,
dname.len, dname.name, dn); dname.len, dname.name, dn);
if (dn == NULL) { if (!dn) {
dout("d_alloc badness\n"); dout("d_alloc badness\n");
err = -ENOMEM; err = -ENOMEM;
goto out; goto out;
...@@ -1650,10 +1646,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req, ...@@ -1650,10 +1646,6 @@ int ceph_readdir_prepopulate(struct ceph_mds_request *req,
req->r_readdir_cache_idx = cache_ctl.index; req->r_readdir_cache_idx = cache_ctl.index;
} }
ceph_readdir_cache_release(&cache_ctl); ceph_readdir_cache_release(&cache_ctl);
if (snapdir) {
iput(snapdir);
dput(parent);
}
dout("readdir_prepopulate done\n"); dout("readdir_prepopulate done\n");
return err; return err;
} }
...@@ -1841,9 +1833,20 @@ void __ceph_do_pending_vmtruncate(struct inode *inode) ...@@ -1841,9 +1833,20 @@ void __ceph_do_pending_vmtruncate(struct inode *inode)
* possibly truncate them.. so write AND block! * possibly truncate them.. so write AND block!
*/ */
if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) { if (ci->i_wrbuffer_ref_head < ci->i_wrbuffer_ref) {
struct ceph_cap_snap *capsnap;
to = ci->i_truncate_size;
list_for_each_entry(capsnap, &ci->i_cap_snaps, ci_item) {
// MDS should have revoked Frw caps
WARN_ON_ONCE(capsnap->writing);
if (capsnap->dirty_pages && capsnap->size > to)
to = capsnap->size;
}
spin_unlock(&ci->i_ceph_lock);
dout("__do_pending_vmtruncate %p flushing snaps first\n", dout("__do_pending_vmtruncate %p flushing snaps first\n",
inode); inode);
spin_unlock(&ci->i_ceph_lock);
truncate_pagecache(inode, to);
filemap_write_and_wait_range(&inode->i_data, 0, filemap_write_and_wait_range(&inode->i_data, 0,
inode->i_sb->s_maxbytes); inode->i_sb->s_maxbytes);
goto retry; goto retry;
......
...@@ -408,7 +408,7 @@ struct ceph_mds_session *__ceph_lookup_mds_session(struct ceph_mds_client *mdsc, ...@@ -408,7 +408,7 @@ struct ceph_mds_session *__ceph_lookup_mds_session(struct ceph_mds_client *mdsc,
{ {
struct ceph_mds_session *session; struct ceph_mds_session *session;
if (mds >= mdsc->max_sessions || mdsc->sessions[mds] == NULL) if (mds >= mdsc->max_sessions || !mdsc->sessions[mds])
return NULL; return NULL;
session = mdsc->sessions[mds]; session = mdsc->sessions[mds];
dout("lookup_mds_session %p %d\n", session, dout("lookup_mds_session %p %d\n", session,
...@@ -483,7 +483,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc, ...@@ -483,7 +483,7 @@ static struct ceph_mds_session *register_session(struct ceph_mds_client *mdsc,
dout("register_session realloc to %d\n", newmax); dout("register_session realloc to %d\n", newmax);
sa = kcalloc(newmax, sizeof(void *), GFP_NOFS); sa = kcalloc(newmax, sizeof(void *), GFP_NOFS);
if (sa == NULL) if (!sa)
goto fail_realloc; goto fail_realloc;
if (mdsc->sessions) { if (mdsc->sessions) {
memcpy(sa, mdsc->sessions, memcpy(sa, mdsc->sessions,
...@@ -731,9 +731,16 @@ static int __choose_mds(struct ceph_mds_client *mdsc, ...@@ -731,9 +731,16 @@ static int __choose_mds(struct ceph_mds_client *mdsc,
inode = NULL; inode = NULL;
if (req->r_inode) { if (req->r_inode) {
inode = req->r_inode; if (ceph_snap(req->r_inode) != CEPH_SNAPDIR) {
ihold(inode); inode = req->r_inode;
} else if (req->r_dentry) { ihold(inode);
} else {
/* req->r_dentry is non-null for LSSNAP request.
* fall-thru */
WARN_ON_ONCE(!req->r_dentry);
}
}
if (!inode && req->r_dentry) {
/* ignore race with rename; old or new d_parent is okay */ /* ignore race with rename; old or new d_parent is okay */
struct dentry *parent; struct dentry *parent;
struct inode *dir; struct inode *dir;
...@@ -886,7 +893,7 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6 ...@@ -886,7 +893,7 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6
/* Calculate serialized length of metadata */ /* Calculate serialized length of metadata */
metadata_bytes = 4; /* map length */ metadata_bytes = 4; /* map length */
for (i = 0; metadata[i][0] != NULL; ++i) { for (i = 0; metadata[i][0]; ++i) {
metadata_bytes += 8 + strlen(metadata[i][0]) + metadata_bytes += 8 + strlen(metadata[i][0]) +
strlen(metadata[i][1]); strlen(metadata[i][1]);
metadata_key_count++; metadata_key_count++;
...@@ -919,7 +926,7 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6 ...@@ -919,7 +926,7 @@ static struct ceph_msg *create_session_open_msg(struct ceph_mds_client *mdsc, u6
ceph_encode_32(&p, metadata_key_count); ceph_encode_32(&p, metadata_key_count);
/* Two length-prefixed strings for each entry in the map */ /* Two length-prefixed strings for each entry in the map */
for (i = 0; metadata[i][0] != NULL; ++i) { for (i = 0; metadata[i][0]; ++i) {
size_t const key_len = strlen(metadata[i][0]); size_t const key_len = strlen(metadata[i][0]);
size_t const val_len = strlen(metadata[i][1]); size_t const val_len = strlen(metadata[i][1]);
...@@ -1122,7 +1129,7 @@ static int iterate_session_caps(struct ceph_mds_session *session, ...@@ -1122,7 +1129,7 @@ static int iterate_session_caps(struct ceph_mds_session *session,
spin_lock(&session->s_cap_lock); spin_lock(&session->s_cap_lock);
p = p->next; p = p->next;
if (cap->ci == NULL) { if (!cap->ci) {
dout("iterate_session_caps finishing cap %p removal\n", dout("iterate_session_caps finishing cap %p removal\n",
cap); cap);
BUG_ON(cap->session != session); BUG_ON(cap->session != session);
...@@ -1748,7 +1755,7 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base, ...@@ -1748,7 +1755,7 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
int len, pos; int len, pos;
unsigned seq; unsigned seq;
if (dentry == NULL) if (!dentry)
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
retry: retry:
...@@ -1771,7 +1778,7 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base, ...@@ -1771,7 +1778,7 @@ char *ceph_mdsc_build_path(struct dentry *dentry, int *plen, u64 *base,
len--; /* no leading '/' */ len--; /* no leading '/' */
path = kmalloc(len+1, GFP_NOFS); path = kmalloc(len+1, GFP_NOFS);
if (path == NULL) if (!path)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
pos = len; pos = len;
path[pos] = 0; /* trailing null */ path[pos] = 0; /* trailing null */
...@@ -2875,7 +2882,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap, ...@@ -2875,7 +2882,7 @@ static int encode_caps_cb(struct inode *inode, struct ceph_cap *cap,
} }
if (list_empty(&ci->i_cap_snaps)) { if (list_empty(&ci->i_cap_snaps)) {
snap_follows = 0; snap_follows = ci->i_head_snapc ? ci->i_head_snapc->seq : 0;
} else { } else {
struct ceph_cap_snap *capsnap = struct ceph_cap_snap *capsnap =
list_first_entry(&ci->i_cap_snaps, list_first_entry(&ci->i_cap_snaps,
...@@ -3133,7 +3140,7 @@ static void check_new_map(struct ceph_mds_client *mdsc, ...@@ -3133,7 +3140,7 @@ static void check_new_map(struct ceph_mds_client *mdsc,
newmap->m_epoch, oldmap->m_epoch); newmap->m_epoch, oldmap->m_epoch);
for (i = 0; i < oldmap->m_num_mds && i < mdsc->max_sessions; i++) { for (i = 0; i < oldmap->m_num_mds && i < mdsc->max_sessions; i++) {
if (mdsc->sessions[i] == NULL) if (!mdsc->sessions[i])
continue; continue;
s = mdsc->sessions[i]; s = mdsc->sessions[i];
oldstate = ceph_mdsmap_get_state(oldmap, i); oldstate = ceph_mdsmap_get_state(oldmap, i);
...@@ -3280,7 +3287,7 @@ static void handle_lease(struct ceph_mds_client *mdsc, ...@@ -3280,7 +3287,7 @@ static void handle_lease(struct ceph_mds_client *mdsc,
mutex_lock(&session->s_mutex); mutex_lock(&session->s_mutex);
session->s_seq++; session->s_seq++;
if (inode == NULL) { if (!inode) {
dout("handle_lease no inode %llx\n", vino.ino); dout("handle_lease no inode %llx\n", vino.ino);
goto release; goto release;
} }
...@@ -3438,7 +3445,7 @@ static void delayed_work(struct work_struct *work) ...@@ -3438,7 +3445,7 @@ static void delayed_work(struct work_struct *work)
for (i = 0; i < mdsc->max_sessions; i++) { for (i = 0; i < mdsc->max_sessions; i++) {
struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i); struct ceph_mds_session *s = __ceph_lookup_mds_session(mdsc, i);
if (s == NULL) if (!s)
continue; continue;
if (s->s_state == CEPH_MDS_SESSION_CLOSING) { if (s->s_state == CEPH_MDS_SESSION_CLOSING) {
dout("resending session close request for mds%d\n", dout("resending session close request for mds%d\n",
...@@ -3490,7 +3497,7 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc) ...@@ -3490,7 +3497,7 @@ int ceph_mdsc_init(struct ceph_fs_client *fsc)
fsc->mdsc = mdsc; fsc->mdsc = mdsc;
mutex_init(&mdsc->mutex); mutex_init(&mdsc->mutex);
mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS); mdsc->mdsmap = kzalloc(sizeof(*mdsc->mdsmap), GFP_NOFS);
if (mdsc->mdsmap == NULL) { if (!mdsc->mdsmap) {
kfree(mdsc); kfree(mdsc);
return -ENOMEM; return -ENOMEM;
} }
......
...@@ -112,7 +112,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end) ...@@ -112,7 +112,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
u16 mdsmap_ev; u16 mdsmap_ev;
m = kzalloc(sizeof(*m), GFP_NOFS); m = kzalloc(sizeof(*m), GFP_NOFS);
if (m == NULL) if (!m)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
ceph_decode_need(p, end, 1 + 1, bad); ceph_decode_need(p, end, 1 + 1, bad);
...@@ -138,7 +138,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end) ...@@ -138,7 +138,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
m->m_num_mds = m->m_max_mds; m->m_num_mds = m->m_max_mds;
m->m_info = kcalloc(m->m_num_mds, sizeof(*m->m_info), GFP_NOFS); m->m_info = kcalloc(m->m_num_mds, sizeof(*m->m_info), GFP_NOFS);
if (m->m_info == NULL) if (!m->m_info)
goto nomem; goto nomem;
/* pick out active nodes from mds_info (state > 0) */ /* pick out active nodes from mds_info (state > 0) */
...@@ -232,7 +232,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end) ...@@ -232,7 +232,7 @@ struct ceph_mdsmap *ceph_mdsmap_decode(void **p, void *end)
if (num_export_targets) { if (num_export_targets) {
info->export_targets = kcalloc(num_export_targets, info->export_targets = kcalloc(num_export_targets,
sizeof(u32), GFP_NOFS); sizeof(u32), GFP_NOFS);
if (info->export_targets == NULL) if (!info->export_targets)
goto nomem; goto nomem;
for (j = 0; j < num_export_targets; j++) for (j = 0; j < num_export_targets; j++)
info->export_targets[j] = info->export_targets[j] =
......
...@@ -299,7 +299,8 @@ static int cmpu64_rev(const void *a, const void *b) ...@@ -299,7 +299,8 @@ static int cmpu64_rev(const void *a, const void *b)
/* /*
* build the snap context for a given realm. * build the snap context for a given realm.
*/ */
static int build_snap_context(struct ceph_snap_realm *realm) static int build_snap_context(struct ceph_snap_realm *realm,
struct list_head* dirty_realms)
{ {
struct ceph_snap_realm *parent = realm->parent; struct ceph_snap_realm *parent = realm->parent;
struct ceph_snap_context *snapc; struct ceph_snap_context *snapc;
...@@ -313,7 +314,7 @@ static int build_snap_context(struct ceph_snap_realm *realm) ...@@ -313,7 +314,7 @@ static int build_snap_context(struct ceph_snap_realm *realm)
*/ */
if (parent) { if (parent) {
if (!parent->cached_context) { if (!parent->cached_context) {
err = build_snap_context(parent); err = build_snap_context(parent, dirty_realms);
if (err) if (err)
goto fail; goto fail;
} }
...@@ -332,7 +333,7 @@ static int build_snap_context(struct ceph_snap_realm *realm) ...@@ -332,7 +333,7 @@ static int build_snap_context(struct ceph_snap_realm *realm)
" (unchanged)\n", " (unchanged)\n",
realm->ino, realm, realm->cached_context, realm->ino, realm, realm->cached_context,
realm->cached_context->seq, realm->cached_context->seq,
(unsigned int) realm->cached_context->num_snaps); (unsigned int)realm->cached_context->num_snaps);
return 0; return 0;
} }
...@@ -373,7 +374,11 @@ static int build_snap_context(struct ceph_snap_realm *realm) ...@@ -373,7 +374,11 @@ static int build_snap_context(struct ceph_snap_realm *realm)
realm->ino, realm, snapc, snapc->seq, realm->ino, realm, snapc, snapc->seq,
(unsigned int) snapc->num_snaps); (unsigned int) snapc->num_snaps);
ceph_put_snap_context(realm->cached_context); if (realm->cached_context) {
ceph_put_snap_context(realm->cached_context);
/* queue realm for cap_snap creation */
list_add_tail(&realm->dirty_item, dirty_realms);
}
realm->cached_context = snapc; realm->cached_context = snapc;
return 0; return 0;
...@@ -394,15 +399,16 @@ static int build_snap_context(struct ceph_snap_realm *realm) ...@@ -394,15 +399,16 @@ static int build_snap_context(struct ceph_snap_realm *realm)
/* /*
* rebuild snap context for the given realm and all of its children. * rebuild snap context for the given realm and all of its children.
*/ */
static void rebuild_snap_realms(struct ceph_snap_realm *realm) static void rebuild_snap_realms(struct ceph_snap_realm *realm,
struct list_head *dirty_realms)
{ {
struct ceph_snap_realm *child; struct ceph_snap_realm *child;
dout("rebuild_snap_realms %llx %p\n", realm->ino, realm); dout("rebuild_snap_realms %llx %p\n", realm->ino, realm);
build_snap_context(realm); build_snap_context(realm, dirty_realms);
list_for_each_entry(child, &realm->children, child_item) list_for_each_entry(child, &realm->children, child_item)
rebuild_snap_realms(child); rebuild_snap_realms(child, dirty_realms);
} }
...@@ -624,13 +630,11 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm) ...@@ -624,13 +630,11 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
{ {
struct ceph_inode_info *ci; struct ceph_inode_info *ci;
struct inode *lastinode = NULL; struct inode *lastinode = NULL;
struct ceph_snap_realm *child;
dout("queue_realm_cap_snaps %p %llx inodes\n", realm, realm->ino); dout("queue_realm_cap_snaps %p %llx inodes\n", realm, realm->ino);
spin_lock(&realm->inodes_with_caps_lock); spin_lock(&realm->inodes_with_caps_lock);
list_for_each_entry(ci, &realm->inodes_with_caps, list_for_each_entry(ci, &realm->inodes_with_caps, i_snap_realm_item) {
i_snap_realm_item) {
struct inode *inode = igrab(&ci->vfs_inode); struct inode *inode = igrab(&ci->vfs_inode);
if (!inode) if (!inode)
continue; continue;
...@@ -643,14 +647,6 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm) ...@@ -643,14 +647,6 @@ static void queue_realm_cap_snaps(struct ceph_snap_realm *realm)
spin_unlock(&realm->inodes_with_caps_lock); spin_unlock(&realm->inodes_with_caps_lock);
iput(lastinode); iput(lastinode);
list_for_each_entry(child, &realm->children, child_item) {
dout("queue_realm_cap_snaps %p %llx queue child %p %llx\n",
realm, realm->ino, child, child->ino);
list_del_init(&child->dirty_item);
list_add(&child->dirty_item, &realm->dirty_item);
}
list_del_init(&realm->dirty_item);
dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino); dout("queue_realm_cap_snaps %p %llx done\n", realm, realm->ino);
} }
...@@ -721,8 +717,6 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, ...@@ -721,8 +717,6 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
if (err < 0) if (err < 0)
goto fail; goto fail;
/* queue realm for cap_snap creation */
list_add(&realm->dirty_item, &dirty_realms);
if (realm->seq > mdsc->last_snap_seq) if (realm->seq > mdsc->last_snap_seq)
mdsc->last_snap_seq = realm->seq; mdsc->last_snap_seq = realm->seq;
...@@ -741,7 +735,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, ...@@ -741,7 +735,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
/* invalidate when we reach the _end_ (root) of the trace */ /* invalidate when we reach the _end_ (root) of the trace */
if (invalidate && p >= e) if (invalidate && p >= e)
rebuild_snap_realms(realm); rebuild_snap_realms(realm, &dirty_realms);
if (!first_realm) if (!first_realm)
first_realm = realm; first_realm = realm;
...@@ -758,6 +752,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc, ...@@ -758,6 +752,7 @@ int ceph_update_snap_trace(struct ceph_mds_client *mdsc,
while (!list_empty(&dirty_realms)) { while (!list_empty(&dirty_realms)) {
realm = list_first_entry(&dirty_realms, struct ceph_snap_realm, realm = list_first_entry(&dirty_realms, struct ceph_snap_realm,
dirty_item); dirty_item);
list_del_init(&realm->dirty_item);
queue_realm_cap_snaps(realm); queue_realm_cap_snaps(realm);
} }
......
...@@ -49,9 +49,16 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf) ...@@ -49,9 +49,16 @@ static int ceph_statfs(struct dentry *dentry, struct kstatfs *buf)
struct ceph_statfs st; struct ceph_statfs st;
u64 fsid; u64 fsid;
int err; int err;
u64 data_pool;
if (fsc->mdsc->mdsmap->m_num_data_pg_pools == 1) {
data_pool = fsc->mdsc->mdsmap->m_data_pg_pools[0];
} else {
data_pool = CEPH_NOPOOL;
}
dout("statfs\n"); dout("statfs\n");
err = ceph_monc_do_statfs(&fsc->client->monc, &st); err = ceph_monc_do_statfs(&fsc->client->monc, data_pool, &st);
if (err < 0) if (err < 0)
return err; return err;
...@@ -113,7 +120,6 @@ enum { ...@@ -113,7 +120,6 @@ enum {
Opt_rasize, Opt_rasize,
Opt_caps_wanted_delay_min, Opt_caps_wanted_delay_min,
Opt_caps_wanted_delay_max, Opt_caps_wanted_delay_max,
Opt_cap_release_safety,
Opt_readdir_max_entries, Opt_readdir_max_entries,
Opt_readdir_max_bytes, Opt_readdir_max_bytes,
Opt_congestion_kb, Opt_congestion_kb,
...@@ -152,7 +158,6 @@ static match_table_t fsopt_tokens = { ...@@ -152,7 +158,6 @@ static match_table_t fsopt_tokens = {
{Opt_rasize, "rasize=%d"}, {Opt_rasize, "rasize=%d"},
{Opt_caps_wanted_delay_min, "caps_wanted_delay_min=%d"}, {Opt_caps_wanted_delay_min, "caps_wanted_delay_min=%d"},
{Opt_caps_wanted_delay_max, "caps_wanted_delay_max=%d"}, {Opt_caps_wanted_delay_max, "caps_wanted_delay_max=%d"},
{Opt_cap_release_safety, "cap_release_safety=%d"},
{Opt_readdir_max_entries, "readdir_max_entries=%d"}, {Opt_readdir_max_entries, "readdir_max_entries=%d"},
{Opt_readdir_max_bytes, "readdir_max_bytes=%d"}, {Opt_readdir_max_bytes, "readdir_max_bytes=%d"},
{Opt_congestion_kb, "write_congestion_kb=%d"}, {Opt_congestion_kb, "write_congestion_kb=%d"},
...@@ -235,27 +240,43 @@ static int parse_fsopt_token(char *c, void *private) ...@@ -235,27 +240,43 @@ static int parse_fsopt_token(char *c, void *private)
break; break;
/* misc */ /* misc */
case Opt_wsize: case Opt_wsize:
fsopt->wsize = intval; if (intval < PAGE_SIZE || intval > CEPH_MAX_WRITE_SIZE)
return -EINVAL;
fsopt->wsize = ALIGN(intval, PAGE_SIZE);
break; break;
case Opt_rsize: case Opt_rsize:
fsopt->rsize = intval; if (intval < PAGE_SIZE || intval > CEPH_MAX_READ_SIZE)
return -EINVAL;
fsopt->rsize = ALIGN(intval, PAGE_SIZE);
break; break;
case Opt_rasize: case Opt_rasize:
fsopt->rasize = intval; if (intval < 0)
return -EINVAL;
fsopt->rasize = ALIGN(intval + PAGE_SIZE - 1, PAGE_SIZE);
break; break;
case Opt_caps_wanted_delay_min: case Opt_caps_wanted_delay_min:
if (intval < 1)
return -EINVAL;
fsopt->caps_wanted_delay_min = intval; fsopt->caps_wanted_delay_min = intval;
break; break;
case Opt_caps_wanted_delay_max: case Opt_caps_wanted_delay_max:
if (intval < 1)
return -EINVAL;
fsopt->caps_wanted_delay_max = intval; fsopt->caps_wanted_delay_max = intval;
break; break;
case Opt_readdir_max_entries: case Opt_readdir_max_entries:
if (intval < 1)
return -EINVAL;
fsopt->max_readdir = intval; fsopt->max_readdir = intval;
break; break;
case Opt_readdir_max_bytes: case Opt_readdir_max_bytes:
if (intval < PAGE_SIZE && intval != 0)
return -EINVAL;
fsopt->max_readdir_bytes = intval; fsopt->max_readdir_bytes = intval;
break; break;
case Opt_congestion_kb: case Opt_congestion_kb:
if (intval < 1024) /* at least 1M */
return -EINVAL;
fsopt->congestion_kb = intval; fsopt->congestion_kb = intval;
break; break;
case Opt_dirstat: case Opt_dirstat:
...@@ -392,7 +413,8 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt, ...@@ -392,7 +413,8 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
fsopt->sb_flags = flags; fsopt->sb_flags = flags;
fsopt->flags = CEPH_MOUNT_OPT_DEFAULT; fsopt->flags = CEPH_MOUNT_OPT_DEFAULT;
fsopt->rsize = CEPH_RSIZE_DEFAULT; fsopt->wsize = CEPH_MAX_WRITE_SIZE;
fsopt->rsize = CEPH_MAX_READ_SIZE;
fsopt->rasize = CEPH_RASIZE_DEFAULT; fsopt->rasize = CEPH_RASIZE_DEFAULT;
fsopt->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL); fsopt->snapdir_name = kstrdup(CEPH_SNAPDIRNAME_DEFAULT, GFP_KERNEL);
if (!fsopt->snapdir_name) { if (!fsopt->snapdir_name) {
...@@ -402,7 +424,6 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt, ...@@ -402,7 +424,6 @@ static int parse_mount_options(struct ceph_mount_options **pfsopt,
fsopt->caps_wanted_delay_min = CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT; fsopt->caps_wanted_delay_min = CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT;
fsopt->caps_wanted_delay_max = CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT; fsopt->caps_wanted_delay_max = CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT;
fsopt->cap_release_safety = CEPH_CAP_RELEASE_SAFETY_DEFAULT;
fsopt->max_readdir = CEPH_MAX_READDIR_DEFAULT; fsopt->max_readdir = CEPH_MAX_READDIR_DEFAULT;
fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT; fsopt->max_readdir_bytes = CEPH_MAX_READDIR_BYTES_DEFAULT;
fsopt->congestion_kb = default_congestion_kb(); fsopt->congestion_kb = default_congestion_kb();
...@@ -508,7 +529,7 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) ...@@ -508,7 +529,7 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root)
seq_printf(m, ",mds_namespace=%s", fsopt->mds_namespace); seq_printf(m, ",mds_namespace=%s", fsopt->mds_namespace);
if (fsopt->wsize) if (fsopt->wsize)
seq_printf(m, ",wsize=%d", fsopt->wsize); seq_printf(m, ",wsize=%d", fsopt->wsize);
if (fsopt->rsize != CEPH_RSIZE_DEFAULT) if (fsopt->rsize != CEPH_MAX_READ_SIZE)
seq_printf(m, ",rsize=%d", fsopt->rsize); seq_printf(m, ",rsize=%d", fsopt->rsize);
if (fsopt->rasize != CEPH_RASIZE_DEFAULT) if (fsopt->rasize != CEPH_RASIZE_DEFAULT)
seq_printf(m, ",rasize=%d", fsopt->rasize); seq_printf(m, ",rasize=%d", fsopt->rasize);
...@@ -520,9 +541,6 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root) ...@@ -520,9 +541,6 @@ static int ceph_show_options(struct seq_file *m, struct dentry *root)
if (fsopt->caps_wanted_delay_max != CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT) if (fsopt->caps_wanted_delay_max != CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT)
seq_printf(m, ",caps_wanted_delay_max=%d", seq_printf(m, ",caps_wanted_delay_max=%d",
fsopt->caps_wanted_delay_max); fsopt->caps_wanted_delay_max);
if (fsopt->cap_release_safety != CEPH_CAP_RELEASE_SAFETY_DEFAULT)
seq_printf(m, ",cap_release_safety=%d",
fsopt->cap_release_safety);
if (fsopt->max_readdir != CEPH_MAX_READDIR_DEFAULT) if (fsopt->max_readdir != CEPH_MAX_READDIR_DEFAULT)
seq_printf(m, ",readdir_max_entries=%d", fsopt->max_readdir); seq_printf(m, ",readdir_max_entries=%d", fsopt->max_readdir);
if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT) if (fsopt->max_readdir_bytes != CEPH_MAX_READDIR_BYTES_DEFAULT)
...@@ -576,7 +594,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, ...@@ -576,7 +594,7 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
} }
fsc->client->extra_mon_dispatch = extra_mon_dispatch; fsc->client->extra_mon_dispatch = extra_mon_dispatch;
if (fsopt->mds_namespace == NULL) { if (!fsopt->mds_namespace) {
ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP, ceph_monc_want_map(&fsc->client->monc, CEPH_SUB_MDSMAP,
0, true); 0, true);
} else { } else {
...@@ -597,13 +615,13 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt, ...@@ -597,13 +615,13 @@ static struct ceph_fs_client *create_fs_client(struct ceph_mount_options *fsopt,
* to be processed in parallel, limit concurrency. * to be processed in parallel, limit concurrency.
*/ */
fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1); fsc->wb_wq = alloc_workqueue("ceph-writeback", 0, 1);
if (fsc->wb_wq == NULL) if (!fsc->wb_wq)
goto fail_client; goto fail_client;
fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1); fsc->pg_inv_wq = alloc_workqueue("ceph-pg-invalid", 0, 1);
if (fsc->pg_inv_wq == NULL) if (!fsc->pg_inv_wq)
goto fail_wb_wq; goto fail_wb_wq;
fsc->trunc_wq = alloc_workqueue("ceph-trunc", 0, 1); fsc->trunc_wq = alloc_workqueue("ceph-trunc", 0, 1);
if (fsc->trunc_wq == NULL) if (!fsc->trunc_wq)
goto fail_pg_inv_wq; goto fail_pg_inv_wq;
/* set up mempools */ /* set up mempools */
...@@ -674,26 +692,26 @@ static int __init init_caches(void) ...@@ -674,26 +692,26 @@ static int __init init_caches(void)
__alignof__(struct ceph_inode_info), __alignof__(struct ceph_inode_info),
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD| SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD|
SLAB_ACCOUNT, ceph_inode_init_once); SLAB_ACCOUNT, ceph_inode_init_once);
if (ceph_inode_cachep == NULL) if (!ceph_inode_cachep)
return -ENOMEM; return -ENOMEM;
ceph_cap_cachep = KMEM_CACHE(ceph_cap, ceph_cap_cachep = KMEM_CACHE(ceph_cap,
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD); SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
if (ceph_cap_cachep == NULL) if (!ceph_cap_cachep)
goto bad_cap; goto bad_cap;
ceph_cap_flush_cachep = KMEM_CACHE(ceph_cap_flush, ceph_cap_flush_cachep = KMEM_CACHE(ceph_cap_flush,
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD); SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
if (ceph_cap_flush_cachep == NULL) if (!ceph_cap_flush_cachep)
goto bad_cap_flush; goto bad_cap_flush;
ceph_dentry_cachep = KMEM_CACHE(ceph_dentry_info, ceph_dentry_cachep = KMEM_CACHE(ceph_dentry_info,
SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD); SLAB_RECLAIM_ACCOUNT|SLAB_MEM_SPREAD);
if (ceph_dentry_cachep == NULL) if (!ceph_dentry_cachep)
goto bad_dentry; goto bad_dentry;
ceph_file_cachep = KMEM_CACHE(ceph_file_info, SLAB_MEM_SPREAD); ceph_file_cachep = KMEM_CACHE(ceph_file_info, SLAB_MEM_SPREAD);
if (ceph_file_cachep == NULL) if (!ceph_file_cachep)
goto bad_file; goto bad_file;
if ((error = ceph_fscache_register())) if ((error = ceph_fscache_register()))
...@@ -947,20 +965,10 @@ static int ceph_setup_bdi(struct super_block *sb, struct ceph_fs_client *fsc) ...@@ -947,20 +965,10 @@ static int ceph_setup_bdi(struct super_block *sb, struct ceph_fs_client *fsc)
return err; return err;
/* set ra_pages based on rasize mount option? */ /* set ra_pages based on rasize mount option? */
if (fsc->mount_options->rasize >= PAGE_SIZE) sb->s_bdi->ra_pages = fsc->mount_options->rasize >> PAGE_SHIFT;
sb->s_bdi->ra_pages =
(fsc->mount_options->rasize + PAGE_SIZE - 1) /* set io_pages based on max osd read size */
>> PAGE_SHIFT; sb->s_bdi->io_pages = fsc->mount_options->rsize >> PAGE_SHIFT;
else
sb->s_bdi->ra_pages = VM_MAX_READAHEAD * 1024 / PAGE_SIZE;
if (fsc->mount_options->rsize > fsc->mount_options->rasize &&
fsc->mount_options->rsize >= PAGE_SIZE)
sb->s_bdi->io_pages =
(fsc->mount_options->rsize + PAGE_SIZE - 1)
>> PAGE_SHIFT;
else if (fsc->mount_options->rsize == 0)
sb->s_bdi->io_pages = ULONG_MAX;
return 0; return 0;
} }
......
...@@ -46,12 +46,25 @@ ...@@ -46,12 +46,25 @@
#define ceph_test_mount_opt(fsc, opt) \ #define ceph_test_mount_opt(fsc, opt) \
(!!((fsc)->mount_options->flags & CEPH_MOUNT_OPT_##opt)) (!!((fsc)->mount_options->flags & CEPH_MOUNT_OPT_##opt))
#define CEPH_RSIZE_DEFAULT (64*1024*1024) /* max read size */ /* max size of osd read request, limited by libceph */
#define CEPH_MAX_READ_SIZE CEPH_MSG_MAX_DATA_LEN
/* osd has a configurable limitaion of max write size.
* CEPH_MSG_MAX_DATA_LEN should be small enough. */
#define CEPH_MAX_WRITE_SIZE CEPH_MSG_MAX_DATA_LEN
#define CEPH_RASIZE_DEFAULT (8192*1024) /* max readahead */ #define CEPH_RASIZE_DEFAULT (8192*1024) /* max readahead */
#define CEPH_MAX_READDIR_DEFAULT 1024 #define CEPH_MAX_READDIR_DEFAULT 1024
#define CEPH_MAX_READDIR_BYTES_DEFAULT (512*1024) #define CEPH_MAX_READDIR_BYTES_DEFAULT (512*1024)
#define CEPH_SNAPDIRNAME_DEFAULT ".snap" #define CEPH_SNAPDIRNAME_DEFAULT ".snap"
/*
* Delay telling the MDS we no longer want caps, in case we reopen
* the file. Delay a minimum amount of time, even if we send a cap
* message for some other reason. Otherwise, take the oppotunity to
* update the mds to avoid sending another message later.
*/
#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */
#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */
struct ceph_mount_options { struct ceph_mount_options {
int flags; int flags;
int sb_flags; int sb_flags;
...@@ -61,7 +74,6 @@ struct ceph_mount_options { ...@@ -61,7 +74,6 @@ struct ceph_mount_options {
int rasize; /* max readahead */ int rasize; /* max readahead */
int congestion_kb; /* max writeback in flight */ int congestion_kb; /* max writeback in flight */
int caps_wanted_delay_min, caps_wanted_delay_max; int caps_wanted_delay_min, caps_wanted_delay_max;
int cap_release_safety;
int max_readdir; /* max readdir result (entires) */ int max_readdir; /* max readdir result (entires) */
int max_readdir_bytes; /* max readdir result (bytes) */ int max_readdir_bytes; /* max readdir result (bytes) */
......
...@@ -777,7 +777,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, ...@@ -777,7 +777,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
spin_unlock(&ci->i_ceph_lock); spin_unlock(&ci->i_ceph_lock);
/* security module gets xattr while filling trace */ /* security module gets xattr while filling trace */
if (current->journal_info != NULL) { if (current->journal_info) {
pr_warn_ratelimited("sync getxattr %p " pr_warn_ratelimited("sync getxattr %p "
"during filling trace\n", inode); "during filling trace\n", inode);
return -EBUSY; return -EBUSY;
...@@ -809,7 +809,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value, ...@@ -809,7 +809,7 @@ ssize_t __ceph_getxattr(struct inode *inode, const char *name, void *value,
memcpy(value, xattr->val, xattr->val_len); memcpy(value, xattr->val, xattr->val_len);
if (current->journal_info != NULL && if (current->journal_info &&
!strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN)) !strncmp(name, XATTR_SECURITY_PREFIX, XATTR_SECURITY_PREFIX_LEN))
ci->i_ceph_flags |= CEPH_I_SEC_INITED; ci->i_ceph_flags |= CEPH_I_SEC_INITED;
out: out:
...@@ -1058,7 +1058,7 @@ int __ceph_setxattr(struct inode *inode, const char *name, ...@@ -1058,7 +1058,7 @@ int __ceph_setxattr(struct inode *inode, const char *name,
up_read(&mdsc->snap_rwsem); up_read(&mdsc->snap_rwsem);
/* security module set xattr while filling trace */ /* security module set xattr while filling trace */
if (current->journal_info != NULL) { if (current->journal_info) {
pr_warn_ratelimited("sync setxattr %p " pr_warn_ratelimited("sync setxattr %p "
"during filling trace\n", inode); "during filling trace\n", inode);
err = -EBUSY; err = -EBUSY;
...@@ -1108,7 +1108,7 @@ bool ceph_security_xattr_deadlock(struct inode *in) ...@@ -1108,7 +1108,7 @@ bool ceph_security_xattr_deadlock(struct inode *in)
{ {
struct ceph_inode_info *ci; struct ceph_inode_info *ci;
bool ret; bool ret;
if (in->i_security == NULL) if (!in->i_security)
return false; return false;
ci = ceph_inode(in); ci = ceph_inode(in);
spin_lock(&ci->i_ceph_lock); spin_lock(&ci->i_ceph_lock);
......
...@@ -167,6 +167,8 @@ struct ceph_mon_request_header { ...@@ -167,6 +167,8 @@ struct ceph_mon_request_header {
struct ceph_mon_statfs { struct ceph_mon_statfs {
struct ceph_mon_request_header monhdr; struct ceph_mon_request_header monhdr;
struct ceph_fsid fsid; struct ceph_fsid fsid;
__u8 contains_data_pool;
__le64 data_pool;
} __attribute__ ((packed)); } __attribute__ ((packed));
struct ceph_statfs { struct ceph_statfs {
...@@ -669,7 +671,9 @@ enum { ...@@ -669,7 +671,9 @@ enum {
extern const char *ceph_cap_op_name(int op); extern const char *ceph_cap_op_name(int op);
/* flags field in client cap messages (version >= 10) */ /* flags field in client cap messages (version >= 10) */
#define CEPH_CLIENT_CAPS_SYNC (0x1) #define CEPH_CLIENT_CAPS_SYNC (1<<0)
#define CEPH_CLIENT_CAPS_NO_CAPSNAP (1<<1)
#define CEPH_CLIENT_CAPS_PENDING_CAPSNAP (1<<2);
/* /*
* caps message, used for capability callbacks, acks, requests, etc. * caps message, used for capability callbacks, acks, requests, etc.
......
...@@ -84,17 +84,6 @@ struct ceph_options { ...@@ -84,17 +84,6 @@ struct ceph_options {
#define CEPH_AUTH_NAME_DEFAULT "guest" #define CEPH_AUTH_NAME_DEFAULT "guest"
/*
* Delay telling the MDS we no longer want caps, in case we reopen
* the file. Delay a minimum amount of time, even if we send a cap
* message for some other reason. Otherwise, take the oppotunity to
* update the mds to avoid sending another message later.
*/
#define CEPH_CAPS_WANTED_DELAY_MIN_DEFAULT 5 /* cap release delay */
#define CEPH_CAPS_WANTED_DELAY_MAX_DEFAULT 60 /* cap release delay */
#define CEPH_CAP_RELEASE_SAFETY_DEFAULT (CEPH_CAPS_PER_RELEASE * 4)
/* mount state */ /* mount state */
enum { enum {
CEPH_MOUNT_MOUNTING, CEPH_MOUNT_MOUNTING,
......
...@@ -133,8 +133,8 @@ void ceph_monc_renew_subs(struct ceph_mon_client *monc); ...@@ -133,8 +133,8 @@ void ceph_monc_renew_subs(struct ceph_mon_client *monc);
extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch, extern int ceph_monc_wait_osdmap(struct ceph_mon_client *monc, u32 epoch,
unsigned long timeout); unsigned long timeout);
extern int ceph_monc_do_statfs(struct ceph_mon_client *monc, int ceph_monc_do_statfs(struct ceph_mon_client *monc, u64 data_pool,
struct ceph_statfs *buf); struct ceph_statfs *buf);
int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what, int ceph_monc_get_version(struct ceph_mon_client *monc, const char *what,
u64 *newest); u64 *newest);
......
...@@ -230,7 +230,6 @@ extern const char *ceph_osd_state_name(int s); ...@@ -230,7 +230,6 @@ extern const char *ceph_osd_state_name(int s);
\ \
/* fancy write */ \ /* fancy write */ \
f(APPEND, __CEPH_OSD_OP(WR, DATA, 6), "append") \ f(APPEND, __CEPH_OSD_OP(WR, DATA, 6), "append") \
f(STARTSYNC, __CEPH_OSD_OP(WR, DATA, 7), "startsync") \
f(SETTRUNC, __CEPH_OSD_OP(WR, DATA, 8), "settrunc") \ f(SETTRUNC, __CEPH_OSD_OP(WR, DATA, 8), "settrunc") \
f(TRIMTRUNC, __CEPH_OSD_OP(WR, DATA, 9), "trimtrunc") \ f(TRIMTRUNC, __CEPH_OSD_OP(WR, DATA, 9), "trimtrunc") \
\ \
......
...@@ -676,7 +676,8 @@ static void handle_statfs_reply(struct ceph_mon_client *monc, ...@@ -676,7 +676,8 @@ static void handle_statfs_reply(struct ceph_mon_client *monc,
/* /*
* Do a synchronous statfs(). * Do a synchronous statfs().
*/ */
int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf) int ceph_monc_do_statfs(struct ceph_mon_client *monc, u64 data_pool,
struct ceph_statfs *buf)
{ {
struct ceph_mon_generic_request *req; struct ceph_mon_generic_request *req;
struct ceph_mon_statfs *h; struct ceph_mon_statfs *h;
...@@ -696,6 +697,7 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf) ...@@ -696,6 +697,7 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
goto out; goto out;
req->u.st = buf; req->u.st = buf;
req->request->hdr.version = cpu_to_le16(2);
mutex_lock(&monc->mutex); mutex_lock(&monc->mutex);
register_generic_request(req); register_generic_request(req);
...@@ -705,6 +707,8 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf) ...@@ -705,6 +707,8 @@ int ceph_monc_do_statfs(struct ceph_mon_client *monc, struct ceph_statfs *buf)
h->monhdr.session_mon = cpu_to_le16(-1); h->monhdr.session_mon = cpu_to_le16(-1);
h->monhdr.session_mon_tid = 0; h->monhdr.session_mon_tid = 0;
h->fsid = monc->monmap->fsid; h->fsid = monc->monmap->fsid;
h->contains_data_pool = (data_pool != CEPH_NOPOOL);
h->data_pool = cpu_to_le64(data_pool);
send_generic_request(monc, req); send_generic_request(monc, req);
mutex_unlock(&monc->mutex); mutex_unlock(&monc->mutex);
......
...@@ -863,8 +863,6 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst, ...@@ -863,8 +863,6 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst,
dst->cls.method_len = src->cls.method_len; dst->cls.method_len = src->cls.method_len;
dst->cls.indata_len = cpu_to_le32(src->cls.indata_len); dst->cls.indata_len = cpu_to_le32(src->cls.indata_len);
break; break;
case CEPH_OSD_OP_STARTSYNC:
break;
case CEPH_OSD_OP_WATCH: case CEPH_OSD_OP_WATCH:
dst->watch.cookie = cpu_to_le64(src->watch.cookie); dst->watch.cookie = cpu_to_le64(src->watch.cookie);
dst->watch.ver = cpu_to_le64(0); dst->watch.ver = cpu_to_le64(0);
...@@ -916,9 +914,6 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst, ...@@ -916,9 +914,6 @@ static u32 osd_req_encode_op(struct ceph_osd_op *dst,
* if the file was recently truncated, we include information about its * if the file was recently truncated, we include information about its
* old and new size so that the object can be updated appropriately. (we * old and new size so that the object can be updated appropriately. (we
* avoid synchronously deleting truncated objects because it's slow.) * avoid synchronously deleting truncated objects because it's slow.)
*
* if @do_sync, include a 'startsync' command so that the osd will flush
* data quickly.
*/ */
struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc, struct ceph_osd_request *ceph_osdc_new_request(struct ceph_osd_client *osdc,
struct ceph_file_layout *layout, struct ceph_file_layout *layout,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment