Skip to content

Commit 4b4f1d0

Browse files
committed
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs-2.6: (87 commits) nilfs2: get rid of bd_mount_sem use from nilfs nilfs2: correct exclusion control in nilfs_remount function nilfs2: simplify remaining sget() use nilfs2: get rid of sget use for checking if current mount is present nilfs2: get rid of sget use for acquiring nilfs object nilfs2: remove meaningless EBUSY case from nilfs_get_sb function remove the call to ->write_super in __sync_filesystem nilfs2: call nilfs2_write_super from nilfs2_sync_fs jffs2: call jffs2_write_super from jffs2_sync_fs ufs: add ->sync_fs sysv: add ->sync_fs hfsplus: add ->sync_fs hfs: add ->sync_fs fat: add ->sync_fs ext2: add ->sync_fs exofs: add ->sync_fs bfs: add ->sync_fs affs: add ->sync_fs sanitize ->fsync() for affs repair bfs_write_inode(), switch bfs to simple_fsync() ...
2 parents 875287c + aa7dfb8 commit 4b4f1d0

File tree

147 files changed

+1707
-1834
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

147 files changed

+1707
-1834
lines changed

arch/alpha/kernel/osf_sys.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,6 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, char __user *, path,
371371
int retval = -EINVAL;
372372
char *name;
373373

374-
lock_kernel();
375-
376374
name = getname(path);
377375
retval = PTR_ERR(name);
378376
if (IS_ERR(name))
@@ -392,7 +390,6 @@ SYSCALL_DEFINE4(osf_mount, unsigned long, typenr, char __user *, path,
392390
}
393391
putname(name);
394392
out:
395-
unlock_kernel();
396393
return retval;
397394
}
398395

