return 0;
}
+int blkdev_issue_zeroout(struct block_device *bdev,
+ sector_t sector, sector_t nr_sects,
+ gfp_t gfp_mask, unsigned flags)
+{
+ /* Not yet implemented: */
+ BUG();
+}
+
unsigned bdev_logical_block_size(struct block_device *bdev)
{
struct stat statbuf;
else if (mode & FMODE_WRITE)
flags = O_WRONLY;
+ if (!(mode & FMODE_BUFFERED))
+ flags |= O_DIRECT;
+
#if 0
/* using O_EXCL doesn't work with opening twice for an O_SYNC fd: */
if (mode & FMODE_EXCL)
flags |= O_EXCL;
#endif
+ buffered_fd = open(path, flags & ~O_DIRECT);
+ if (buffered_fd < 0)
+ return ERR_PTR(-errno);
- fd = open(path, flags|O_DIRECT);
+ fd = open(path, flags);
if (fd < 0)
+ fd = dup(buffered_fd);
+ if (fd < 0) {
+ close(buffered_fd);
return ERR_PTR(-errno);
+ }
- sync_fd = xopen(path, flags|O_DIRECT|O_SYNC);
- buffered_fd = xopen(path, flags);
+ sync_fd = open(path, flags|O_SYNC);
+ if (sync_fd < 0)
+ sync_fd = open(path, (flags & ~O_DIRECT)|O_SYNC);
+ if (sync_fd < 0) {
+ close(fd);
+ close(buffered_fd);
+ return ERR_PTR(-errno);
+ }
bdev = malloc(sizeof(*bdev));
memset(bdev, 0, sizeof(*bdev));