bool is_invade(int h1, int m1, int h2, int m2, int h, int m) //判断改时间点是否被这件事占用 { if (is_later(h1, m1, h, m) && is_former(h2, m2, h, m)) return true; else return false; }
static int fscd_lookup(struct workspace_object_struct *object, struct userpolicy_struct *userpolicy, struct entry_struct *entry, char *path, struct fuse_entry_param *e) { int nreturn=-ENOENT; struct resource_struct *resource=object->resource; if (entry->inode) { struct entry_mountdata_struct *fscd_mountdata=NULL; logoutput("fscd_lookup: revalidate %s", entry->name); /* it's a revalidate */ copy_stat(&e->attr, &entry->inode->st); e->attr_timeout=3600; e->entry_timeout=3600; nreturn=0; /* lookup fscd_mountdata to watch the mount command */ fscd_mountdata=lookup_entry_mountdata(entry); if (! fscd_mountdata) { int res; /* no previous mount pending/mounted/failed */ fscd_mountdata=create_entry_mountdata(entry); if (fscd_mountdata) { fscd_mountdata->entry=entry; fscd_mountdata->workspace_mount=object->workspace_mount; fscd_mountdata->mountstatus=OBJECT_MOUNTSTATUS_UNMOUNTED; get_current_time(&fscd_mountdata->mounttime); } else { nreturn=-ENOMEM; } } if (fscd_mountdata) { /* only remount if at least some time ago */ if (fscd_mountdata->mountstatus==OBJECT_MOUNTSTATUS_FAILED) { struct timespec rightnow; get_current_time(&rightnow); if (is_later(&rightnow, &fscd_mountdata->mounttime, cdrom_options.fscd_remount_timeout_onerror, 0)==1) { /* remount */ fscd_mountdata->mountstatus=OBJECT_MOUNTSTATUS_UNMOUNTED; fscd_mountdata->mounttime.tv_sec=rightnow.tv_sec; fscd_mountdata->mounttime.tv_nsec=rightnow.tv_nsec; } } if (fscd_mountdata->mountstatus==OBJECT_MOUNTSTATUS_PENDING) { wait_for_mount(fscd_mountdata, cdrom_options.fscd_mount_timeout); } if (fscd_mountdata->mountstatus==OBJECT_MOUNTSTATUS_UNMOUNTED) { /* only mount when it's not mounted */ send_internal_message(INTERNALMESSAGE_TYPE_MOUNTOBJECT, (void *) object); } } } return nreturn; }