drivers/ieee1394/dv1394.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,12 +1789,13 @@ static int dv1394_open(struct inode *inode, struct file *file)
17891789
} else {
17901790
/* look up the card by ID */
17911791
unsigned long flags;
1792+
int idx = ieee1394_file_to_instance(file);
17921793

17931794
spin_lock_irqsave(&dv1394_cards_lock, flags);
17941795
if (!list_empty(&dv1394_cards)) {
17951796
struct video_card *p;
17961797
list_for_each_entry(p, &dv1394_cards, list) {
1797-
if ((p->id) == ieee1394_file_to_instance(file)) {
1798+
if ((p->id) == idx) {
17981799
video = p;
17991800
break;
18001801
}
@@ -1803,7 +1804,7 @@ static int dv1394_open(struct inode *inode, struct file *file)
18031804
spin_unlock_irqrestore(&dv1394_cards_lock, flags);
18041805

18051806
if (!video) {
1806-
debug_printk("dv1394: OHCI card %d not found", ieee1394_file_to_instance(file));
1807+
debug_printk("dv1394: OHCI card %d not found", idx);
18071808
return -ENODEV;
18081809
}
18091810

drivers/ieee1394/ieee1394_core.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <linux/fs.h>
66
#include <linux/list.h>
77
#include <linux/types.h>
8+
#include <linux/cdev.h>
89
#include <asm/atomic.h>
910

1011
#include "hosts.h"
@@ -155,7 +156,10 @@ void hpsb_packet_received(struct hpsb_host *host, quadlet_t *data, size_t size,
155156
*/
156157
static inline unsigned char ieee1394_file_to_instance(struct file *file)
157158
{
158-
return file->f_path.dentry->d_inode->i_cindex;
159+
int idx = cdev_index(file->f_path.dentry->d_inode);
160+
if (idx < 0)
161+
idx = 0;
162+
return idx;
159163
}
160164

161165
extern int hpsb_disable_irm;

drivers/usb/core/inode.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
#include <linux/parser.h>
4040
#include <linux/notifier.h>
4141
#include <linux/seq_file.h>
42+
#include <linux/smp_lock.h>
4243
#include <asm/byteorder.h>
4344
#include "usb.h"
4445
#include "hcd.h"
@@ -265,9 +266,13 @@ static int remount(struct super_block *sb, int *flags, char *data)
265266
return -EINVAL;
266267
}
267268

269+
lock_kernel();
270+
268271
if (usbfs_mount && usbfs_mount->mnt_sb)
269272
update_sb(usbfs_mount->mnt_sb);
270273

274+
unlock_kernel();
275+
271276
return 0;
272277
}
273278

fs/adfs/adfs.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ struct adfs_dir_ops {
5353
int (*update)(struct adfs_dir *dir, struct object_info *obj);
5454
int (*create)(struct adfs_dir *dir, struct object_info *obj);
5555
int (*remove)(struct adfs_dir *dir, struct object_info *obj);
56+
int (*sync)(struct adfs_dir *dir);
5657
void (*free)(struct adfs_dir *dir);
5758
};
5859

@@ -90,7 +91,8 @@ extern const struct dentry_operations adfs_dentry_operations;
9091
extern struct adfs_dir_ops adfs_f_dir_ops;
9192
extern struct adfs_dir_ops adfs_fplus_dir_ops;
9293

93-
extern int adfs_dir_update(struct super_block *sb, struct object_info *obj);
94+
extern int adfs_dir_update(struct super_block *sb, struct object_info *obj,
95+
int wait);
9496

9597
/* file.c */
9698
extern const struct inode_operations adfs_file_inode_operations;

fs/adfs/dir.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ adfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
8383
}
8484

8585
int
86-
adfs_dir_update(struct super_block *sb, struct object_info *obj)
86+
adfs_dir_update(struct super_block *sb, struct object_info *obj, int wait)
8787
{
8888
int ret = -EINVAL;
8989
#ifdef CONFIG_ADFS_FS_RW
@@ -106,6 +106,12 @@ adfs_dir_update(struct super_block *sb, struct object_info *obj)
106106
ret = ops->update(&dir, obj);
107107
write_unlock(&adfs_dir_lock);
108108

109+
if (wait) {
110+
int err = ops->sync(&dir);
111+
if (!ret)
112+
ret = err;
113+
}
114+
109115
ops->free(&dir);
110116
out:
111117
#endif
@@ -199,7 +205,7 @@ const struct file_operations adfs_dir_operations = {
199205
.read = generic_read_dir,
200206
.llseek = generic_file_llseek,
201207
.readdir = adfs_readdir,
202-
.fsync = file_fsync,
208+
.fsync = simple_fsync,
203209
};
204210

205211
static int

fs/adfs/dir_f.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,6 +437,22 @@ adfs_f_update(struct adfs_dir *dir, struct object_info *obj)
437437
#endif
438438
}
439439

440+
static int
441+
adfs_f_sync(struct adfs_dir *dir)
442+
{
443+
int err = 0;
444+
int i;
445+
446+
for (i = dir->nr_buffers - 1; i >= 0; i--) {
447+
struct buffer_head *bh = dir->bh[i];
448+
sync_dirty_buffer(bh);
449+
if (buffer_req(bh) && !buffer_uptodate(bh))
450+
err = -EIO;
451+
}
452+
453+
return err;
454+
}
455+
440456
static void
441457
adfs_f_free(struct adfs_dir *dir)
442458
{
@@ -456,5 +472,6 @@ struct adfs_dir_ops adfs_f_dir_ops = {
456472
.setpos = adfs_f_setpos,
457473
.getnext = adfs_f_getnext,
458474
.update = adfs_f_update,
475+
.sync = adfs_f_sync,
459476
.free = adfs_f_free
460477
};

fs/adfs/dir_fplus.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,22 @@ adfs_fplus_getnext(struct adfs_dir *dir, struct object_info *obj)
161161
return ret;
162162
}
163163

164+
static int
165+
adfs_fplus_sync(struct adfs_dir *dir)
166+
{
167+
int err = 0;
168+
int i;
169+
170+
for (i = dir->nr_buffers - 1; i >= 0; i--) {
171+
struct buffer_head *bh = dir->bh[i];
172+
sync_dirty_buffer(bh);
173+
if (buffer_req(bh) && !buffer_uptodate(bh))
174+
err = -EIO;
175+
}
176+
177+
return err;
178+
}
179+
164180
static void
165181
adfs_fplus_free(struct adfs_dir *dir)
166182
{
@@ -175,5 +191,6 @@ struct adfs_dir_ops adfs_fplus_dir_ops = {
175191
.read = adfs_fplus_read,
176192
.setpos = adfs_fplus_setpos,
177193
.getnext = adfs_fplus_getnext,
194+
.sync = adfs_fplus_sync,
178195
.free = adfs_fplus_free
179196
};

fs/adfs/file.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const struct file_operations adfs_file_operations = {
3030
.read = do_sync_read,
3131
.aio_read = generic_file_aio_read,
3232
.mmap = generic_file_mmap,
33-
.fsync = file_fsync,
33+
.fsync = simple_fsync,
3434
.write = do_sync_write,
3535
.aio_write = generic_file_aio_write,
3636
.splice_read = generic_file_splice_read,

fs/adfs/inode.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -376,7 +376,7 @@ adfs_notify_change(struct dentry *dentry, struct iattr *attr)
376376
* The adfs-specific inode data has already been updated by
377377
* adfs_notify_change()
378378
*/
379-
int adfs_write_inode(struct inode *inode, int unused)
379+
int adfs_write_inode(struct inode *inode, int wait)
380380
{
381381
struct super_block *sb = inode->i_sb;
382382
struct object_info obj;
@@ -391,7 +391,7 @@ int adfs_write_inode(struct inode *inode, int unused)
391391
obj.attr = ADFS_I(inode)->attr;
392392
obj.size = inode->i_size;
393393

394-
ret = adfs_dir_update(sb, &obj);
394+
ret = adfs_dir_update(sb, &obj, wait);
395395
unlock_kernel();
396396
return ret;
397397
}

fs/adfs/map.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ static DEFINE_RWLOCK(adfs_map_lock);
6262
#define GET_FRAG_ID(_map,_start,_idmask) \
6363
({ \
6464
unsigned char *_m = _map + (_start >> 3); \
65-
u32 _frag = get_unaligned((u32 *)_m); \
65+
u32 _frag = get_unaligned_le32(_m); \
6666
_frag >>= (_start & 7); \
6767
_frag & _idmask; \
6868
})

fs/adfs/super.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,15 @@ static void adfs_put_super(struct super_block *sb)
132132
int i;
133133
struct adfs_sb_info *asb = ADFS_SB(sb);
134134

135+
lock_kernel();
136+
135137
for (i = 0; i < asb->s_map_size; i++)
136138
brelse(asb->s_map[i].dm_bh);
137139
kfree(asb->s_map);
138140
kfree(asb);
139141
sb->s_fs_info = NULL;
142+
143+
unlock_kernel();
140144
}
141145

142146
static int adfs_show_options(struct seq_file *seq, struct vfsmount *mnt)

fs/affs/affs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@ extern int affs_add_entry(struct inode *dir, struct inode *inode, struct dent
182182

183183
void affs_free_prealloc(struct inode *inode);
184184
extern void affs_truncate(struct inode *);
185+
int affs_file_fsync(struct file *, struct dentry *, int);
185186

186187
/* dir.c */
187188

fs/affs/dir.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ const struct file_operations affs_dir_operations = {
2121
.read = generic_read_dir,
2222
.llseek = generic_file_llseek,
2323
.readdir = affs_readdir,
24-
.fsync = file_fsync,
24+
.fsync = affs_file_fsync,
2525
};
2626

2727
/*

fs/affs/file.c

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const struct file_operations affs_file_operations = {
3434
.mmap = generic_file_mmap,
3535
.open = affs_file_open,
3636
.release = affs_file_release,
37-
.fsync = file_fsync,
37+
.fsync = affs_file_fsync,
3838
.splice_read = generic_file_splice_read,
3939
};
4040

@@ -915,3 +915,15 @@ affs_truncate(struct inode *inode)
915915
}
916916
affs_free_prealloc(inode);
917917
}
918+
919+
int affs_file_fsync(struct file *filp, struct dentry *dentry, int datasync)
920+
{
921+
struct inode * inode = dentry->d_inode;
922+
int ret, err;
923+
924+
ret = write_inode_now(inode, 0);
925+
err = sync_blockdev(inode->i_sb->s_bdev);
926+
if (!ret)
927+
ret = err;
928+
return ret;
929+
}

0 commit comments

Comments
 (0)