aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/ceph/mds_client.c6
-rw-r--r--fs/devpts/inode.c100
-rw-r--r--fs/ocfs2/dlm/dlmmaster.c2
-rw-r--r--fs/proc/task_mmu.c33
4 files changed, 69 insertions, 72 deletions
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 541ead4d8965..85b8517f17a0 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -386,9 +386,7 @@ void ceph_put_mds_session(struct ceph_mds_session *s)
386 atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1); 386 atomic_read(&s->s_ref), atomic_read(&s->s_ref)-1);
387 if (atomic_dec_and_test(&s->s_ref)) { 387 if (atomic_dec_and_test(&s->s_ref)) {
388 if (s->s_auth.authorizer) 388 if (s->s_auth.authorizer)
389 ceph_auth_destroy_authorizer( 389 ceph_auth_destroy_authorizer(s->s_auth.authorizer);
390 s->s_mdsc->fsc->client->monc.auth,
391 s->s_auth.authorizer);
392 kfree(s); 390 kfree(s);
393 } 391 }
394} 392}
@@ -3900,7 +3898,7 @@ static struct ceph_auth_handshake *get_authorizer(struct ceph_connection *con,
3900 struct ceph_auth_handshake *auth = &s->s_auth; 3898 struct ceph_auth_handshake *auth = &s->s_auth;
3901 3899
3902 if (force_new && auth->authorizer) { 3900 if (force_new && auth->authorizer) {
3903 ceph_auth_destroy_authorizer(ac, auth->authorizer); 3901 ceph_auth_destroy_authorizer(auth->authorizer);
3904 auth->authorizer = NULL; 3902 auth->authorizer = NULL;
3905 } 3903 }
3906 if (!auth->authorizer) { 3904 if (!auth->authorizer) {
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
index 655f21f99160..0b2954d7172d 100644
--- a/fs/devpts/inode.c
+++ b/fs/devpts/inode.c
@@ -128,6 +128,7 @@ static const match_table_t tokens = {
128struct pts_fs_info { 128struct pts_fs_info {
129 struct ida allocated_ptys; 129 struct ida allocated_ptys;
130 struct pts_mount_opts mount_opts; 130 struct pts_mount_opts mount_opts;
131 struct super_block *sb;
131 struct dentry *ptmx_dentry; 132 struct dentry *ptmx_dentry;
132}; 133};
133 134
@@ -358,7 +359,7 @@ static const struct super_operations devpts_sops = {
358 .show_options = devpts_show_options, 359 .show_options = devpts_show_options,
359}; 360};
360 361
361static void *new_pts_fs_info(void) 362static void *new_pts_fs_info(struct super_block *sb)
362{ 363{
363 struct pts_fs_info *fsi; 364 struct pts_fs_info *fsi;
364 365
@@ -369,6 +370,7 @@ static void *new_pts_fs_info(void)
369 ida_init(&fsi->allocated_ptys); 370 ida_init(&fsi->allocated_ptys);
370 fsi->mount_opts.mode = DEVPTS_DEFAULT_MODE; 371 fsi->mount_opts.mode = DEVPTS_DEFAULT_MODE;
371 fsi->mount_opts.ptmxmode = DEVPTS_DEFAULT_PTMX_MODE; 372 fsi->mount_opts.ptmxmode = DEVPTS_DEFAULT_PTMX_MODE;
373 fsi->sb = sb;
372 374
373 return fsi; 375 return fsi;
374} 376}
@@ -384,7 +386,7 @@ devpts_fill_super(struct super_block *s, void *data, int silent)
384 s->s_op = &devpts_sops; 386 s->s_op = &devpts_sops;
385 s->s_time_gran = 1; 387 s->s_time_gran = 1;
386 388
387 s->s_fs_info = new_pts_fs_info(); 389 s->s_fs_info = new_pts_fs_info(s);
388 if (!s->s_fs_info) 390 if (!s->s_fs_info)
389 goto fail; 391 goto fail;
390 392
@@ -524,17 +526,14 @@ static struct file_system_type devpts_fs_type = {
524 * to the System V naming convention 526 * to the System V naming convention
525 */ 527 */
526 528
527int devpts_new_index(struct inode *ptmx_inode) 529int devpts_new_index(struct pts_fs_info *fsi)
528{ 530{
529 struct super_block *sb = pts_sb_from_inode(ptmx_inode);
530 struct pts_fs_info *fsi;
531 int index; 531 int index;
532 int ida_ret; 532 int ida_ret;
533 533
534 if (!sb) 534 if (!fsi)
535 return -ENODEV; 535 return -ENODEV;
536 536
537 fsi = DEVPTS_SB(sb);
538retry: 537retry:
539 if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL)) 538 if (!ida_pre_get(&fsi->allocated_ptys, GFP_KERNEL))
540 return -ENOMEM; 539 return -ENOMEM;
@@ -564,11 +563,8 @@ retry:
564 return index; 563 return index;
565} 564}
566 565
567void devpts_kill_index(struct inode *ptmx_inode, int idx) 566void devpts_kill_index(struct pts_fs_info *fsi, int idx)
568{ 567{
569 struct super_block *sb = pts_sb_from_inode(ptmx_inode);
570 struct pts_fs_info *fsi = DEVPTS_SB(sb);
571
572 mutex_lock(&allocated_ptys_lock); 568 mutex_lock(&allocated_ptys_lock);
573 ida_remove(&fsi->allocated_ptys, idx); 569 ida_remove(&fsi->allocated_ptys, idx);
574 pty_count--; 570 pty_count--;
@@ -578,21 +574,25 @@ void devpts_kill_index(struct inode *ptmx_inode, int idx)
578/* 574/*
579 * pty code needs to hold extra references in case of last /dev/tty close 575 * pty code needs to hold extra references in case of last /dev/tty close
580 */ 576 */
581 577struct pts_fs_info *devpts_get_ref(struct inode *ptmx_inode, struct file *file)
582void devpts_add_ref(struct inode *ptmx_inode)
583{ 578{
584 struct super_block *sb = pts_sb_from_inode(ptmx_inode); 579 struct super_block *sb;
580 struct pts_fs_info *fsi;
581
582 sb = pts_sb_from_inode(ptmx_inode);
583 if (!sb)
584 return NULL;
585 fsi = DEVPTS_SB(sb);
586 if (!fsi)
587 return NULL;
585 588
586 atomic_inc(&sb->s_active); 589 atomic_inc(&sb->s_active);
587 ihold(ptmx_inode); 590 return fsi;
588} 591}
589 592
590void devpts_del_ref(struct inode *ptmx_inode) 593void devpts_put_ref(struct pts_fs_info *fsi)
591{ 594{
592 struct super_block *sb = pts_sb_from_inode(ptmx_inode); 595 deactivate_super(fsi->sb);
593
594 iput(ptmx_inode);
595 deactivate_super(sb);
596} 596}
597 597
598/** 598/**
@@ -604,22 +604,20 @@ void devpts_del_ref(struct inode *ptmx_inode)
604 * 604 *
605 * The created inode is returned. Remove it from /dev/pts/ by devpts_pty_kill. 605 * The created inode is returned. Remove it from /dev/pts/ by devpts_pty_kill.
606 */ 606 */
607struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index, 607struct dentry *devpts_pty_new(struct pts_fs_info *fsi, int index, void *priv)
608 void *priv)
609{ 608{
610 struct dentry *dentry; 609 struct dentry *dentry;
611 struct super_block *sb = pts_sb_from_inode(ptmx_inode); 610 struct super_block *sb;
612 struct inode *inode; 611 struct inode *inode;
613 struct dentry *root; 612 struct dentry *root;
614 struct pts_fs_info *fsi;
615 struct pts_mount_opts *opts; 613 struct pts_mount_opts *opts;
616 char s[12]; 614 char s[12];
617 615
618 if (!sb) 616 if (!fsi)
619 return ERR_PTR(-ENODEV); 617 return ERR_PTR(-ENODEV);
620 618
619 sb = fsi->sb;
621 root = sb->s_root; 620 root = sb->s_root;
622 fsi = DEVPTS_SB(sb);
623 opts = &fsi->mount_opts; 621 opts = &fsi->mount_opts;
624 622
625 inode = new_inode(sb); 623 inode = new_inode(sb);
@@ -630,25 +628,21 @@ struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index,
630 inode->i_uid = opts->setuid ? opts->uid : current_fsuid(); 628 inode->i_uid = opts->setuid ? opts->uid : current_fsuid();
631 inode->i_gid = opts->setgid ? opts->gid : current_fsgid(); 629 inode->i_gid = opts->setgid ? opts->gid : current_fsgid();
632 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; 630 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
633 init_special_inode(inode, S_IFCHR|opts->mode, device); 631 init_special_inode(inode, S_IFCHR|opts->mode, MKDEV(UNIX98_PTY_SLAVE_MAJOR, index));
634 inode->i_private = priv;
635 632
636 sprintf(s, "%d", index); 633 sprintf(s, "%d", index);
637 634
638 inode_lock(d_inode(root));
639
640 dentry = d_alloc_name(root, s); 635 dentry = d_alloc_name(root, s);
641 if (dentry) { 636 if (dentry) {
637 dentry->d_fsdata = priv;
642 d_add(dentry, inode); 638 d_add(dentry, inode);
643 fsnotify_create(d_inode(root), dentry); 639 fsnotify_create(d_inode(root), dentry);
644 } else { 640 } else {
645 iput(inode); 641 iput(inode);
646 inode = ERR_PTR(-ENOMEM); 642 dentry = ERR_PTR(-ENOMEM);
647 } 643 }
648 644
649 inode_unlock(d_inode(root)); 645 return dentry;
650
651 return inode;
652} 646}
653 647
654/** 648/**
@@ -657,24 +651,10 @@ struct inode *devpts_pty_new(struct inode *ptmx_inode, dev_t device, int index,
657 * 651 *
658 * Returns whatever was passed as priv in devpts_pty_new for a given inode. 652 * Returns whatever was passed as priv in devpts_pty_new for a given inode.
659 */ 653 */
660void *devpts_get_priv(struct inode *pts_inode) 654void *devpts_get_priv(struct dentry *dentry)
661{ 655{
662 struct dentry *dentry; 656 WARN_ON_ONCE(dentry->d_sb->s_magic != DEVPTS_SUPER_MAGIC);
663 void *priv = NULL; 657 return dentry->d_fsdata;
664
665 BUG_ON(pts_inode->i_rdev == MKDEV(TTYAUX_MAJOR, PTMX_MINOR));
666
667 /* Ensure dentry has not been deleted by devpts_pty_kill() */
668 dentry = d_find_alias(pts_inode);
669 if (!dentry)
670 return NULL;
671
672 if (pts_inode->i_sb->s_magic == DEVPTS_SUPER_MAGIC)
673 priv = pts_inode->i_private;
674
675 dput(dentry);
676
677 return priv;
678} 658}
679 659
680/** 660/**
@@ -683,24 +663,14 @@ void *devpts_get_priv(struct inode *pts_inode)
683 * 663 *
684 * This is an inverse operation of devpts_pty_new. 664 * This is an inverse operation of devpts_pty_new.
685 */ 665 */
686void devpts_pty_kill(struct inode *inode) 666void devpts_pty_kill(struct dentry *dentry)
687{ 667{
688 struct super_block *sb = pts_sb_from_inode(inode); 668 WARN_ON_ONCE(dentry->d_sb->s_magic != DEVPTS_SUPER_MAGIC);
689 struct dentry *root = sb->s_root;
690 struct dentry *dentry;
691 669
692 BUG_ON(inode->i_rdev == MKDEV(TTYAUX_MAJOR, PTMX_MINOR)); 670 dentry->d_fsdata = NULL;
693 671 drop_nlink(dentry->d_inode);
694 inode_lock(d_inode(root));
695
696 dentry = d_find_alias(inode);
697
698 drop_nlink(inode);
699 d_delete(dentry); 672 d_delete(dentry);
700 dput(dentry); /* d_alloc_name() in devpts_pty_new() */ 673 dput(dentry); /* d_alloc_name() in devpts_pty_new() */
701 dput(dentry); /* d_find_alias above */
702
703 inode_unlock(d_inode(root));
704} 674}
705 675
706static int __init init_devpts_fs(void) 676static int __init init_devpts_fs(void)
diff --git a/fs/ocfs2/dlm/dlmmaster.c b/fs/ocfs2/dlm/dlmmaster.c
index 9aed6e202201..13719d3f35f8 100644
--- a/fs/ocfs2/dlm/dlmmaster.c
+++ b/fs/ocfs2/dlm/dlmmaster.c
@@ -2455,6 +2455,8 @@ int dlm_deref_lockres_done_handler(struct o2net_msg *msg, u32 len, void *data,
2455 2455
2456 spin_unlock(&dlm->spinlock); 2456 spin_unlock(&dlm->spinlock);
2457 2457
2458 ret = 0;
2459
2458done: 2460done:
2459 dlm_put(dlm); 2461 dlm_put(dlm);
2460 return ret; 2462 return ret;
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 229cb546bee0..541583510cfb 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -1518,6 +1518,32 @@ static struct page *can_gather_numa_stats(pte_t pte, struct vm_area_struct *vma,
1518 return page; 1518 return page;
1519} 1519}
1520 1520
1521#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1522static struct page *can_gather_numa_stats_pmd(pmd_t pmd,
1523 struct vm_area_struct *vma,
1524 unsigned long addr)
1525{
1526 struct page *page;
1527 int nid;
1528
1529 if (!pmd_present(pmd))
1530 return NULL;
1531
1532 page = vm_normal_page_pmd(vma, addr, pmd);
1533 if (!page)
1534 return NULL;
1535
1536 if (PageReserved(page))
1537 return NULL;
1538
1539 nid = page_to_nid(page);
1540 if (!node_isset(nid, node_states[N_MEMORY]))
1541 return NULL;
1542
1543 return page;
1544}
1545#endif
1546
1521static int gather_pte_stats(pmd_t *pmd, unsigned long addr, 1547static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1522 unsigned long end, struct mm_walk *walk) 1548 unsigned long end, struct mm_walk *walk)
1523{ 1549{
@@ -1527,14 +1553,14 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1527 pte_t *orig_pte; 1553 pte_t *orig_pte;
1528 pte_t *pte; 1554 pte_t *pte;
1529 1555
1556#ifdef CONFIG_TRANSPARENT_HUGEPAGE
1530 ptl = pmd_trans_huge_lock(pmd, vma); 1557 ptl = pmd_trans_huge_lock(pmd, vma);
1531 if (ptl) { 1558 if (ptl) {
1532 pte_t huge_pte = *(pte_t *)pmd;
1533 struct page *page; 1559 struct page *page;
1534 1560
1535 page = can_gather_numa_stats(huge_pte, vma, addr); 1561 page = can_gather_numa_stats_pmd(*pmd, vma, addr);
1536 if (page) 1562 if (page)
1537 gather_stats(page, md, pte_dirty(huge_pte), 1563 gather_stats(page, md, pmd_dirty(*pmd),
1538 HPAGE_PMD_SIZE/PAGE_SIZE); 1564 HPAGE_PMD_SIZE/PAGE_SIZE);
1539 spin_unlock(ptl); 1565 spin_unlock(ptl);
1540 return 0; 1566 return 0;
@@ -1542,6 +1568,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
1542 1568
1543 if (pmd_trans_unstable(pmd)) 1569 if (pmd_trans_unstable(pmd))
1544 return 0; 1570 return 0;
1571#endif
1545 orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); 1572 orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl);
1546 do { 1573 do {
1547 struct page *page = can_gather_numa_stats(*pte, vma, addr); 1574 struct page *page = can_gather_numa_stats(*pte, vma, addr);