On 06/22/2012 09:56 AM, FUJITA Tomonori wrote: > On Fri, 22 Jun 2012 08:32:16 +0200 > RedShift<redshift at pandora.be> wrote: > >> On 06/18/2012 03:21 PM, FUJITA Tomonori wrote: >>> On Mon, 18 Jun 2012 15:12:37 +0200 (CEST) >>> RedShift<redshift at telenet.be> wrote: >>> >>>> So the patch in the email posted above should work? Will try that ASAP. >>> >>> Not sure. Too many changes since then. The following patch can be >>> applied to the current git head. But not sure if it works. >>> *snip* >> >> >> It doesn't work. >> >> I use an LVM logical volume as backing-store to my iSCSI target. I started tgtd, connected my initiator and then proceeded with resizing my logical volume by adding 5 GB. Next, I rescanned the disks from disk management (I'm using Windows as initiator), however, no size changed occured nor does tgtd say so. >> >> I ran tgtd -f -d 1, and it says >> >> # tgtd -d 1 -f >> tgtd: setup_inotify(320) inotify ready, 0 >> >> >> But it never mentions "%s changed" >> >> >> I modified the patch so it would apply cleanly to 1.0.28, below > > The patch is corrupted. The tabs are converted to spaces. > > Can you resend an updated patch? > -- > To unsubscribe from this list: send the line "unsubscribe stgt" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > Sorry, I always write my code using spaces, didn't notice you used tabs. I replaced the spaces with tabs in this one: Only in fujita-tgt-5e053ca-with-resize/doc: htmlpages Only in fujita-tgt-5e053ca-with-resize/doc: manpages diff -r -u fujita-tgt-5e053ca/usr/bs.c fujita-tgt-5e053ca-with-resize/usr/bs.c --- fujita-tgt-5e053ca/usr/bs.c 2012-06-02 16:04:54.000000000 +0200 +++ fujita-tgt-5e053ca-with-resize/usr/bs.c 2012-06-21 20:03:19.059142000 +0200 @@ -32,6 +32,7 @@ #include <sys/types.h> #include <sys/epoll.h> #include <linux/types.h> +#include <sys/inotify.h> #include "list.h" #include "tgtd.h" @@ -304,6 +305,22 @@ return 1; } +extern void resize_detect(int fd, int events, void *data); + +void setup_inotify(void) +{ + int ret; + + inotify_fd = inotify_init1(IN_NONBLOCK); + if (inotify_fd < 0) + eprintf("lun size change detection is disabled\n"); + else { + ret = tgt_event_add(inotify_fd, EPOLLIN, + resize_detect, NULL); + eprintf("inotify ready, %d\n", ret); + } +} + int bs_init(void) { int ret; @@ -311,12 +328,14 @@ ret = bs_init_signalfd(); if (!ret) { eprintf("use signalfd notification\n"); + setup_inotify(); return 0; } ret = bs_init_notify_thread(); if (!ret) { eprintf("use pthread notification\n"); + setup_inotify(); return 0; } diff -r -u fujita-tgt-5e053ca/usr/bs_rdwr.c fujita-tgt-5e053ca-with-resize/usr/bs_rdwr.c --- fujita-tgt-5e053ca/usr/bs_rdwr.c 2012-06-02 16:04:54.000000000 +0200 +++ fujita-tgt-5e053ca-with-resize/usr/bs_rdwr.c 2012-06-21 20:04:42.105141000 +0200 @@ -33,6 +33,7 @@ #include <linux/fs.h> #include <sys/epoll.h> +#include <sys/inotify.h> #include "list.h" #include "util.h" @@ -269,6 +270,7 @@ static int bs_rdwr_open(struct scsi_lu *lu, char *path, int *fd, uint64_t *size) { uint32_t blksize = 0; + int ret; *fd = backed_file_open(path, O_RDWR|O_LARGEFILE|lu->bsoflags, size, &blksize); @@ -284,6 +286,17 @@ if (!lu->attrs.no_auto_lbppbe) update_lbppbe(lu, blksize); + if (inotify_fd > 0) { + ret = inotify_add_watch(inotify_fd, path, IN_CLOSE_WRITE); + if (ret < 0) + eprintf("can't check %s\n", path); + else { + eprintf("checking %s\n", path); + lu->notify_fd = ret; + } + } + + return 0; } diff -r -u fujita-tgt-5e053ca/usr/target.c fujita-tgt-5e053ca-with-resize/usr/target.c --- fujita-tgt-5e053ca/usr/target.c 2012-06-02 16:04:54.000000000 +0200 +++ fujita-tgt-5e053ca-with-resize/usr/target.c 2012-06-21 20:14:00.275112000 +0200 @@ -29,6 +29,7 @@ #include <unistd.h> #include <sys/socket.h> #include <sys/time.h> +#include <sys/inotify.h> #include "list.h" #include "util.h" @@ -41,6 +42,39 @@ #include "spc.h" static LIST_HEAD(device_type_list); +static LIST_HEAD(target_list); + +void resize_detect(int fd, int events, void *data) +{ + struct target *target; + struct scsi_lu *lu; + struct inotify_event e; + int ret; + + ret = read(fd, (char *)&e, sizeof(e)); + + eprintf("resize, %d\n", ret); + if (ret < 0) + return; + + list_for_each_entry(target, &target_list, target_siblings) { + list_for_each_entry(lu, &target->device_list, device_siblings) { + if (lu->notify_fd == e.wd) { + uint64_t size; + uint32_t blksize = 0; + int fd; + eprintf("%s changed\n", lu->path); + fd = backed_file_open(lu->path, O_RDONLY, &size, &blksize); + if (fd > 0) { + eprintf("new size %lld\n", (long long)size); + close(fd); + lu->size = size; + } else + eprintf("failed to open\n"); + } + } + } +} static struct target global_target; @@ -61,7 +95,7 @@ return NULL; } -static LIST_HEAD(target_list); + static struct target *target_lookup(int tid) { diff -r -u fujita-tgt-5e053ca/usr/tgtd.c fujita-tgt-5e053ca-with-resize/usr/tgtd.c --- fujita-tgt-5e053ca/usr/tgtd.c 2012-06-02 16:04:54.000000000 +0200 +++ fujita-tgt-5e053ca-with-resize/usr/tgtd.c 2012-06-21 20:08:03.391241000 +0200 @@ -45,6 +45,7 @@ unsigned long pagesize, pageshift; int system_active = 1; +int inotify_fd = -1; static int ep_fd; static char program_name[] = "tgtd"; static LIST_HEAD(tgt_events_list); diff -r -u fujita-tgt-5e053ca/usr/tgtd.h fujita-tgt-5e053ca-with-resize/usr/tgtd.h --- fujita-tgt-5e053ca/usr/tgtd.h 2012-06-02 16:04:54.000000000 +0200 +++ fujita-tgt-5e053ca-with-resize/usr/tgtd.h 2012-06-21 20:09:59.438105000 +0200 @@ -168,6 +168,7 @@ uint64_t size; uint64_t lun; char *path; + int notify_fd; int bsoflags; unsigned int blk_shift; @@ -226,6 +227,7 @@ extern int system_active; extern int is_debug; +extern int inotify_fd; extern int nr_iothreads; extern struct list_head bst_list; -- To unsubscribe from this list: send the line "unsubscribe stgt" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html |