Comment 8 for bug 711549

Revision history for this message
PCMan (pcman-tw) wrote :

Why upstream udisks authors refuse integrating theses important patches?
Without them, udisks never works with some devices.
When you open a decice with O_EXECL and it's mounted, you'll get EBUSY error.
So when we get EBUSY, we check if it's mounted. If it is, we open it without O_EXECL.
Otherwise, that means other programs, such as cd burner, are using the device and we shouldn't touch it.
That's basically why is_mounted() is called here.

Personally, I think the correct way to integrate these two patches is like this:

 In the original patch, you can find this:

                } else if (errno == EBUSY && device->is_ide_cdrom) {
                        // TODO: check if media is mounted
                        // in that case mounting with O_EXCL should be safe
                        fd = open (device->dev_path, O_RDONLY | O_NONBLOCK);
                        if (fd != -1) {
                                poller_check_ide_cdrom (fd, device);
                                close (fd);
                        }
                 }

change it to:

                } else if (errno == EBUSY) { // no need to check for ide_cd here
+ /* From hal/hald/linux/addons/addon-storage.c: */
+ /* this means the disc is mounted or some other app,
+ * like a cd burner, has already opened O_EXCL */
+
+ /* HOWEVER, when starting hald, a disc may be
+ * mounted; so check /etc/mtab to see if it
+ * actually is mounted. If it is we retry to open
+ * without O_EXCL
+ */
+ if (is_mounted (device->dev_path))
+ {
+ fd = open (device->dev_path, O_RDONLY | O_NONBLOCK);
+ }
                        if (fd != -1 && device->is_ide_cdrom) { // only IDE cd needs this.
                                poller_check_ide_cdrom (fd, device);
                                close (fd);
                        }
                 }