diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-12-26 09:21:05 +0100 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-12-26 09:21:05 +0100 |
| commit | c656d9ca48d3ef1a11449e892ce488ee0bb5a335 (patch) | |
| tree | 0c5598659b3e7f12864d203967d42ac3feb1142c /fs/block_dev.c | |
| parent | 71ab6b245fda6e7597a667a67cce0d26c3c7a14b (diff) | |
| parent | a73ad3331fdbf4191cf99b83ea9ac7082b6757ba (diff) | |
| download | linux-c656d9ca48d3ef1a11449e892ce488ee0bb5a335.tar.gz linux-c656d9ca48d3ef1a11449e892ce488ee0bb5a335.zip | |
Merge branch 'x86/fpu' into x86/cleanups
Diffstat (limited to 'fs/block_dev.c')
| -rw-r--r-- | fs/block_dev.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/fs/block_dev.c b/fs/block_dev.c index db831efbdbbd..99e0ae1a4c78 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -1135,12 +1135,15 @@ static int blkdev_open(struct inode * inode, struct file * filp) if (res) return res; - if (!(filp->f_mode & FMODE_EXCL)) - return 0; + if (filp->f_mode & FMODE_EXCL) { + res = bd_claim(bdev, filp); + if (res) + goto out_blkdev_put; + } - if (!(res = bd_claim(bdev, filp))) - return 0; + return 0; + out_blkdev_put: blkdev_put(bdev, filp->f_mode); return res; } @@ -1203,8 +1206,16 @@ static long block_ioctl(struct file *file, unsigned cmd, unsigned long arg) { struct block_device *bdev = I_BDEV(file->f_mapping->host); fmode_t mode = file->f_mode; + + /* + * O_NDELAY can be altered using fcntl(.., F_SETFL, ..), so we have + * to updated it before every ioctl. + */ if (file->f_flags & O_NDELAY) - mode |= FMODE_NDELAY_NOW; + mode |= FMODE_NDELAY; + else + mode &= ~FMODE_NDELAY; + return blkdev_ioctl(bdev, mode, cmd, arg); } |
