diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-21 15:38:28 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-21 15:38:28 -0400 |
| commit | 2017bd19454ea7cdae19922d15b6930f6c8088a2 (patch) | |
| tree | 53974657ab3a2c98f2da7b3fcb050ff5b697f876 /fs/ceph/caps.c | |
| parent | 9f1ad09493451c19d00c004da479acf699eeedd6 (diff) | |
| parent | efa4c1206eaff047c474af2136748a58eb8cc33b (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client: (22 commits)
ceph: do not carry i_lock for readdir from dcache
fs/ceph/xattr.c: Use kmemdup
rbd: passing wrong variable to bvec_kunmap_irq()
rbd: null vs ERR_PTR
ceph: fix num_pages_free accounting in pagelist
ceph: add CEPH_MDS_OP_SETDIRLAYOUT and associated ioctl.
ceph: don't crash when passed bad mount options
ceph: fix debugfs warnings
block: rbd: removing unnecessary test
block: rbd: fixed may leaks
ceph: switch from BKL to lock_flocks()
ceph: preallocate flock state without locks held
ceph: add pagelist_reserve, pagelist_truncate, pagelist_set_cursor
ceph: use mapping->nrpages to determine if mapping is empty
ceph: only invalidate on check_caps if we actually have pages
ceph: do not hide .snap in root directory
rbd: introduce rados block device (rbd), based on libceph
ceph: factor out libceph from Ceph file system
ceph-rbd: osdc support for osd call and rollback operations
ceph: messenger and osdc changes for rbd
...
Diffstat (limited to 'fs/ceph/caps.c')
| -rw-r--r-- | fs/ceph/caps.c | 50 |
1 files changed, 20 insertions, 30 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 5e9da996a151..98ab13e2b71d 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | #include "ceph_debug.h" | 1 | #include <linux/ceph/ceph_debug.h> |
| 2 | 2 | ||
| 3 | #include <linux/fs.h> | 3 | #include <linux/fs.h> |
| 4 | #include <linux/kernel.h> | 4 | #include <linux/kernel.h> |
| @@ -9,8 +9,9 @@ | |||
| 9 | #include <linux/writeback.h> | 9 | #include <linux/writeback.h> |
| 10 | 10 | ||
| 11 | #include "super.h" | 11 | #include "super.h" |
| 12 | #include "decode.h" | 12 | #include "mds_client.h" |
| 13 | #include "messenger.h" | 13 | #include <linux/ceph/decode.h> |
| 14 | #include <linux/ceph/messenger.h> | ||
| 14 | 15 | ||
| 15 | /* | 16 | /* |
| 16 | * Capability management | 17 | * Capability management |
| @@ -287,11 +288,11 @@ void ceph_put_cap(struct ceph_mds_client *mdsc, struct ceph_cap *cap) | |||
| 287 | spin_unlock(&mdsc->caps_list_lock); | 288 | spin_unlock(&mdsc->caps_list_lock); |
| 288 | } | 289 | } |
| 289 | 290 | ||
| 290 | void ceph_reservation_status(struct ceph_client *client, | 291 | void ceph_reservation_status(struct ceph_fs_client *fsc, |
| 291 | int *total, int *avail, int *used, int *reserved, | 292 | int *total, int *avail, int *used, int *reserved, |
| 292 | int *min) | 293 | int *min) |
| 293 | { | 294 | { |
| 294 | struct ceph_mds_client *mdsc = &client->mdsc; | 295 | struct ceph_mds_client *mdsc = fsc->mdsc; |
| 295 | 296 | ||
| 296 | if (total) | 297 | if (total) |
| 297 | *total = mdsc->caps_total_count; | 298 | *total = mdsc->caps_total_count; |
| @@ -399,7 +400,7 @@ static void __insert_cap_node(struct ceph_inode_info *ci, | |||
| 399 | static void __cap_set_timeouts(struct ceph_mds_client *mdsc, | 400 | static void __cap_set_timeouts(struct ceph_mds_client *mdsc, |
| 400 | struct ceph_inode_info *ci) | 401 | struct ceph_inode_info *ci) |
| 401 | { | 402 | { |
| 402 | struct ceph_mount_args *ma = mdsc->client->mount_args; | 403 | struct ceph_mount_options *ma = mdsc->fsc->mount_options; |
| 403 | 404 | ||
| 404 | ci->i_hold_caps_min = round_jiffies(jiffies + | 405 | ci->i_hold_caps_min = round_jiffies(jiffies + |
| 405 | ma->caps_wanted_delay_min * HZ); | 406 | ma->caps_wanted_delay_min * HZ); |
| @@ -515,7 +516,7 @@ int ceph_add_cap(struct inode *inode, | |||
| 515 | unsigned seq, unsigned mseq, u64 realmino, int flags, | 516 | unsigned seq, unsigned mseq, u64 realmino, int flags, |
| 516 | struct ceph_cap_reservation *caps_reservation) | 517 | struct ceph_cap_reservation *caps_reservation) |
| 517 | { | 518 | { |
| 518 | struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc; | 519 | struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; |
| 519 | struct ceph_inode_info *ci = ceph_inode(inode); | 520 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 520 | struct ceph_cap *new_cap = NULL; | 521 | struct ceph_cap *new_cap = NULL; |
| 521 | struct ceph_cap *cap; | 522 | struct ceph_cap *cap; |
| @@ -873,7 +874,7 @@ void __ceph_remove_cap(struct ceph_cap *cap) | |||
| 873 | struct ceph_mds_session *session = cap->session; | 874 | struct ceph_mds_session *session = cap->session; |
| 874 | struct ceph_inode_info *ci = cap->ci; | 875 | struct ceph_inode_info *ci = cap->ci; |
| 875 | struct ceph_mds_client *mdsc = | 876 | struct ceph_mds_client *mdsc = |
| 876 | &ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; | 877 | ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; |
| 877 | int removed = 0; | 878 | int removed = 0; |
| 878 | 879 | ||
| 879 | dout("__ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode); | 880 | dout("__ceph_remove_cap %p from %p\n", cap, &ci->vfs_inode); |
| @@ -1210,7 +1211,7 @@ void __ceph_flush_snaps(struct ceph_inode_info *ci, | |||
| 1210 | int mds; | 1211 | int mds; |
| 1211 | struct ceph_cap_snap *capsnap; | 1212 | struct ceph_cap_snap *capsnap; |
| 1212 | u32 mseq; | 1213 | u32 mseq; |
| 1213 | struct ceph_mds_client *mdsc = &ceph_inode_to_client(inode)->mdsc; | 1214 | struct ceph_mds_client *mdsc = ceph_inode_to_client(inode)->mdsc; |
| 1214 | struct ceph_mds_session *session = NULL; /* if session != NULL, we hold | 1215 | struct ceph_mds_session *session = NULL; /* if session != NULL, we hold |
| 1215 | session->s_mutex */ | 1216 | session->s_mutex */ |
| 1216 | u64 next_follows = 0; /* keep track of how far we've gotten through the | 1217 | u64 next_follows = 0; /* keep track of how far we've gotten through the |
| @@ -1336,7 +1337,7 @@ static void ceph_flush_snaps(struct ceph_inode_info *ci) | |||
| 1336 | void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | 1337 | void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) |
| 1337 | { | 1338 | { |
| 1338 | struct ceph_mds_client *mdsc = | 1339 | struct ceph_mds_client *mdsc = |
| 1339 | &ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; | 1340 | ceph_sb_to_client(ci->vfs_inode.i_sb)->mdsc; |
| 1340 | struct inode *inode = &ci->vfs_inode; | 1341 | struct inode *inode = &ci->vfs_inode; |
| 1341 | int was = ci->i_dirty_caps; | 1342 | int was = ci->i_dirty_caps; |
| 1342 | int dirty = 0; | 1343 | int dirty = 0; |
| @@ -1378,7 +1379,7 @@ void __ceph_mark_dirty_caps(struct ceph_inode_info *ci, int mask) | |||
| 1378 | static int __mark_caps_flushing(struct inode *inode, | 1379 | static int __mark_caps_flushing(struct inode *inode, |
| 1379 | struct ceph_mds_session *session) | 1380 | struct ceph_mds_session *session) |
| 1380 | { | 1381 | { |
| 1381 | struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc; | 1382 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
| 1382 | struct ceph_inode_info *ci = ceph_inode(inode); | 1383 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 1383 | int flushing; | 1384 | int flushing; |
| 1384 | 1385 | ||
| @@ -1416,17 +1417,6 @@ static int __mark_caps_flushing(struct inode *inode, | |||
| 1416 | /* | 1417 | /* |
| 1417 | * try to invalidate mapping pages without blocking. | 1418 | * try to invalidate mapping pages without blocking. |
| 1418 | */ | 1419 | */ |
| 1419 | static int mapping_is_empty(struct address_space *mapping) | ||
| 1420 | { | ||
| 1421 | struct page *page = find_get_page(mapping, 0); | ||
| 1422 | |||
| 1423 | if (!page) | ||
| 1424 | return 1; | ||
| 1425 | |||
| 1426 | put_page(page); | ||
| 1427 | return 0; | ||
| 1428 | } | ||
| 1429 | |||
| 1430 | static int try_nonblocking_invalidate(struct inode *inode) | 1420 | static int try_nonblocking_invalidate(struct inode *inode) |
| 1431 | { | 1421 | { |
| 1432 | struct ceph_inode_info *ci = ceph_inode(inode); | 1422 | struct ceph_inode_info *ci = ceph_inode(inode); |
| @@ -1436,7 +1426,7 @@ static int try_nonblocking_invalidate(struct inode *inode) | |||
| 1436 | invalidate_mapping_pages(&inode->i_data, 0, -1); | 1426 | invalidate_mapping_pages(&inode->i_data, 0, -1); |
| 1437 | spin_lock(&inode->i_lock); | 1427 | spin_lock(&inode->i_lock); |
| 1438 | 1428 | ||
| 1439 | if (mapping_is_empty(&inode->i_data) && | 1429 | if (inode->i_data.nrpages == 0 && |
| 1440 | invalidating_gen == ci->i_rdcache_gen) { | 1430 | invalidating_gen == ci->i_rdcache_gen) { |
| 1441 | /* success. */ | 1431 | /* success. */ |
| 1442 | dout("try_nonblocking_invalidate %p success\n", inode); | 1432 | dout("try_nonblocking_invalidate %p success\n", inode); |
| @@ -1462,8 +1452,8 @@ static int try_nonblocking_invalidate(struct inode *inode) | |||
| 1462 | void ceph_check_caps(struct ceph_inode_info *ci, int flags, | 1452 | void ceph_check_caps(struct ceph_inode_info *ci, int flags, |
| 1463 | struct ceph_mds_session *session) | 1453 | struct ceph_mds_session *session) |
| 1464 | { | 1454 | { |
| 1465 | struct ceph_client *client = ceph_inode_to_client(&ci->vfs_inode); | 1455 | struct ceph_fs_client *fsc = ceph_inode_to_client(&ci->vfs_inode); |
| 1466 | struct ceph_mds_client *mdsc = &client->mdsc; | 1456 | struct ceph_mds_client *mdsc = fsc->mdsc; |
| 1467 | struct inode *inode = &ci->vfs_inode; | 1457 | struct inode *inode = &ci->vfs_inode; |
| 1468 | struct ceph_cap *cap; | 1458 | struct ceph_cap *cap; |
| 1469 | int file_wanted, used; | 1459 | int file_wanted, used; |
| @@ -1533,7 +1523,7 @@ retry_locked: | |||
| 1533 | */ | 1523 | */ |
| 1534 | if ((!is_delayed || mdsc->stopping) && | 1524 | if ((!is_delayed || mdsc->stopping) && |
| 1535 | ci->i_wrbuffer_ref == 0 && /* no dirty pages... */ | 1525 | ci->i_wrbuffer_ref == 0 && /* no dirty pages... */ |
| 1536 | ci->i_rdcache_gen && /* may have cached pages */ | 1526 | inode->i_data.nrpages && /* have cached pages */ |
| 1537 | (file_wanted == 0 || /* no open files */ | 1527 | (file_wanted == 0 || /* no open files */ |
| 1538 | (revoking & (CEPH_CAP_FILE_CACHE| | 1528 | (revoking & (CEPH_CAP_FILE_CACHE| |
| 1539 | CEPH_CAP_FILE_LAZYIO))) && /* or revoking cache */ | 1529 | CEPH_CAP_FILE_LAZYIO))) && /* or revoking cache */ |
| @@ -1706,7 +1696,7 @@ ack: | |||
| 1706 | static int try_flush_caps(struct inode *inode, struct ceph_mds_session *session, | 1696 | static int try_flush_caps(struct inode *inode, struct ceph_mds_session *session, |
| 1707 | unsigned *flush_tid) | 1697 | unsigned *flush_tid) |
| 1708 | { | 1698 | { |
| 1709 | struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc; | 1699 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
| 1710 | struct ceph_inode_info *ci = ceph_inode(inode); | 1700 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 1711 | int unlock_session = session ? 0 : 1; | 1701 | int unlock_session = session ? 0 : 1; |
| 1712 | int flushing = 0; | 1702 | int flushing = 0; |
| @@ -1872,7 +1862,7 @@ int ceph_write_inode(struct inode *inode, struct writeback_control *wbc) | |||
| 1872 | caps_are_flushed(inode, flush_tid)); | 1862 | caps_are_flushed(inode, flush_tid)); |
| 1873 | } else { | 1863 | } else { |
| 1874 | struct ceph_mds_client *mdsc = | 1864 | struct ceph_mds_client *mdsc = |
| 1875 | &ceph_sb_to_client(inode->i_sb)->mdsc; | 1865 | ceph_sb_to_client(inode->i_sb)->mdsc; |
| 1876 | 1866 | ||
| 1877 | spin_lock(&inode->i_lock); | 1867 | spin_lock(&inode->i_lock); |
| 1878 | if (__ceph_caps_dirty(ci)) | 1868 | if (__ceph_caps_dirty(ci)) |
| @@ -2465,7 +2455,7 @@ static void handle_cap_flush_ack(struct inode *inode, u64 flush_tid, | |||
| 2465 | __releases(inode->i_lock) | 2455 | __releases(inode->i_lock) |
| 2466 | { | 2456 | { |
| 2467 | struct ceph_inode_info *ci = ceph_inode(inode); | 2457 | struct ceph_inode_info *ci = ceph_inode(inode); |
| 2468 | struct ceph_mds_client *mdsc = &ceph_sb_to_client(inode->i_sb)->mdsc; | 2458 | struct ceph_mds_client *mdsc = ceph_sb_to_client(inode->i_sb)->mdsc; |
| 2469 | unsigned seq = le32_to_cpu(m->seq); | 2459 | unsigned seq = le32_to_cpu(m->seq); |
| 2470 | int dirty = le32_to_cpu(m->dirty); | 2460 | int dirty = le32_to_cpu(m->dirty); |
| 2471 | int cleaned = 0; | 2461 | int cleaned = 0; |
| @@ -2713,7 +2703,7 @@ void ceph_handle_caps(struct ceph_mds_session *session, | |||
| 2713 | struct ceph_msg *msg) | 2703 | struct ceph_msg *msg) |
| 2714 | { | 2704 | { |
| 2715 | struct ceph_mds_client *mdsc = session->s_mdsc; | 2705 | struct ceph_mds_client *mdsc = session->s_mdsc; |
| 2716 | struct super_block *sb = mdsc->client->sb; | 2706 | struct super_block *sb = mdsc->fsc->sb; |
| 2717 | struct inode *inode; | 2707 | struct inode *inode; |
| 2718 | struct ceph_cap *cap; | 2708 | struct ceph_cap *cap; |
| 2719 | struct ceph_mds_caps *h; | 2709 | struct ceph_mds_caps *h; |
