diff options
-rw-r--r-- | driver/device-mapper/dmfs-lv.c | 4 | ||||
-rw-r--r-- | driver/device-mapper/dmfs-table.c | 32 |
2 files changed, 28 insertions, 8 deletions
diff --git a/driver/device-mapper/dmfs-lv.c b/driver/device-mapper/dmfs-lv.c index fd5e43a61..716ec8c4f 100644 --- a/driver/device-mapper/dmfs-lv.c +++ b/driver/device-mapper/dmfs-lv.c @@ -53,10 +53,14 @@ struct dentry *dmfs_verify_name(struct inode *dir, const char *name) if (nd.dentry->d_parent->d_inode != dir) goto err_out; + err = -ENODATA; if (DMFS_I(nd.dentry->d_inode) == NULL || DMFS_I(nd.dentry->d_inode)->table == NULL) goto err_out; + if (!list_empty(&(DMFS_I(nd.dentry->d_inode)->table->errors))) + goto err_out; + dentry = nd.dentry; file.f_dentry = nd.dentry->d_parent; err = deny_write_access(&file); diff --git a/driver/device-mapper/dmfs-table.c b/driver/device-mapper/dmfs-table.c index 68b1d3899..65bb32b87 100644 --- a/driver/device-mapper/dmfs-table.c +++ b/driver/device-mapper/dmfs-table.c @@ -44,6 +44,8 @@ static void dmfs_parse_line(struct dm_table *t, unsigned num, char *str) int rv = 0; char *msg; + printk("dmfs_parse_line: (%s)\n", str); + msg = "No start argument"; tok = next_token(&p); if (!tok) @@ -101,13 +103,25 @@ static int dmfs_copy(char *dst, int dstlen, char *src, int srclen, int *flag) len--; } out: - return dst - start; + return (dst - start); end_of_line: + dst++; *flag = 1; - *dst++ = 0; goto out; } +static int dmfs_line_is_not_comment(char *str) +{ + while(*str) { + if (*str == '#') + break; + if (!isspace(*str)) + return 1; + str++; + } + return 0; +} + static int dmfs_parse_page(struct dm_table *t, char *buf, int end, unsigned long end_index, char *tmp, unsigned long *tmpl, int *num) { int copied; @@ -120,9 +134,11 @@ static int dmfs_parse_page(struct dm_table *t, char *buf, int end, unsigned long len -= copied; if (*tmpl + copied == PAGE_SIZE - 1) goto line_too_long; - *tmpl = copied; + (*tmpl) += copied; if (flag || (len == 0 && end)) { - dmfs_parse_line(t, *num, tmp); + *(tmp + *tmpl) = 0; + if (dmfs_line_is_not_comment(tmp)) + dmfs_parse_line(t, *num, tmp); (*num)++; *tmpl = 0; } @@ -186,11 +202,11 @@ static struct dm_table *dmfs_parse(struct inode *inode) } while(index <= end_index); free_page(page); - if (dm_table_complete(t) == 0) - return t; + if (list_empty(&t->errors)) { + dm_table_complete(t); + } - dm_table_destroy(t); - return NULL; + return t; broken: printk(KERN_ERR "dmfs_parse: Page not uptodate\n"); |