API for opening (and tracking) writable file descriptors per disk.
This commit is contained in:
parent
dfe5702c03
commit
994054cea6
@ -75,14 +75,12 @@ ssize_t
|
||||
bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size)
|
||||
{
|
||||
ssize_t cnt;
|
||||
int rofd;
|
||||
int rv;
|
||||
|
||||
ERROR(disk, NULL);
|
||||
|
||||
rofd = disk->d_fd;
|
||||
|
||||
disk->d_fd = open(disk->d_name, O_WRONLY);
|
||||
if (disk->d_fd < 0) {
|
||||
rv = ufs_disk_write(disk);
|
||||
if (rv == -1) {
|
||||
ERROR(disk, "failed to open disk for writing");
|
||||
return -1;
|
||||
}
|
||||
@ -93,8 +91,5 @@ bwrite(struct uufsd *disk, ufs2_daddr_t blockno, const void *data, size_t size)
|
||||
return -1;
|
||||
}
|
||||
|
||||
close(disk->d_fd);
|
||||
disk->d_fd = rofd;
|
||||
|
||||
return cnt;
|
||||
}
|
||||
|
@ -130,6 +130,7 @@ int ufs_disk_close(struct uufsd *);
|
||||
void ufs_disk_dtor(struct uufsd **);
|
||||
int ufs_disk_fillout(struct uufsd *, const char *);
|
||||
int ufs_disk_fillout_blank(struct uufsd *, const char *);
|
||||
int ufs_disk_write(struct uufsd *);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
|
@ -50,6 +50,8 @@ __FBSDID("$FreeBSD$");
|
||||
|
||||
/* Internally, track the 'name' value, it's ours. */
|
||||
#define MINE_NAME 0x01
|
||||
/* Track if its fd points to a writable device. */
|
||||
#define MINE_WRITE 0x02
|
||||
|
||||
struct uufsd *
|
||||
ufs_disk_ctor(const char *name)
|
||||
@ -175,3 +177,27 @@ again: if (stat(name, &st) < 0) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
ufs_disk_write(struct uufsd *disk)
|
||||
{
|
||||
int rofd;
|
||||
|
||||
ERROR(disk, NULL);
|
||||
|
||||
if (disk->d_mine & MINE_WRITE)
|
||||
return 0;
|
||||
|
||||
rofd = disk->d_fd;
|
||||
|
||||
disk->d_fd = open(disk->d_name, O_RDWR);
|
||||
if (disk->d_fd < 0) {
|
||||
ERROR(disk, "failed to open disk for writing");
|
||||
disk->d_fd = rofd;
|
||||
return -1;
|
||||
}
|
||||
|
||||
disk->d_mine |= MINE_WRITE;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user