diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/coda/psdev.c | 4 | ||||
| -rw-r--r-- | fs/ext3/super.c | 26 | ||||
| -rw-r--r-- | fs/jfs/jfs_dmap.c | 20 | ||||
| -rw-r--r-- | fs/jfs/jfs_imap.c | 10 | ||||
| -rw-r--r-- | fs/jfs/jfs_metapage.c | 6 | ||||
| -rw-r--r-- | fs/jfs/jfs_txnmgr.c | 2 | ||||
| -rw-r--r-- | fs/jfs/jfs_xtree.c | 18 | ||||
| -rw-r--r-- | fs/jfs/super.c | 1 | ||||
| -rw-r--r-- | fs/partitions/check.c | 27 |
9 files changed, 82 insertions, 32 deletions
diff --git a/fs/coda/psdev.c b/fs/coda/psdev.c index 3d1cce3653b8..6a3df88accfe 100644 --- a/fs/coda/psdev.c +++ b/fs/coda/psdev.c | |||
| @@ -370,8 +370,8 @@ static int init_coda_psdev(void) | |||
| 370 | } | 370 | } |
| 371 | devfs_mk_dir ("coda"); | 371 | devfs_mk_dir ("coda"); |
| 372 | for (i = 0; i < MAX_CODADEVS; i++) { | 372 | for (i = 0; i < MAX_CODADEVS; i++) { |
| 373 | class_device_create(coda_psdev_class, MKDEV(CODA_PSDEV_MAJOR,i), | 373 | class_device_create(coda_psdev_class, NULL, |
| 374 | NULL, "cfs%d", i); | 374 | MKDEV(CODA_PSDEV_MAJOR,i), NULL, "cfs%d", i); |
| 375 | err = devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i), | 375 | err = devfs_mk_cdev(MKDEV(CODA_PSDEV_MAJOR, i), |
| 376 | S_IFCHR|S_IRUSR|S_IWUSR, "coda/%d", i); | 376 | S_IFCHR|S_IRUSR|S_IWUSR, "coda/%d", i); |
| 377 | if (err) | 377 | if (err) |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 9e24ceb019fe..097383c11154 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
| @@ -510,19 +510,11 @@ static void ext3_clear_inode(struct inode *inode) | |||
| 510 | kfree(rsv); | 510 | kfree(rsv); |
| 511 | } | 511 | } |
| 512 | 512 | ||
| 513 | static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) | 513 | static inline void ext3_show_quota_options(struct seq_file *seq, struct super_block *sb) |
| 514 | { | 514 | { |
| 515 | struct super_block *sb = vfs->mnt_sb; | 515 | #if defined(CONFIG_QUOTA) |
| 516 | struct ext3_sb_info *sbi = EXT3_SB(sb); | 516 | struct ext3_sb_info *sbi = EXT3_SB(sb); |
| 517 | 517 | ||
| 518 | if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) | ||
| 519 | seq_puts(seq, ",data=journal"); | ||
| 520 | else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA) | ||
| 521 | seq_puts(seq, ",data=ordered"); | ||
| 522 | else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA) | ||
| 523 | seq_puts(seq, ",data=writeback"); | ||
| 524 | |||
| 525 | #if defined(CONFIG_QUOTA) | ||
| 526 | if (sbi->s_jquota_fmt) | 518 | if (sbi->s_jquota_fmt) |
| 527 | seq_printf(seq, ",jqfmt=%s", | 519 | seq_printf(seq, ",jqfmt=%s", |
| 528 | (sbi->s_jquota_fmt == QFMT_VFS_OLD) ? "vfsold": "vfsv0"); | 520 | (sbi->s_jquota_fmt == QFMT_VFS_OLD) ? "vfsold": "vfsv0"); |
| @@ -539,6 +531,20 @@ static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) | |||
| 539 | if (sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA) | 531 | if (sbi->s_mount_opt & EXT3_MOUNT_GRPQUOTA) |
| 540 | seq_puts(seq, ",grpquota"); | 532 | seq_puts(seq, ",grpquota"); |
| 541 | #endif | 533 | #endif |
| 534 | } | ||
| 535 | |||
| 536 | static int ext3_show_options(struct seq_file *seq, struct vfsmount *vfs) | ||
| 537 | { | ||
| 538 | struct super_block *sb = vfs->mnt_sb; | ||
| 539 | |||
| 540 | if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_JOURNAL_DATA) | ||
| 541 | seq_puts(seq, ",data=journal"); | ||
| 542 | else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_ORDERED_DATA) | ||
| 543 | seq_puts(seq, ",data=ordered"); | ||
| 544 | else if (test_opt(sb, DATA_FLAGS) == EXT3_MOUNT_WRITEBACK_DATA) | ||
| 545 | seq_puts(seq, ",data=writeback"); | ||
| 546 | |||
| 547 | ext3_show_quota_options(seq, sb); | ||
| 542 | 548 | ||
| 543 | return 0; | 549 | return 0; |
| 544 | } | 550 | } |
diff --git a/fs/jfs/jfs_dmap.c b/fs/jfs/jfs_dmap.c index eadf319bee22..68000a50ceb6 100644 --- a/fs/jfs/jfs_dmap.c +++ b/fs/jfs/jfs_dmap.c | |||
| @@ -74,7 +74,7 @@ | |||
| 74 | static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, | 74 | static void dbAllocBits(struct bmap * bmp, struct dmap * dp, s64 blkno, |
| 75 | int nblocks); | 75 | int nblocks); |
| 76 | static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval); | 76 | static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval); |
| 77 | static void dbBackSplit(dmtree_t * tp, int leafno); | 77 | static int dbBackSplit(dmtree_t * tp, int leafno); |
| 78 | static int dbJoin(dmtree_t * tp, int leafno, int newval); | 78 | static int dbJoin(dmtree_t * tp, int leafno, int newval); |
| 79 | static void dbAdjTree(dmtree_t * tp, int leafno, int newval); | 79 | static void dbAdjTree(dmtree_t * tp, int leafno, int newval); |
| 80 | static int dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, | 80 | static int dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, |
| @@ -305,7 +305,6 @@ int dbSync(struct inode *ipbmap) | |||
| 305 | filemap_fdatawrite(ipbmap->i_mapping); | 305 | filemap_fdatawrite(ipbmap->i_mapping); |
| 306 | filemap_fdatawait(ipbmap->i_mapping); | 306 | filemap_fdatawait(ipbmap->i_mapping); |
| 307 | 307 | ||
| 308 | ipbmap->i_state |= I_DIRTY; | ||
| 309 | diWriteSpecial(ipbmap, 0); | 308 | diWriteSpecial(ipbmap, 0); |
| 310 | 309 | ||
| 311 | return (0); | 310 | return (0); |
| @@ -2467,7 +2466,9 @@ dbAdjCtl(struct bmap * bmp, s64 blkno, int newval, int alloc, int level) | |||
| 2467 | * that it is at the front of a binary buddy system. | 2466 | * that it is at the front of a binary buddy system. |
| 2468 | */ | 2467 | */ |
| 2469 | if (oldval == NOFREE) { | 2468 | if (oldval == NOFREE) { |
| 2470 | dbBackSplit((dmtree_t *) dcp, leafno); | 2469 | rc = dbBackSplit((dmtree_t *) dcp, leafno); |
| 2470 | if (rc) | ||
| 2471 | return rc; | ||
| 2471 | oldval = dcp->stree[ti]; | 2472 | oldval = dcp->stree[ti]; |
| 2472 | } | 2473 | } |
| 2473 | dbSplit((dmtree_t *) dcp, leafno, dcp->budmin, newval); | 2474 | dbSplit((dmtree_t *) dcp, leafno, dcp->budmin, newval); |
| @@ -2627,7 +2628,7 @@ static void dbSplit(dmtree_t * tp, int leafno, int splitsz, int newval) | |||
| 2627 | * | 2628 | * |
| 2628 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; | 2629 | * serialization: IREAD_LOCK(ipbmap) or IWRITE_LOCK(ipbmap) held on entry/exit; |
| 2629 | */ | 2630 | */ |
| 2630 | static void dbBackSplit(dmtree_t * tp, int leafno) | 2631 | static int dbBackSplit(dmtree_t * tp, int leafno) |
| 2631 | { | 2632 | { |
| 2632 | int budsz, bud, w, bsz, size; | 2633 | int budsz, bud, w, bsz, size; |
| 2633 | int cursz; | 2634 | int cursz; |
| @@ -2662,7 +2663,10 @@ static void dbBackSplit(dmtree_t * tp, int leafno) | |||
| 2662 | */ | 2663 | */ |
| 2663 | for (w = leafno, bsz = budsz;; bsz <<= 1, | 2664 | for (w = leafno, bsz = budsz;; bsz <<= 1, |
| 2664 | w = (w < bud) ? w : bud) { | 2665 | w = (w < bud) ? w : bud) { |
| 2665 | assert(bsz < le32_to_cpu(tp->dmt_nleafs)); | 2666 | if (bsz >= le32_to_cpu(tp->dmt_nleafs)) { |
| 2667 | jfs_err("JFS: block map error in dbBackSplit"); | ||
| 2668 | return -EIO; | ||
| 2669 | } | ||
| 2666 | 2670 | ||
| 2667 | /* determine the buddy. | 2671 | /* determine the buddy. |
| 2668 | */ | 2672 | */ |
| @@ -2681,7 +2685,11 @@ static void dbBackSplit(dmtree_t * tp, int leafno) | |||
| 2681 | } | 2685 | } |
| 2682 | } | 2686 | } |
| 2683 | 2687 | ||
| 2684 | assert(leaf[leafno] == size); | 2688 | if (leaf[leafno] != size) { |
| 2689 | jfs_err("JFS: wrong leaf value in dbBackSplit"); | ||
| 2690 | return -EIO; | ||
| 2691 | } | ||
| 2692 | return 0; | ||
| 2685 | } | 2693 | } |
| 2686 | 2694 | ||
| 2687 | 2695 | ||
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index 4021d46da7e3..28201b194f53 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c | |||
| @@ -57,6 +57,12 @@ | |||
| 57 | #include "jfs_debug.h" | 57 | #include "jfs_debug.h" |
| 58 | 58 | ||
| 59 | /* | 59 | /* |
| 60 | * __mark_inode_dirty expects inodes to be hashed. Since we don't want | ||
| 61 | * special inodes in the fileset inode space, we hash them to a dummy head | ||
| 62 | */ | ||
| 63 | static HLIST_HEAD(aggregate_hash); | ||
| 64 | |||
| 65 | /* | ||
| 60 | * imap locks | 66 | * imap locks |
| 61 | */ | 67 | */ |
| 62 | /* iag free list lock */ | 68 | /* iag free list lock */ |
| @@ -491,6 +497,8 @@ struct inode *diReadSpecial(struct super_block *sb, ino_t inum, int secondary) | |||
| 491 | /* release the page */ | 497 | /* release the page */ |
| 492 | release_metapage(mp); | 498 | release_metapage(mp); |
| 493 | 499 | ||
| 500 | hlist_add_head(&ip->i_hash, &aggregate_hash); | ||
| 501 | |||
| 494 | return (ip); | 502 | return (ip); |
| 495 | } | 503 | } |
| 496 | 504 | ||
| @@ -514,8 +522,6 @@ void diWriteSpecial(struct inode *ip, int secondary) | |||
| 514 | ino_t inum = ip->i_ino; | 522 | ino_t inum = ip->i_ino; |
| 515 | struct metapage *mp; | 523 | struct metapage *mp; |
| 516 | 524 | ||
| 517 | ip->i_state &= ~I_DIRTY; | ||
| 518 | |||
| 519 | if (secondary) | 525 | if (secondary) |
| 520 | address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; | 526 | address = addressPXD(&sbi->ait2) >> sbi->l2nbperpage; |
| 521 | else | 527 | else |
diff --git a/fs/jfs/jfs_metapage.c b/fs/jfs/jfs_metapage.c index eeb37d70e650..26091a5f88d4 100644 --- a/fs/jfs/jfs_metapage.c +++ b/fs/jfs/jfs_metapage.c | |||
| @@ -395,6 +395,12 @@ static int metapage_writepage(struct page *page, struct writeback_control *wbc) | |||
| 395 | 395 | ||
| 396 | if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) { | 396 | if (mp->nohomeok && !test_bit(META_forcewrite, &mp->flag)) { |
| 397 | redirty = 1; | 397 | redirty = 1; |
| 398 | /* | ||
| 399 | * Make sure this page isn't blocked indefinitely. | ||
| 400 | * If the journal isn't undergoing I/O, push it | ||
| 401 | */ | ||
| 402 | if (mp->log && !(mp->log->cflag & logGC_PAGEOUT)) | ||
| 403 | jfs_flush_journal(mp->log, 0); | ||
| 398 | continue; | 404 | continue; |
| 399 | } | 405 | } |
| 400 | 406 | ||
diff --git a/fs/jfs/jfs_txnmgr.c b/fs/jfs/jfs_txnmgr.c index 9b71ed2674fe..b660c93c92de 100644 --- a/fs/jfs/jfs_txnmgr.c +++ b/fs/jfs/jfs_txnmgr.c | |||
| @@ -2396,7 +2396,6 @@ static void txUpdateMap(struct tblock * tblk) | |||
| 2396 | */ | 2396 | */ |
| 2397 | if (tblk->xflag & COMMIT_CREATE) { | 2397 | if (tblk->xflag & COMMIT_CREATE) { |
| 2398 | diUpdatePMap(ipimap, tblk->ino, FALSE, tblk); | 2398 | diUpdatePMap(ipimap, tblk->ino, FALSE, tblk); |
| 2399 | ipimap->i_state |= I_DIRTY; | ||
| 2400 | /* update persistent block allocation map | 2399 | /* update persistent block allocation map |
| 2401 | * for the allocation of inode extent; | 2400 | * for the allocation of inode extent; |
| 2402 | */ | 2401 | */ |
| @@ -2407,7 +2406,6 @@ static void txUpdateMap(struct tblock * tblk) | |||
| 2407 | } else if (tblk->xflag & COMMIT_DELETE) { | 2406 | } else if (tblk->xflag & COMMIT_DELETE) { |
| 2408 | ip = tblk->u.ip; | 2407 | ip = tblk->u.ip; |
| 2409 | diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk); | 2408 | diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk); |
| 2410 | ipimap->i_state |= I_DIRTY; | ||
| 2411 | iput(ip); | 2409 | iput(ip); |
| 2412 | } | 2410 | } |
| 2413 | } | 2411 | } |
diff --git a/fs/jfs/jfs_xtree.c b/fs/jfs/jfs_xtree.c index a7fe2f2b969f..e72f4ebb6e9c 100644 --- a/fs/jfs/jfs_xtree.c +++ b/fs/jfs/jfs_xtree.c | |||
| @@ -3516,16 +3516,10 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) | |||
| 3516 | /* process entries backward from last index */ | 3516 | /* process entries backward from last index */ |
| 3517 | index = le16_to_cpu(p->header.nextindex) - 1; | 3517 | index = le16_to_cpu(p->header.nextindex) - 1; |
| 3518 | 3518 | ||
| 3519 | if (p->header.flag & BT_INTERNAL) | ||
| 3520 | goto getChild; | ||
| 3521 | |||
| 3522 | /* | ||
| 3523 | * leaf page | ||
| 3524 | */ | ||
| 3525 | 3519 | ||
| 3526 | /* Since this is the rightmost leaf, and we may have already freed | 3520 | /* Since this is the rightmost page at this level, and we may have |
| 3527 | * a page that was formerly to the right, let's make sure that the | 3521 | * already freed a page that was formerly to the right, let's make |
| 3528 | * next pointer is zero. | 3522 | * sure that the next pointer is zero. |
| 3529 | */ | 3523 | */ |
| 3530 | if (p->header.next) { | 3524 | if (p->header.next) { |
| 3531 | if (log) | 3525 | if (log) |
| @@ -3539,6 +3533,12 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) | |||
| 3539 | p->header.next = 0; | 3533 | p->header.next = 0; |
| 3540 | } | 3534 | } |
| 3541 | 3535 | ||
| 3536 | if (p->header.flag & BT_INTERNAL) | ||
| 3537 | goto getChild; | ||
| 3538 | |||
| 3539 | /* | ||
| 3540 | * leaf page | ||
| 3541 | */ | ||
| 3542 | freed = 0; | 3542 | freed = 0; |
| 3543 | 3543 | ||
| 3544 | /* does region covered by leaf page precede Teof ? */ | 3544 | /* does region covered by leaf page precede Teof ? */ |
diff --git a/fs/jfs/super.c b/fs/jfs/super.c index 71bc34b96b2b..4226af3ea91b 100644 --- a/fs/jfs/super.c +++ b/fs/jfs/super.c | |||
| @@ -442,6 +442,7 @@ static int jfs_fill_super(struct super_block *sb, void *data, int silent) | |||
| 442 | inode->i_nlink = 1; | 442 | inode->i_nlink = 1; |
| 443 | inode->i_size = sb->s_bdev->bd_inode->i_size; | 443 | inode->i_size = sb->s_bdev->bd_inode->i_size; |
| 444 | inode->i_mapping->a_ops = &jfs_metapage_aops; | 444 | inode->i_mapping->a_ops = &jfs_metapage_aops; |
| 445 | insert_inode_hash(inode); | ||
| 445 | mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); | 446 | mapping_set_gfp_mask(inode->i_mapping, GFP_NOFS); |
| 446 | 447 | ||
| 447 | sbi->direct_inode = inode; | 448 | sbi->direct_inode = inode; |
diff --git a/fs/partitions/check.c b/fs/partitions/check.c index 1e848648a322..9c06c5434ec4 100644 --- a/fs/partitions/check.c +++ b/fs/partitions/check.c | |||
| @@ -192,6 +192,7 @@ check_partition(struct gendisk *hd, struct block_device *bdev) | |||
| 192 | struct part_attribute { | 192 | struct part_attribute { |
| 193 | struct attribute attr; | 193 | struct attribute attr; |
| 194 | ssize_t (*show)(struct hd_struct *,char *); | 194 | ssize_t (*show)(struct hd_struct *,char *); |
| 195 | ssize_t (*store)(struct hd_struct *,const char *, size_t); | ||
| 195 | }; | 196 | }; |
| 196 | 197 | ||
| 197 | static ssize_t | 198 | static ssize_t |
| @@ -201,14 +202,33 @@ part_attr_show(struct kobject * kobj, struct attribute * attr, char * page) | |||
| 201 | struct part_attribute * part_attr = container_of(attr,struct part_attribute,attr); | 202 | struct part_attribute * part_attr = container_of(attr,struct part_attribute,attr); |
| 202 | ssize_t ret = 0; | 203 | ssize_t ret = 0; |
| 203 | if (part_attr->show) | 204 | if (part_attr->show) |
| 204 | ret = part_attr->show(p,page); | 205 | ret = part_attr->show(p, page); |
| 206 | return ret; | ||
| 207 | } | ||
| 208 | static ssize_t | ||
| 209 | part_attr_store(struct kobject * kobj, struct attribute * attr, | ||
| 210 | const char *page, size_t count) | ||
| 211 | { | ||
| 212 | struct hd_struct * p = container_of(kobj,struct hd_struct,kobj); | ||
| 213 | struct part_attribute * part_attr = container_of(attr,struct part_attribute,attr); | ||
| 214 | ssize_t ret = 0; | ||
| 215 | |||
| 216 | if (part_attr->store) | ||
| 217 | ret = part_attr->store(p, page, count); | ||
| 205 | return ret; | 218 | return ret; |
| 206 | } | 219 | } |
| 207 | 220 | ||
| 208 | static struct sysfs_ops part_sysfs_ops = { | 221 | static struct sysfs_ops part_sysfs_ops = { |
| 209 | .show = part_attr_show, | 222 | .show = part_attr_show, |
| 223 | .store = part_attr_store, | ||
| 210 | }; | 224 | }; |
| 211 | 225 | ||
| 226 | static ssize_t part_uevent_store(struct hd_struct * p, | ||
| 227 | const char *page, size_t count) | ||
| 228 | { | ||
| 229 | kobject_hotplug(&p->kobj, KOBJ_ADD); | ||
| 230 | return count; | ||
| 231 | } | ||
| 212 | static ssize_t part_dev_read(struct hd_struct * p, char *page) | 232 | static ssize_t part_dev_read(struct hd_struct * p, char *page) |
| 213 | { | 233 | { |
| 214 | struct gendisk *disk = container_of(p->kobj.parent,struct gendisk,kobj); | 234 | struct gendisk *disk = container_of(p->kobj.parent,struct gendisk,kobj); |
| @@ -229,6 +249,10 @@ static ssize_t part_stat_read(struct hd_struct * p, char *page) | |||
| 229 | p->reads, (unsigned long long)p->read_sectors, | 249 | p->reads, (unsigned long long)p->read_sectors, |
| 230 | p->writes, (unsigned long long)p->write_sectors); | 250 | p->writes, (unsigned long long)p->write_sectors); |
| 231 | } | 251 | } |
| 252 | static struct part_attribute part_attr_uevent = { | ||
| 253 | .attr = {.name = "uevent", .mode = S_IWUSR }, | ||
| 254 | .store = part_uevent_store | ||
| 255 | }; | ||
| 232 | static struct part_attribute part_attr_dev = { | 256 | static struct part_attribute part_attr_dev = { |
| 233 | .attr = {.name = "dev", .mode = S_IRUGO }, | 257 | .attr = {.name = "dev", .mode = S_IRUGO }, |
| 234 | .show = part_dev_read | 258 | .show = part_dev_read |
| @@ -247,6 +271,7 @@ static struct part_attribute part_attr_stat = { | |||
| 247 | }; | 271 | }; |
| 248 | 272 | ||
| 249 | static struct attribute * default_attrs[] = { | 273 | static struct attribute * default_attrs[] = { |
| 274 | &part_attr_uevent.attr, | ||
| 250 | &part_attr_dev.attr, | 275 | &part_attr_dev.attr, |
| 251 | &part_attr_start.attr, | 276 | &part_attr_start.attr, |
| 252 | &part_attr_size.attr, | 277 | &part_attr_size.attr, |
